diff --git a/apps/remixdesktop/test/lib/git.ts b/apps/remixdesktop/test/lib/git.ts index dc99ef1aa9..2a04570819 100644 --- a/apps/remixdesktop/test/lib/git.ts +++ b/apps/remixdesktop/test/lib/git.ts @@ -34,10 +34,10 @@ export async function getGitLog(path: string): Promise { }) } -export async function cloneOnServer(repo: string, path: string) { +export async function cloneOnServer(repo: string, path: string, name: string = 'bare') { console.log('cloning', repo, path) return new Promise((resolve, reject) => { - const git = spawn('rm -rf bare && git', ['clone', repo], { cwd: path, shell: true, detached: true }); + const git = spawn(`rm -rf ${name} && git`, ['clone', repo], { cwd: path, shell: true, detached: true }); git.stdout.on('data', function (data) { console.log('stdout data cloning', data.toString()); diff --git a/apps/remixdesktop/test/tests/app/git-ui_4.test.ts b/apps/remixdesktop/test/tests/app/git-ui_4.test.ts new file mode 100644 index 0000000000..00c2afa35e --- /dev/null +++ b/apps/remixdesktop/test/tests/app/git-ui_4.test.ts @@ -0,0 +1,189 @@ +import { ChildProcess, spawn } from "child_process" +import kill from 'tree-kill' +import { Nightwatch, NightwatchBrowser } from "nightwatch" +import { spawnGitServer, getGitLog, cloneOnServer, onLocalGitRepoAddFile, createCommitOnLocalServer, onLocalGitRepoPush, getBranches } from "../../lib/git" +let gitserver: ChildProcess + +/* +/ uses the git-http-backend package to create a git server ( if needed kill the server: kill -9 $(sudo lsof -t -i:6868) ) +/ GROUP 1: file operations PUSH PULL COMMIT SYNC FETCH CLONE ADD +/ GROUP 2: branch operations CREATE & PUBLISH +/ GROUP 3: file operations rename delete +*/ + +const tests = { + before: function (browser: NightwatchBrowser, done: VoidFunction) { + browser.hideToolTips() + done() + }, + after: function (browser: NightwatchBrowser) { + browser.perform((done) => { + console.log('kill server', gitserver.pid) + kill(gitserver.pid) + done() + }) + }, + + 'run server #group1 #group2 #group3': function (browser: NightwatchBrowser) { + browser.perform(async (done) => { + gitserver = await spawnGitServer('/tmp/') + console.log('working directory', process.cwd()) + done() + }) + }, + + 'clone a repo #group1 #group2 #group3': function (browser: NightwatchBrowser) { + browser + .clickLaunchIcon('dgit') + .pause(5000) + .waitForElementVisible('*[data-id="cloneButton"]') + .click('*[data-id="cloneButton"]') + .pause(1000) + .waitForElementVisible('[data-id="fileSystemModalDialogModalBody-react"]') + .click('[data-id="fileSystemModalDialogModalBody-react"]') + .waitForElementVisible('[data-id="modalDialogCustomPromptTextClone"]') + .setValue('*[data-id="modalDialogCustomPromptTextClone"]', 'http://localhost:6868/bare.git') + .click('[data-id="fileSystem-modal-footer-ok-react"]') + .pause(5000) + .windowHandles(function (result) { + console.log(result.value) + browser.switchWindow(result.value[1]) + .waitForElementVisible('*[data-id="treeViewLitreeViewItem.git"]') + .hideToolTips() + }) + .waitForElementVisible('*[data-id="treeViewLitreeViewItemREADME.md"]') + }, + 'Update settings for git #group1 #group2 #group3': function (browser: NightwatchBrowser) { + browser. + clickLaunchIcon('dgit') + .setValue('*[data-id="gitubUsername"]', 'git') + .setValue('*[data-id="githubEmail"]', 'git@example.com') + .click('*[data-id="saveGitHubCredentials"]') + .modalFooterOKClick('github-credentials-error') + + }, + + // GROUP 1 + + 'check file added #group1 #group3': function (browser: NightwatchBrowser) { + browser + .addFile('test.txt', { content: 'hello world' }, 'README.md') + .clickLaunchIcon('dgit') + .pause(1000) + .waitForElementVisible({ + selector: "//*[@data-status='new-untracked' and @data-file='/test.txt']", + locateStrategy: 'xpath' + }) + .waitForElementVisible('*[data-id="addToGitChangestest.txt"]') + .pause(1000) + .click('*[data-id="addToGitChangestest.txt"]') + .waitForElementVisible({ + selector: "//*[@data-status='added-staged' and @data-file='/test.txt']", + locateStrategy: 'xpath' + }) + .setValue('*[data-id="commitMessage"]', 'testcommit') + .click('*[data-id="commitButton"]') + }, + 'look at the commit #group1': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="commits-panel"]') + .waitForElementPresent({ + selector: '//*[@data-id="commit-summary-testcommit-ahead"]', + locateStrategy: 'xpath' + }) + }, + 'add second remote #group4': function (browser: NightwatchBrowser) { + browser + .pause(1000) + .click('*[data-id="remotes-panel"]') + .waitForElementVisible('*[data-id="add-manual-remoteurl"]') + .setValue('*[data-id="add-manual-remoteurl"]', 'http://localhost:6868/bare2.git') + .waitForElementVisible('*[data-id="add-manual-remotename"]') + .setValue('*[data-id="add-manual-remotename"]', 'origin2') + .waitForElementVisible('*[data-id="add-manual-remotebtn"]') + .click('*[data-id="add-manual-remotebtn"]') + }, + 'check the buttons #group4': function (browser: NightwatchBrowser) { + browser + .waitForElementVisible('*[data-id="default-remote-check-origin"]') + .waitForElementVisible('*[data-id="set-as-default-origin2"]') + }, + 'check the commands #group4': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="commands-panel"]') + .waitForElementVisible({ + selector: "//div[@id='commands-remote-origin-select']//div[contains(@class, 'singleValue') and contains(text(), 'origin')]", + locateStrategy: 'xpath' + }) + }, + 'switch to origin2 #group4': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="remotes-panel"]') + .waitForElementVisible('*[data-id="set-as-default-origin2"]') + .click('*[data-id="set-as-default-origin2"]') + }, + 'check the commands for origin2 #group4': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="commands-panel"]') + .waitForElementVisible({ + selector: "//div[@id='commands-remote-origin-select']//div[contains(@class, 'singleValue') and contains(text(), 'origin2')]", + locateStrategy: 'xpath' + }) + }, + 'sync the commit #group4': function (browser: NightwatchBrowser) { + browser + .pause(1000) + .waitForElementVisible('*[data-id="sourcecontrol-panel"]') + .click('*[data-id="sourcecontrol-panel"]') + .waitForElementVisible('*[data-id="syncButton"]') + .click('*[data-id="syncButton"]') + .waitForElementVisible('*[data-id="commitButton"]') + .click('*[data-id="commits-panel"]') + .waitForElementPresent({ + selector: '//*[@data-id="commit-summary-testcommit-"]', + locateStrategy: 'xpath' + }) + }, + 'check the log #group4': async function (browser: NightwatchBrowser) { + const logs = await getGitLog('/tmp/git/bare2.git') + console.log(logs) + browser.assert.ok(logs.includes('testcommit')) + const logs2 = await getGitLog('/tmp/git/bare.git') + console.log(logs2) + console.log(logs2.includes('testcommit3')) + browser.assert.ok(logs2.includes('testcommit3')) + }, + 'switch to origin #group4': function (browser: NightwatchBrowser) { + browser + .pause(5000) + .click('*[data-id="remotes-panel"]') + .waitForElementVisible('*[data-id="set-as-default-origin"]') + .click('*[data-id="set-as-default-origin"]') + }, + 'check the commands for origin #group4': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="commands-panel"]') + .waitForElementVisible({ + selector: "//div[@id='commands-remote-origin-select']//div[contains(@class, 'singleValue') and contains(text(), 'origin')]", + locateStrategy: 'xpath' + }) + }, + 'check the commit ahead #group4': function (browser: NightwatchBrowser) { + browser + .pause(1000) + .waitForElementVisible('*[data-id="sourcecontrol-panel"]') + .click('*[data-id="sourcecontrol-panel"]') + .waitForElementVisible('*[data-id="syncButton"]') + // do not sync + .click('*[data-id="commits-panel"]') + .waitForElementPresent({ + selector: '//*[@data-id="commit-summary-testcommit-ahead"]', + locateStrategy: 'xpath' + }) + }, +} + +const useIsoGit = process.argv.includes('--useIsoGit'); +module.exports = { + ...process.platform.startsWith('linux') || useIsoGit ? tests : {} +} \ No newline at end of file