Skip to content

Commit 7513ad6

Browse files
Fatme Havaluovarosen-vladimirov
Fatme Havaluova
authored andcommitted
Unit tests
1 parent 32d168a commit 7513ad6

File tree

5 files changed

+92
-51
lines changed

5 files changed

+92
-51
lines changed

lib/services/platform-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export class PlatformService implements IPlatformService {
185185
// Process node_modules folder
186186
this.$pluginsService.ensureAllDependenciesAreInstalled().wait();
187187
var tnsModulesDestinationPath = path.join(platformData.appDestinationDirectoryPath, constants.APP_FOLDER_NAME, PlatformService.TNS_MODULES_FOLDER_NAME);
188-
this.$broccoliBuilder.prepareNodeModules(tnsModulesDestinationPath, this.$projectData.projectDir, lastModifiedTime).wait();
188+
this.$broccoliBuilder.prepareNodeModules(tnsModulesDestinationPath, this.$projectData.projectDir, platform, lastModifiedTime).wait();
189189

190190
this.$logger.out("Project successfully prepared");
191191
}).future<void>()();

lib/tools/broccoli/broccoli.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ interface BroccoliNode {
152152
}
153153

154154
interface IBroccoliBuilder {
155-
prepareNodeModules(outputPath: string, projectDir: string, lastModifiedTime?: Date): IFuture<void>;
155+
prepareNodeModules(outputPath: string, projectDir: string, platform: string, lastModifiedTime?: Date): IFuture<void>;
156156
}
157157

