From 4004d15ba5de337eb6a1ae42b9f80a5c604a554f Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Wed, 22 May 2019 17:34:09 +0100 Subject: [PATCH] test(ivy): ngcc refactor mock file-systems to make each spec independent (#30591) Previously each test relied on large shared mock file-systems, which makes it difficult to reason about what is actually being tested. This commit breaks up these big mock file-systems into smaller more focused chunks. PR Close #30591 --- .../ngcc/test/packages/entry_point_spec.ts | 138 +++++++++--------- 1 file changed, 68 insertions(+), 70 deletions(-) diff --git a/packages/compiler-cli/ngcc/test/packages/entry_point_spec.ts b/packages/compiler-cli/ngcc/test/packages/entry_point_spec.ts index 12f8dd0ab1..871c656f9e 100644 --- a/packages/compiler-cli/ngcc/test/packages/entry_point_spec.ts +++ b/packages/compiler-cli/ngcc/test/packages/entry_point_spec.ts @@ -19,7 +19,6 @@ runInEachFileSystem(() => { let fs: FileSystem; beforeEach(() => { - setupMockFileSystem(); SOME_PACKAGE = absoluteFrom('/some_package'); _ = absoluteFrom; fs = getFileSystem(); @@ -27,6 +26,16 @@ runInEachFileSystem(() => { it('should return an object containing absolute paths to the formats of the specified entry-point', () => { + loadTestFiles([ + { + name: _('/some_package/valid_entry_point/package.json'), + contents: createPackageJson('valid_entry_point') + }, + { + name: _('/some_package/valid_entry_point/valid_entry_point.metadata.json'), + contents: 'some meta data' + }, + ]); const entryPoint = getEntryPointInfo( fs, new MockLogger(), SOME_PACKAGE, _('/some_package/valid_entry_point')); expect(entryPoint).toEqual({ @@ -40,12 +49,28 @@ runInEachFileSystem(() => { }); it('should return null if there is no package.json at the entry-point path', () => { + loadTestFiles([ + { + name: _('/some_package/missing_package_json/missing_package_json.metadata.json'), + contents: 'some meta data' + }, + ]); const entryPoint = getEntryPointInfo( fs, new MockLogger(), SOME_PACKAGE, _('/some_package/missing_package_json')); expect(entryPoint).toBe(null); }); it('should return null if there is no typings or types field in the package.json', () => { + loadTestFiles([ + { + name: _('/some_package/missing_typings/package.json'), + contents: createPackageJson('missing_typings', {excludes: ['typings']}) + }, + { + name: _('/some_package/missing_typings/missing_typings.metadata.json'), + contents: 'some meta data' + }, + ]); const entryPoint = getEntryPointInfo(fs, new MockLogger(), SOME_PACKAGE, _('/some_package/missing_typings')); expect(entryPoint).toBe(null); @@ -53,6 +78,12 @@ runInEachFileSystem(() => { it('should return an object with `compiledByAngular` set to false if there is no metadata.json file next to the typing file', () => { + loadTestFiles([ + { + name: _('/some_package/missing_metadata/package.json'), + contents: createPackageJson('missing_metadata') + }, + ]); const entryPoint = getEntryPointInfo( fs, new MockLogger(), SOME_PACKAGE, _('/some_package/missing_metadata')); expect(entryPoint).toEqual({ @@ -66,6 +97,17 @@ runInEachFileSystem(() => { }); it('should work if the typings field is named `types', () => { + loadTestFiles([ + { + name: _('/some_package/types_rather_than_typings/package.json'), + contents: createPackageJson('types_rather_than_typings', {}, 'types') + }, + { + name: + _('/some_package/types_rather_than_typings/types_rather_than_typings.metadata.json'), + contents: 'some meta data' + }, + ]); const entryPoint = getEntryPointInfo( fs, new MockLogger(), SOME_PACKAGE, _('/some_package/types_rather_than_typings')); expect(entryPoint).toEqual({ @@ -79,6 +121,22 @@ runInEachFileSystem(() => { }); it('should work with Angular Material style package.json', () => { + loadTestFiles([ + { + name: _('/some_package/material_style/package.json'), + contents: `{ + "name": "some_package/material_style", + "typings": "./material_style.d.ts", + "main": "./bundles/material_style.umd.js", + "module": "./esm5/material_style.es5.js", + "es2015": "./esm2015/material_style.js" + }` + }, + { + name: _('/some_package/material_style/material_style.metadata.json'), + contents: 'some meta data' + }, + ]); const entryPoint = getEntryPointInfo(fs, new MockLogger(), SOME_PACKAGE, _('/some_package/material_style')); expect(entryPoint).toEqual({ @@ -92,81 +150,21 @@ runInEachFileSystem(() => { }); it('should return null if the package.json is not valid JSON', () => { + loadTestFiles([ + // package.json might not be a valid JSON + // for example, @schematics/angular contains a package.json blueprint + // with unexpected symbols + { + name: _('/some_package/unexpected_symbols/package.json'), + contents: '{"devDependencies": {<% if (!minimal) { %>"@types/jasmine": "~2.8.8" <% } %>}}' + }, + ]); const entryPoint = getEntryPointInfo( fs, new MockLogger(), SOME_PACKAGE, _('/some_package/unexpected_symbols')); expect(entryPoint).toBe(null); }); }); - function setupMockFileSystem(): void { - const _ = absoluteFrom; - loadTestFiles([ - { - name: _('/some_package/valid_entry_point/package.json'), - contents: createPackageJson('valid_entry_point') - }, - { - name: _('/some_package/valid_entry_point/valid_entry_point.metadata.json'), - contents: 'some meta data' - }, - // no package.json! - { - name: _('/some_package/missing_package_json/missing_package_json.metadata.json'), - contents: 'some meta data' - }, - { - name: _('/some_package/missing_typings/package.json'), - contents: createPackageJson('missing_typings', {excludes: ['typings']}) - }, - { - name: _('/some_package/missing_typings/missing_typings.metadata.json'), - contents: 'some meta data' - }, - { - name: _('/some_package/types_rather_than_typings/package.json'), - contents: createPackageJson('types_rather_than_typings', {}, 'types') - }, - { - name: _('/some_package/types_rather_than_typings/types_rather_than_typings.metadata.json'), - contents: 'some meta data' - }, - { - name: _('/some_package/missing_esm2015/package.json'), - contents: createPackageJson('missing_fesm2015', {excludes: ['esm2015', 'fesm2015']}) - }, - { - name: _('/some_package/missing_esm2015/missing_esm2015.metadata.json'), - contents: 'some meta data' - }, - // no metadata.json! - { - name: _('/some_package/missing_metadata/package.json'), - contents: createPackageJson('missing_metadata') - }, - { - name: _('/some_package/material_style/package.json'), - contents: `{ - "name": "some_package/material_style", - "typings": "./material_style.d.ts", - "main": "./bundles/material_style.umd.js", - "module": "./esm5/material_style.es5.js", - "es2015": "./esm2015/material_style.js" - }` - }, - { - name: _('/some_package/material_style/material_style.metadata.json'), - contents: 'some meta data' - }, - // package.json might not be a valid JSON - // for example, @schematics/angular contains a package.json blueprint - // with unexpected symbols - { - name: _('/some_package/unexpected_symbols/package.json'), - contents: '{"devDependencies": {<% if (!minimal) { %>"@types/jasmine": "~2.8.8" <% } %>}}' - }, - ]); - } - function createPackageJson( packageName: string, {excludes}: {excludes?: string[]} = {}, typingsProp: string = 'typings'): string {