From 50603acd1c30b11359e08cd46d01ea5e9c9f2e19 Mon Sep 17 00:00:00 2001 From: rosen-vladimirov Date: Wed, 5 Dec 2018 00:09:13 +0200 Subject: [PATCH] feat: expose isShared property from projectData Expose `isShared` property from projectData, so it will be possible to check if a project is code-sharing when using CLI as a library. Use the new property in the Analytics service as well. Add tests. --- lib/definitions/project.d.ts | 5 ++ lib/project-data.ts | 5 +- lib/services/analytics/analytics-service.ts | 3 +- test/project-data.ts | 75 +++++++++++++++----- test/services/analytics/analytics-service.ts | 3 +- test/stubs.ts | 1 + 6 files changed, 70 insertions(+), 22 deletions(-) diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index d7a2aac13d..859fd352e3 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -92,6 +92,11 @@ interface IProjectData extends ICreateProjectData { gradleFilesDirectoryPath: string; infoPlistPath: string; buildXcconfigPath: string; + /** + * Defines if the project is a code sharing one. + * Value is true when project has nsconfig.json and it has `shared: true` in it. + */ + isShared: boolean; /** * Initializes project data with the given project directory. If none supplied defaults to --path option or cwd. diff --git a/lib/project-data.ts b/lib/project-data.ts index 58aa01a03a..3e2fc860c1 100644 --- a/lib/project-data.ts +++ b/lib/project-data.ts @@ -59,6 +59,7 @@ export class ProjectData implements IProjectData { public appGradlePath: string; public gradleFilesDirectoryPath: string; public buildXcconfigPath: string; + public isShared: boolean; constructor(private $fs: IFileSystem, private $errors: IErrors, @@ -131,7 +132,7 @@ export class ProjectData implements IProjectData { this.appGradlePath = path.join(this.gradleFilesDirectoryPath, constants.APP_GRADLE_FILE_NAME); this.infoPlistPath = path.join(this.appResourcesDirectoryPath, this.$devicePlatformsConstants.iOS, constants.INFO_PLIST_FILE_NAME); this.buildXcconfigPath = path.join(this.appResourcesDirectoryPath, this.$devicePlatformsConstants.iOS, constants.BUILD_XCCONFIG_FILE_NAME); - + this.isShared = !!(this.nsConfig && this.nsConfig.shared); return; } @@ -202,7 +203,7 @@ export class ProjectData implements IProjectData { } public getNsConfigRelativePath(): string { - return constants.CONFIG_NS_FILE_NAME; + return constants.CONFIG_NS_FILE_NAME; } private resolveToProjectDir(pathToResolve: string, projectDir?: string): string { diff --git a/lib/services/analytics/analytics-service.ts b/lib/services/analytics/analytics-service.ts index 82e4fb1da6..fcd429baa3 100644 --- a/lib/services/analytics/analytics-service.ts +++ b/lib/services/analytics/analytics-service.ts @@ -146,8 +146,7 @@ export class AnalyticsService implements IAnalyticsService, IDisposable { if (projectDir) { const projectData = this.$projectDataService.getProjectData(projectDir); customDimensions[GoogleAnalyticsCustomDimensions.projectType] = projectData.projectType; - const isShared = !!(projectData.nsConfig && projectData.nsConfig.shared); - customDimensions[GoogleAnalyticsCustomDimensions.isShared] = isShared.toString(); + customDimensions[GoogleAnalyticsCustomDimensions.isShared] = projectData.isShared.toString(); } return customDimensions; diff --git a/test/project-data.ts b/test/project-data.ts index 956a107efa..e420ae99ff 100644 --- a/test/project-data.ts +++ b/test/project-data.ts @@ -42,26 +42,45 @@ describe("projectData", () => { return testInjector; }; + const prepareTest = (opts?: { packageJsonData?: { dependencies?: IStringDictionary, devDependencies: IStringDictionary }, nsconfigData?: { shared: boolean } }): IProjectData => { + const testInjector = createTestInjector(); + const fs = testInjector.resolve("fs"); + fs.exists = (filePath: string) => filePath && (path.basename(filePath) === "package.json" || (path.basename(filePath) === "nsconfig.json" && opts && opts.nsconfigData)); + + fs.readText = (filePath: string) => { + if (path.basename(filePath) === "package.json") { + return JSON.stringify({ + nativescript: { + id: "com.test.testid" + }, + dependencies: opts && opts.packageJsonData && opts.packageJsonData.dependencies, + devDependencies: opts && opts.packageJsonData && opts.packageJsonData.devDependencies + }); + } else if (path.basename(filePath) === "nsconfig.json" && opts && opts.nsconfigData) { + return JSON.stringify(opts.nsconfigData); + } + + return null; + }; + + const projectHelper: IProjectHelper = testInjector.resolve("projectHelper"); + projectHelper.projectDir = "projectDir"; + + const projectData: IProjectData = testInjector.resolve("projectData"); + projectData.initializeProjectData(); + + return projectData; + }; + describe("projectType", () => { const assertProjectType = (dependencies: any, devDependencies: any, expectedProjecType: string) => { - const testInjector = createTestInjector(); - const fs = testInjector.resolve("fs"); - fs.exists = (filePath: string) => filePath && path.basename(filePath) === "package.json"; - - fs.readText = () => (JSON.stringify({ - nativescript: { - id: "com.test.testid" - }, - dependencies: dependencies, - devDependencies: devDependencies - })); - - const projectHelper: IProjectHelper = testInjector.resolve("projectHelper"); - projectHelper.projectDir = "projectDir"; - - const projectData: IProjectData = testInjector.resolve("projectData"); - projectData.initializeProjectData(); + const projectData = prepareTest({ + packageJsonData: { + dependencies, + devDependencies + } + }); assert.deepEqual(projectData.projectType, expectedProjecType); }; @@ -93,4 +112,26 @@ describe("projectData", () => { assertProjectType(null, null, "Pure JavaScript"); }); }); + + describe("isShared", () => { + it("is false when nsconfig.json does not exist", () => { + const projectData = prepareTest(); + assert.isFalse(projectData.isShared); + }); + + it("is false when nsconfig.json exists, but shared value is not populated", () => { + const projectData = prepareTest({ nsconfigData: { shared: undefined } }); + assert.isFalse(projectData.isShared); + }); + + it("is false when nsconfig.json exists and shared value is false", () => { + const projectData = prepareTest({ nsconfigData: { shared: false } }); + assert.isFalse(projectData.isShared); + }); + + it("is true when nsconfig.json exists and shared value is true", () => { + const projectData = prepareTest({ nsconfigData: { shared: true } }); + assert.isTrue(projectData.isShared); + }); + }); }); diff --git a/test/services/analytics/analytics-service.ts b/test/services/analytics/analytics-service.ts index fccf54535e..ed626f64dc 100644 --- a/test/services/analytics/analytics-service.ts +++ b/test/services/analytics/analytics-service.ts @@ -42,7 +42,8 @@ const createTestInjector = (opts?: { projectHelperErrorMsg?: string, projectDir? testInjector.register("projectDataService", { getProjectData: (projectDir?: string): IProjectData => { return { - projectType: sampleProjectType + projectType: sampleProjectType, + isShared: false }; } }); diff --git a/test/stubs.ts b/test/stubs.ts index 93b9deeefa..dc02ec8d73 100644 --- a/test/stubs.ts +++ b/test/stubs.ts @@ -323,6 +323,7 @@ export class ProjectDataStub implements IProjectData { public appGradlePath: string; public gradleFilesDirectoryPath: string; public buildXcconfigPath: string; + public isShared: boolean; public initializeProjectData(projectDir?: string): void { this.projectDir = this.projectDir || projectDir;