From 67f41ae104aee287322bfb02ad9e223c495ae648 Mon Sep 17 00:00:00 2001 From: rosen-vladimirov Date: Mon, 14 May 2018 14:47:03 +0300 Subject: [PATCH] fix(API): isValidNativeScriptProject returns incorrect result In case CLI is used as a library and `isValidNativeScriptProject` is called multiple times, it does not return correct results after the first time. The problem is that it uses the singleton object - projectData. Change the implementation to use projectDataService, this way the method will always return correc results. --- lib/services/project-service.ts | 5 ++- test/project-service.ts | 65 +++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/lib/services/project-service.ts b/lib/services/project-service.ts index 2a92ea0a0c..0e4146efed 100644 --- a/lib/services/project-service.ts +++ b/lib/services/project-service.ts @@ -80,8 +80,9 @@ export class ProjectService implements IProjectService { @exported("projectService") public isValidNativeScriptProject(pathToProject?: string): boolean { try { - this.$projectData.initializeProjectData(pathToProject); - return !!this.$projectData.projectDir && !!this.$projectData.projectId; + const projectData = this.$projectDataService.getProjectData(pathToProject); + + return !!projectData && !!projectData.projectDir && !!projectData.projectId; } catch (e) { return false; } diff --git a/test/project-service.ts b/test/project-service.ts index 3b54318e80..8b756ed935 100644 --- a/test/project-service.ts +++ b/test/project-service.ts @@ -420,13 +420,16 @@ describe("Project Service Tests", () => { }); describe("isValidNativeScriptProject", () => { - const getTestInjector = (): IInjector => { + const getTestInjector = (projectData?: any): IInjector => { const testInjector = new yok.Yok(); testInjector.register("npm", {}); testInjector.register("errors", {}); testInjector.register("fs", {}); testInjector.register("logger", {}); - testInjector.register("projectDataService", {}); + testInjector.register("projectDataService", { + getProjectData: (projectDir?: string): IProjectData => projectData + }); + testInjector.register("projectData", {}); testInjector.register("projectNameService", {}); testInjector.register("projectTemplatesService", {}); testInjector.register("staticConfig", {}); @@ -437,44 +440,66 @@ describe("Project Service Tests", () => { return testInjector; }; - it("returns true when initialize project data does not throw, projectDir and projectId are valid", () => { - const testInjector = getTestInjector(); - testInjector.register("projectData", { + it("returns true when getProjectData does not throw, projectDir and projectId are valid", () => { + const testInjector = getTestInjector({ projectDir: "projectDir", - projectId: "projectId", - initializeProjectData: (): void => undefined + projectId: "projectId" }); const projectService: IProjectService = testInjector.resolve(ProjectServiceLib.ProjectService); assert.isTrue(projectService.isValidNativeScriptProject("some-dir")); }); - it("returns false when initialize project data throws", () => { + it("returns correct data when multiple calls are executed", () => { const testInjector = getTestInjector(); - testInjector.register("projectData", { - initializeProjectData: (): void => { throw new Error("err"); } + const projectDataService = testInjector.resolve("projectDataService"); + const projectData: any = { + projectDir: "projectDir", + projectId: "projectId" + }; + + let returnedProjectData: any = null; + projectDataService.getProjectData = (projectDir?: string): IProjectData => { + projectData.projectDir = projectDir; + returnedProjectData = projectData; + return returnedProjectData; + }; + + const projectService: IProjectService = testInjector.resolve(ProjectServiceLib.ProjectService); + assert.isTrue(projectService.isValidNativeScriptProject("some-dir")); + assert.equal(returnedProjectData.projectDir, "some-dir"); + assert.isTrue(projectService.isValidNativeScriptProject("some-dir-2")); + assert.equal(returnedProjectData.projectDir, "some-dir-2"); + + projectDataService.getProjectData = (projectDir?: string): IProjectData => { + throw new Error("Err"); + }; + + assert.isFalse(projectService.isValidNativeScriptProject("some-dir-2")); + }); + + it("returns false when getProjectData throws", () => { + const testInjector = getTestInjector(null); + testInjector.register("projectDataService", { + getProjectData: (): void => { throw new Error("err"); } }); const projectService: IProjectService = testInjector.resolve(ProjectServiceLib.ProjectService); assert.isFalse(projectService.isValidNativeScriptProject("some-dir")); }); - it("returns false when initializeProjectData does not throw, but there's no projectDir set", () => { - const testInjector = getTestInjector(); - testInjector.register("projectData", { - projectId: "projectId", - initializeProjectData: (): void => undefined + it("returns false when getProjectData does not throw, but there's no projectDir set", () => { + const testInjector = getTestInjector({ + projectId: "projectId" }); const projectService: IProjectService = testInjector.resolve(ProjectServiceLib.ProjectService); assert.isFalse(projectService.isValidNativeScriptProject("some-dir")); }); - it("returns false when initializeProjectData does not throw, but there's no projectId set", () => { - const testInjector = getTestInjector(); - testInjector.register("projectData", { - projectDir: "projectDir", - initializeProjectData: (): void => undefined + it("returns false when getProjectData does not throw, but there's no projectId set", () => { + const testInjector = getTestInjector({ + projectDir: "projectDir" }); const projectService: IProjectService = testInjector.resolve(ProjectServiceLib.ProjectService);