158158
interface IDiffResult {
@@ -162,7 +162,7 @@ interface IDiffResult {
162162

163163
interface IBroccoliPlugin {
164164
rebuild(diff: IDiffResult): any;
165-
rebuildChangedDirectories?(changedDirectories: string[]): void;
165+
rebuildChangedDirectories?(changedDirectories: string[], platform: string): void;
166166
cleanup? () : void;
167167
}
168168

lib/tools/broccoli/builder.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class Builder implements IBroccoliBuilder {
2020
private $injector: IInjector,
2121
private $logger: ILogger) { }
2222

23-
public prepareNodeModules(absoluteOutputPath: string, projectDir: string, lastModifiedTime?: Date): IFuture<void> {
23+
public prepareNodeModules(absoluteOutputPath: string, projectDir: string, platform: string, lastModifiedTime?: Date): IFuture<void> {
2424
return (() => {
2525
let isNodeModulesModified = false;
2626
let nodeModulesPath = path.join(projectDir, "node_modules");
@@ -75,7 +75,8 @@ export class Builder implements IBroccoliBuilder {
7575
inputPath: projectDir,
7676
cachePath: "",
7777
outputRoot: absoluteOutputPath,
78-
projectDir: projectDir
78+
projectDir: projectDir,
79+
platform: platform
7980
});
8081

8182
destCopy.rebuildChangedDirectories(_.keys(this.nodeModules));

lib/tools/broccoli/node-modules-dest-copy.ts

+43-35
Original file line numberDiff line numberDiff line change
@@ -17,63 +17,68 @@ export class DestCopy implements IBroccoliPlugin {
1717
private dependencies: IDictionary<any> = null;
1818
private devDependencies: IDictionary<any> = null;
1919

20-
constructor(private inputPath: string, private cachePath: string, private outputRoot: string, private projectDir: string) {
20+
constructor(private inputPath: string,
21+
private cachePath: string,
22+
private outputRoot: string,
23+
private projectDir: string,
24+
private platform: string,
25+
private $fs: IFileSystem,
26+
private $projectFilesManager: IProjectFilesManager) {
2127
this.dependencies = Object.create(null);
2228
this.devDependencies = this.getDevDependencies(projectDir);
2329
}
2430

25-
public rebuildChangedDirectories(changedDirectories: string[]): void {
31+
public rebuildChangedDirectories(changedDirectories: string[], platform: string): void {
2632
_.each(changedDirectories, changedDirectoryAbsolutePath => {
2733
let pathToPackageJson = path.join(changedDirectoryAbsolutePath, "package.json");
28-
if(fs.existsSync(pathToPackageJson)) {
29-
let packageJsonFiles = [pathToPackageJson];
30-
let nodeModulesFolderPath = path.join(changedDirectoryAbsolutePath, "node_modules");
31-
packageJsonFiles = packageJsonFiles.concat(this.enumeratePackageJsonFilesSync(nodeModulesFolderPath));
34+
let packageJsonFiles = fs.existsSync(pathToPackageJson) ? [pathToPackageJson] : [];
35+
let nodeModulesFolderPath = path.join(changedDirectoryAbsolutePath, "node_modules");
36+
packageJsonFiles = packageJsonFiles.concat(this.enumeratePackageJsonFilesSync(nodeModulesFolderPath));
37+
38+
_.each(packageJsonFiles, packageJsonFilePath => {
39+
let fileContent = require(packageJsonFilePath);
40+
let isPlugin = fileContent.nativescript;
41+
42+
if(!this.devDependencies[fileContent.name]) { // Don't flatten dev dependencies
43+
44+
let currentDependency = {
45+
name: fileContent.name,
46+
version: fileContent.version,
47+
directory: path.dirname(packageJsonFilePath),
48+
isPlugin: isPlugin
49+
};
3250

33-
_.each(packageJsonFiles, packageJsonFilePath => {
34-
let fileContent = require(packageJsonFilePath);
35-
let isPlugin = fileContent.nativescript;
51+
let addedDependency = this.dependencies[currentDependency.name];
52+
if (addedDependency) {
53+
if (semver.gt(currentDependency.version, addedDependency.version)) {
54+
let currentDependencyMajorVersion = semver.major(currentDependency.version);
55+
let addedDependencyMajorVersion = semver.major(addedDependency.version);
56+
57+
let message = `The depedency located at ${addedDependency.directory} with version ${addedDependency.version} will be replaced with dependency located at ${currentDependency.directory} with version ${currentDependency.version}`;
58+
let logger = $injector.resolve("$logger");
59+
currentDependencyMajorVersion === addedDependencyMajorVersion ? logger.out(message) : logger.warn(message);
3660

37-
if(!this.devDependencies[fileContent.name]) { // Don't flatten dev dependencies
38-
39-
let currentDependency = {
40-
name: fileContent.name,
41-
version: fileContent.version,
42-
directory: path.dirname(packageJsonFilePath),
43-
isPlugin: isPlugin
44-
};
45-
46-
let addedDependency = this.dependencies[currentDependency.name];
47-
if (addedDependency) {
48-
if (semver.gt(currentDependency.version, addedDependency.version)) {
49-
let currentDependencyMajorVersion = semver.major(currentDependency.version);
50-
let addedDependencyMajorVersion = semver.major(addedDependency.version);
51-
52-
let message = `The depedency located at ${addedDependency.directory} with version ${addedDependency.version} will be replaced with dependency located at ${currentDependency.directory} with version ${currentDependency.version}`;
53-
let logger = $injector.resolve("$logger");
54-
currentDependencyMajorVersion === addedDependencyMajorVersion ? logger.out(message) : logger.warn(message);
55-
56-
this.dependencies[currentDependency.name] = currentDependency;
57-
}
58-
} else {
5961
this.dependencies[currentDependency.name] = currentDependency;
6062
}
63+
} else {
64+
this.dependencies[currentDependency.name] = currentDependency;
6165
}
62-
});
63-
}
66+
}
67+
});
6468
});
6569

6670
_.each(this.dependencies, dependency => {
6771
shelljs.cp("-Rf", dependency.directory, this.outputRoot);
6872
shelljs.rm("-rf", path.join(this.outputRoot, dependency.name, "node_modules"));
6973
if(dependency.isPlugin) {
74+
this.$projectFilesManager.processPlatformSpecificFiles(path.join(this.outputRoot, dependency.name), platform).wait();
7075
shelljs.rm("-rf", path.join(this.outputRoot, dependency.name, "platforms"));
7176
}
7277
});
7378
}
7479

7580
public rebuild(treeDiff: IDiffResult): void {
76-
this.rebuildChangedDirectories(treeDiff.changedDirectories);
81+
this.rebuildChangedDirectories(treeDiff.changedDirectories, "");
7782

7883
// Cache input tree
7984
let projectFilePath = path.join(this.projectDir, constants.PACKAGE_JSON_FILE_NAME);
@@ -93,7 +98,10 @@ export class DestCopy implements IBroccoliPlugin {
9398
if(fs.existsSync(nodeModulesDirectoryPath)) {
9499
let contents = fs.readdirSync(nodeModulesDirectoryPath);
95100
for (let i = 0; i < contents.length; ++i) {
96-
foundFiles.push(path.join(nodeModulesDirectoryPath, contents[i], "package.json"));
101+
let packageJsonFilePath = path.join(nodeModulesDirectoryPath, contents[i], "package.json");
102+
if (fs.existsSync(packageJsonFilePath)) {
103+
foundFiles.push(packageJsonFilePath);
104+
}
97105

98106
var directoryPath = path.join(nodeModulesDirectoryPath, contents[i], "node_modules");
99107
if (fs.existsSync(directoryPath)) {

test/npm-support.ts

+43-11
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,10 @@ function createProject(testInjector: IInjector, dependencies?: any): string {
8888
return tempFolder;
8989
}
9090

91-
describe("Npm support tests", () => {
92-
it("Ensures that the installed dependencies are prepared correctly", () => {
93-
let dependencies = {
94-
"bplist": "0.0.4",
95-
"lodash": "3.9.3"
96-
};
97-
91+
function setupProject(): IFuture<any> {
92+
return (() => {
9893
let testInjector = createTestInjector();
99-
let projectFolder = createProject(testInjector, dependencies);
94+
let projectFolder = createProject(testInjector);
10095

10196
let fs = testInjector.resolve("fs");
10297

@@ -112,7 +107,6 @@ describe("Npm support tests", () => {
112107
let androidFolderPath = path.join(projectFolder, "platforms", "android");
113108
fs.ensureDirectoryExists(androidFolderPath).wait();
114109

115-
116110
// Mock platform data
117111
let appDestinationFolderPath = path.join(androidFolderPath, "assets");
118112
let platformsData = testInjector.resolve("platformsData");
@@ -129,8 +123,45 @@ describe("Npm support tests", () => {
129123
}
130124
};
131125

132-
let platformService = testInjector.resolve("platformService");
133-
platformService.preparePlatform("android").wait();
126+
return {
127+
testInjector: testInjector,
128+
projectFolder: projectFolder,
129+
appDestinationFolderPath: appDestinationFolderPath,
130+
};
131+
}).future<any>()();
132+
}
133+
134+
function addDependencies(testInjector: IInjector, projectFolder: string, dependencies: any): IFuture<void> {
135+
return (() => {
136+
let fs = testInjector.resolve("fs");
137+
let packageJsonPath = path.join(projectFolder, "package.json");
138+
let packageJsonData = fs.readJson(packageJsonPath).wait();
139+
140+
let currentDependencies = packageJsonData.dependencies;
141+
_.extend(currentDependencies, dependencies);
142+
fs.writeJson(packageJsonPath, packageJsonData).wait();
143+
}).future<void>()();
144+
}
145+
146+
function preparePlatform(testInjector: IInjector): IFuture<void> {
147+
let platformService = testInjector.resolve("platformService");
148+
return platformService.preparePlatform("android");
149+
}
150+
151+
describe("Npm support tests", () => {
152+
let testInjector: IInjector, projectFolder: string, appDestinationFolderPath: string;
153+
before(() => {
154+
let projectSetup = setupProject().wait();
155+
testInjector = projectSetup.testInjector;
156+
projectFolder = projectSetup.projectFolder;
157+
appDestinationFolderPath = projectSetup.appDestinationFolderPath;
158+
});
159+
it("Ensures that the installed dependencies are prepared correctly", () => {
160+
// Setup
161+
addDependencies(testInjector, projectFolder, {"bplist": "0.0.4"}).wait();
162+
163+
// Act
164+
preparePlatform(testInjector).wait();
134165

135166
// Assert
136167
let tnsModulesFolderPath = path.join(appDestinationFolderPath, "app", "tns_modules");
@@ -139,6 +170,7 @@ describe("Npm support tests", () => {
139170
let bplistCreatorFolderPath = path.join(tnsModulesFolderPath, "bplist-creator");
140171
let bplistParserFolderPath = path.join(tnsModulesFolderPath, "bplist-parser");
141172

173+
let fs = testInjector.resolve("fs");
142174
assert.isTrue(fs.exists(lodashFolderPath).wait());
143175
assert.isTrue(fs.exists(bplistFolderPath).wait());
144176
assert.isTrue(fs.exists(bplistCreatorFolderPath).wait());

0 commit comments

Comments
 (0)