From c6758dc8f77d171c18e15b59ec92fcb4c2988f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barth=C3=A9l=C3=A9my=20Ledoux?= Date: Mon, 27 Sep 2021 11:50:55 -0500 Subject: [PATCH] fix: set projectId in a custom config file (#18240) --- .../desktop-gui/cypress/fixtures/config.json | 1 + .../cypress/integration/settings_spec.js | 8 +++---- .../cypress/integration/setup_project_spec.js | 7 ++++++- .../dashboard-projects-api.js | 4 ++-- .../desktop-gui/src/runs/setup-project.jsx | 5 ++++- packages/server/lib/gui/events.js | 2 +- packages/server/lib/project_static.ts | 21 ++++++++++++++----- packages/server/test/unit/gui/events_spec.js | 12 +++++------ packages/server/test/unit/project_spec.js | 15 ++++++------- 9 files changed, 48 insertions(+), 27 deletions(-) diff --git a/packages/desktop-gui/cypress/fixtures/config.json b/packages/desktop-gui/cypress/fixtures/config.json index de37a288517f..91fe1742a429 100644 --- a/packages/desktop-gui/cypress/fixtures/config.json +++ b/packages/desktop-gui/cypress/fixtures/config.json @@ -147,6 +147,7 @@ "requestTimeout": 5000, "resolvedNodePath": null, "resolvedNodeVersion": "1.2.3", + "configFile": "cypress.json", "hosts": { "*.foobar.com": "127.0.0.1" }, diff --git a/packages/desktop-gui/cypress/integration/settings_spec.js b/packages/desktop-gui/cypress/integration/settings_spec.js index 6891dbea6812..2e53beef9c2d 100644 --- a/packages/desktop-gui/cypress/integration/settings_spec.js +++ b/packages/desktop-gui/cypress/integration/settings_spec.js @@ -326,9 +326,9 @@ describe('Settings', () => { context('when configFile is false', () => { beforeEach(function () { - this.openProject.resolve(Cypress._.assign({ + this.openProject.resolve(Cypress._.assign(this.config, { configFile: false, - }, this.config)) + })) this.goToSettings() @@ -342,9 +342,9 @@ describe('Settings', () => { context('when configFile is set', function () { beforeEach(function () { - this.openProject.resolve(Cypress._.assign({ + this.openProject.resolve(Cypress._.assign(this.config, { configFile: 'special-cypress.json', - }, this.config)) + })) this.goToSettings() diff --git a/packages/desktop-gui/cypress/integration/setup_project_spec.js b/packages/desktop-gui/cypress/integration/setup_project_spec.js index dd64beec60ac..debe728add18 100644 --- a/packages/desktop-gui/cypress/integration/setup_project_spec.js +++ b/packages/desktop-gui/cypress/integration/setup_project_spec.js @@ -8,6 +8,7 @@ const onSubmitNewProject = function (orgId) { projectName: this.config.projectName, orgId, public: false, + configFile: 'cypress.json', }) }) }) @@ -25,6 +26,7 @@ const onSubmitNewProject = function (orgId) { projectRoot: '/foo/bar', orgId, public: true, + configFile: 'cypress.json', }) }) }) @@ -487,7 +489,10 @@ describe('Connect to Dashboard', function () { cy.get('.setup-project') .contains('.btn', 'Set up project').click() .then(() => { - expect(this.ipc.setProjectId).to.be.calledWith({ id: this.dashboardProjects[1].id, projectRoot: '/foo/bar' }) + expect(this.ipc.setProjectId).to.be.calledWith({ + id: this.dashboardProjects[1].id, + projectRoot: '/foo/bar', + configFile: 'cypress.json' }) }) }) diff --git a/packages/desktop-gui/src/dashboard-projects/dashboard-projects-api.js b/packages/desktop-gui/src/dashboard-projects/dashboard-projects-api.js index 42d6534ec190..bf581c7aaef5 100644 --- a/packages/desktop-gui/src/dashboard-projects/dashboard-projects-api.js +++ b/packages/desktop-gui/src/dashboard-projects/dashboard-projects-api.js @@ -45,8 +45,8 @@ const setupDashboardProject = (projectDetails) => { .catch(ipc.isUnauthed, ipc.handleUnauthed) } -const setProjectId = (id, projectRoot) => { - return ipc.setProjectId({ id, projectRoot }) +const setProjectId = (id, projectRoot, configFile) => { + return ipc.setProjectId({ id, projectRoot, configFile }) } export default { diff --git a/packages/desktop-gui/src/runs/setup-project.jsx b/packages/desktop-gui/src/runs/setup-project.jsx index 3f9db844f857..ec0958a9337b 100644 --- a/packages/desktop-gui/src/runs/setup-project.jsx +++ b/packages/desktop-gui/src/runs/setup-project.jsx @@ -378,10 +378,13 @@ class SetupProject extends Component { projectRoot: this.props.project.path, orgId: this.state.selectedOrgId, public: this.state.public, + configFile: this.props.project.configFile, }) } - return dashboardProjectsApi.setProjectId(this.state.selectedProjectId, this.props.project.path) + return dashboardProjectsApi.setProjectId(this.state.selectedProjectId, + this.props.project.path, + this.props.project.configFile) .then((id) => { const project = dashboardProjectsStore.getProjectById(id) diff --git a/packages/server/lib/gui/events.js b/packages/server/lib/gui/events.js index 6b48eda6fbbb..25d006069129 100644 --- a/packages/server/lib/gui/events.js +++ b/packages/server/lib/gui/events.js @@ -337,7 +337,7 @@ const handleEvent = function (options, bus, event, id, type, arg) { .catch(sendErr) case 'set:project:id': - return ProjectStatic.writeProjectId(arg.id, arg.projectRoot) + return ProjectStatic.writeProjectId(arg) .then(send) .catch(sendErr) diff --git a/packages/server/lib/project_static.ts b/packages/server/lib/project_static.ts index 4768d913a303..c27b89c8cb86 100644 --- a/packages/server/lib/project_static.ts +++ b/packages/server/lib/project_static.ts @@ -162,7 +162,13 @@ export function ensureExists (path, options) { return settings.exists(path, options) } -export async function writeProjectId (id: string, projectRoot: string) { +interface ProjectIdOptions{ + id: string + projectRoot: string + configFile: string +} + +export async function writeProjectId ({ id, projectRoot, configFile }: ProjectIdOptions) { const attrs = { projectId: id } logger.info('Writing Project ID', _.clone(attrs)) @@ -170,7 +176,7 @@ export async function writeProjectId (id: string, projectRoot: string) { // TODO: We need to set this // this.generatedProjectIdTimestamp = new Date() - await settings.write(projectRoot, attrs) + await settings.write(projectRoot, attrs, { configFile }) return id } @@ -180,10 +186,11 @@ interface ProjectDetails { projectRoot: string orgId: string | null public: boolean + configFile: string } -export async function createCiProject (projectDetails: ProjectDetails, projectRoot: string) { - debug('create CI project with projectDetails %o projectRoot %s', projectDetails, projectRoot) +export async function createCiProject ({ projectRoot, configFile, ...projectDetails }: ProjectDetails) { + debug('create CI project with projectDetails %o projectRoot %s', projectDetails) const authToken = await user.ensureAuthToken() const remoteOrigin = await commitInfo.getRemoteOrigin(projectRoot) @@ -195,7 +202,11 @@ export async function createCiProject (projectDetails: ProjectDetails, projectRo const newProject = await api.createProject(projectDetails, remoteOrigin, authToken) - await writeProjectId(newProject.id, projectRoot) + await writeProjectId({ + configFile, + projectRoot, + id: newProject.id, + }) return newProject } diff --git a/packages/server/test/unit/gui/events_spec.js b/packages/server/test/unit/gui/events_spec.js index e64cfaadd246..85a391bff343 100644 --- a/packages/server/test/unit/gui/events_spec.js +++ b/packages/server/test/unit/gui/events_spec.js @@ -926,12 +926,12 @@ describe('lib/gui/events', () => { describe('set:project:id', () => { it('calls writeProjectId with projectRoot', function () { - const arg = { id: '1', projectRoot: '/project/root/' } - const stub = sinon.stub(ProjectStatic, 'writeProjectId').resolves() + const arg = { id: '1', projectRoot: '/project/root/', configFile: 'cypress.json' } + const stubWriteProjectId = sinon.stub(ProjectStatic, 'writeProjectId').resolves() return this.handleEvent('set:project:id', arg) .then(() => { - expect(stub).to.be.calledWith(arg.id, arg.projectRoot) + expect(stubWriteProjectId).to.be.calledWith(arg) expect(this.send.firstCall.args[0]).to.eq('response') expect(this.send.firstCall.args[1].id).to.match(/set:project:id-/) }) @@ -940,12 +940,12 @@ describe('lib/gui/events', () => { describe('setup:dashboard:project', () => { it('returns result of ProjectStatic.createCiProject', function () { - const arg = { projectRoot: '/project/root/' } - const stub = sinon.stub(ProjectStatic, 'createCiProject').resolves() + const arg = { projectRoot: '/project/root/', configFile: 'cypress.json' } + const stubCreateCiProject = sinon.stub(ProjectStatic, 'createCiProject').resolves() return this.handleEvent('setup:dashboard:project', arg) .then(() => { - expect(stub).to.be.calledWith(arg, arg.projectRoot) + expect(stubCreateCiProject).to.be.calledWith(arg) expect(this.send.firstCall.args[0]).to.eq('response') expect(this.send.firstCall.args[1].id).to.match(/setup:dashboard:project-/) }) diff --git a/packages/server/test/unit/project_spec.js b/packages/server/test/unit/project_spec.js index 2fd5e5244d84..1f350b601297 100644 --- a/packages/server/test/unit/project_spec.js +++ b/packages/server/test/unit/project_spec.js @@ -948,14 +948,14 @@ This option will not have an effect in Some-other-name. Tests that rely on web s }) it('calls Settings.write with projectRoot and attrs', function () { - return writeProjectId('id-123').then((id) => { + return writeProjectId({ id: 'id-123' }).then((id) => { expect(id).to.eq('id-123') }) }) // TODO: This xit('sets generatedProjectIdTimestamp', function () { - return writeProjectId('id-123').then(() => { + return writeProjectId({ id: 'id-123' }).then(() => { expect(this.project.generatedProjectIdTimestamp).to.be.a('date') }) }) @@ -1016,13 +1016,14 @@ This option will not have an effect in Some-other-name. Tests that rely on web s context('#createCiProject', () => { const projectRoot = '/_test-output/path/to/project-e2e' + const configFile = 'cypress.config.js' beforeEach(function () { this.project = new ProjectBase({ projectRoot, testingType: 'e2e' }) this.newProject = { id: 'project-id-123' } sinon.stub(user, 'ensureAuthToken').resolves('auth-token-123') - sinon.stub(settings, 'write').resolves('project-id-123') + sinon.stub(settings, 'write').resolves() sinon.stub(commitInfo, 'getRemoteOrigin').resolves('remoteOrigin') sinon.stub(api, 'createProject') .withArgs({ foo: 'bar' }, 'remoteOrigin', 'auth-token-123') @@ -1030,19 +1031,19 @@ This option will not have an effect in Some-other-name. Tests that rely on web s }) it('calls api.createProject with user session', function () { - return createCiProject({ foo: 'bar' }, projectRoot).then(() => { + return createCiProject({ foo: 'bar', projectRoot }).then(() => { expect(api.createProject).to.be.calledWith({ foo: 'bar' }, 'remoteOrigin', 'auth-token-123') }) }) it('calls writeProjectId with id', function () { - return createCiProject({ foo: 'bar' }, projectRoot).then(() => { - expect(settings.write).to.be.calledWith(projectRoot, { projectId: 'project-id-123' }) + return createCiProject({ foo: 'bar', projectRoot, configFile }).then(() => { + expect(settings.write).to.be.calledWith(projectRoot, { projectId: 'project-id-123' }, { configFile }) }) }) it('returns project id', function () { - return createCiProject({ foo: 'bar' }, projectRoot).then((projectId) => { + return createCiProject({ foo: 'bar', projectRoot }).then((projectId) => { expect(projectId).to.eql(this.newProject) }) })