251 lines
8.7 KiB
TypeScript
251 lines
8.7 KiB
TypeScript
import {
|
|
copyMissingPackages,
|
|
newApp,
|
|
newLib,
|
|
newProject,
|
|
readFile,
|
|
readJson,
|
|
runCommand,
|
|
updateFile
|
|
} from '../utils';
|
|
|
|
describe('Affected', () => {
|
|
it(
|
|
'should print, build, and test affected apps',
|
|
() => {
|
|
newProject();
|
|
newApp('myapp');
|
|
newApp('myapp2');
|
|
newLib('mylib');
|
|
newLib('mylib2');
|
|
newLib('mypublishablelib --publishable');
|
|
copyMissingPackages();
|
|
|
|
updateFile(
|
|
'apps/myapp/src/app/app.component.spec.ts',
|
|
`
|
|
import '@proj/mylib';
|
|
describe('sample test', () => {
|
|
it('should test', () => {
|
|
expect(1).toEqual(1);
|
|
});
|
|
});
|
|
`
|
|
);
|
|
updateFile(
|
|
'libs/mypublishablelib/src/lib/mypublishablelib.module.spec.ts',
|
|
`
|
|
import '@proj/mylib';
|
|
describe('sample test', () => {
|
|
it('should test', () => {
|
|
expect(1).toEqual(1);
|
|
});
|
|
});
|
|
`
|
|
);
|
|
|
|
const affectedApps = runCommand(
|
|
'npm run affected:apps -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(affectedApps).toContain('myapp');
|
|
expect(affectedApps).not.toContain('myapp2');
|
|
expect(affectedApps).not.toContain('myapp-e2e');
|
|
|
|
const implicitlyAffectedApps = runCommand(
|
|
'npm run affected:apps -- --files="package.json"'
|
|
);
|
|
expect(implicitlyAffectedApps).toContain('myapp');
|
|
expect(implicitlyAffectedApps).toContain('myapp2');
|
|
|
|
const noAffectedApps = runCommand(
|
|
'npm run affected:apps -- --files="README.md"'
|
|
);
|
|
expect(noAffectedApps).not.toContain('myapp');
|
|
expect(noAffectedApps).not.toContain('myapp2');
|
|
|
|
const affectedLibs = runCommand(
|
|
'npm run affected:libs -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(affectedLibs).toContain('mypublishablelib');
|
|
expect(affectedLibs).toContain('mylib');
|
|
expect(affectedLibs).not.toContain('mylib2');
|
|
|
|
const implicitlyAffectedLibs = runCommand(
|
|
'npm run affected:libs -- --files="package.json"'
|
|
);
|
|
expect(implicitlyAffectedLibs).toContain('mypublishablelib');
|
|
expect(implicitlyAffectedLibs).toContain('mylib');
|
|
expect(implicitlyAffectedLibs).toContain('mylib2');
|
|
|
|
const noAffectedLibs = runCommand(
|
|
'npm run affected:libs -- --files="README.md"'
|
|
);
|
|
expect(noAffectedLibs).not.toContain('mypublishablelib');
|
|
expect(noAffectedLibs).not.toContain('mylib');
|
|
expect(noAffectedLibs).not.toContain('mylib2');
|
|
|
|
const build = runCommand(
|
|
'npm run affected:build -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(build).toContain('Running build for mypublishablelib');
|
|
expect(build).toContain('Running build for myapp');
|
|
expect(build).not.toContain('is not registered with the build command');
|
|
expect(build).not.toContain('with flags:');
|
|
|
|
// Should work in parallel
|
|
const buildParallel = runCommand(
|
|
'npm run affected:build -- --files="libs/mylib/src/index.ts" --parallel'
|
|
);
|
|
expect(buildParallel).toContain(
|
|
'Running build for projects:\n myapp,\n mypublishablelib'
|
|
);
|
|
expect(buildParallel).toContain(
|
|
'Running build for affected projects succeeded.'
|
|
);
|
|
|
|
const buildExcluded = runCommand(
|
|
'npm run affected:build -- --files="libs/mylib/src/index.ts" --exclude myapp'
|
|
);
|
|
expect(buildExcluded).toContain('Running build for mypublishablelib');
|
|
|
|
const buildExcludedCsv = runCommand(
|
|
'npm run affected:build -- --files="package.json" --exclude myapp,myapp2,mypublishablelib'
|
|
);
|
|
expect(buildExcludedCsv).toContain('No projects to run build');
|
|
|
|
// affected:build should pass non-nx flags to the CLI
|
|
const buildWithFlags = runCommand(
|
|
'npm run affected:build -- --files="libs/mylib/src/index.ts" --stats-json'
|
|
);
|
|
expect(buildWithFlags).toContain('Running build for mypublishablelib');
|
|
expect(buildWithFlags).toContain('Running build for myapp');
|
|
expect(buildWithFlags).toContain('With flags: --stats-json=true');
|
|
|
|
const e2e = runCommand(
|
|
'npm run affected:e2e -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(e2e).toContain('should display welcome message');
|
|
|
|
const unitTests = runCommand(
|
|
'npm run affected:test -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(unitTests).toContain('Running test for mylib');
|
|
expect(unitTests).toContain('Running test for mypublishablelib');
|
|
expect(unitTests).toContain('Running test for myapp');
|
|
|
|
// Fail a Unit Test
|
|
updateFile(
|
|
'apps/myapp/src/app/app.component.spec.ts',
|
|
readFile('apps/myapp/src/app/app.component.spec.ts').replace(
|
|
'.toEqual(1)',
|
|
'.toEqual(2)'
|
|
)
|
|
);
|
|
|
|
const failedTests = runCommand(
|
|
'npm run affected:test -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
|
|
expect(failedTests).toContain('Running test for mylib');
|
|
expect(failedTests).toContain('Running test for mypublishablelib');
|
|
expect(failedTests).toContain('Running test for myapp');
|
|
expect(failedTests).toContain('Failed projects: myapp');
|
|
expect(failedTests).toContain(
|
|
'You can isolate the above projects by passing --only-failed'
|
|
);
|
|
expect(readJson('dist/.nx-results')).toEqual({
|
|
command: 'test',
|
|
results: {
|
|
myapp: false,
|
|
mylib: true,
|
|
mypublishablelib: true
|
|
}
|
|
});
|
|
|
|
// Fix failing Unit Test
|
|
updateFile(
|
|
'apps/myapp/src/app/app.component.spec.ts',
|
|
readFile('apps/myapp/src/app/app.component.spec.ts').replace(
|
|
'.toEqual(2)',
|
|
'.toEqual(1)'
|
|
)
|
|
);
|
|
|
|
const isolatedTests = runCommand(
|
|
'npm run affected:test -- --files="libs/mylib/src/index.ts" --only-failed'
|
|
);
|
|
expect(isolatedTests).toContain('Running test for myapp');
|
|
|
|
const linting = runCommand(
|
|
'npm run affected:lint -- --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(linting).toContain('Running lint for mylib');
|
|
expect(linting).toContain('Running lint for myapp');
|
|
expect(linting).toContain('Running lint for myapp-e2e');
|
|
expect(linting).toContain('Running lint for mypublishablelib');
|
|
|
|
const lintWithJsonFormating = runCommand(
|
|
'npm run affected:lint -- --files="libs/mylib/src/index.ts" -- --format json'
|
|
);
|
|
expect(lintWithJsonFormating).toContain('With flags: --format json');
|
|
expect(lintWithJsonFormating).toContain('[]');
|
|
|
|
const unitTestsExcluded = runCommand(
|
|
'npm run affected:test -- --files="libs/mylib/src/index.ts" --exclude=myapp,mypublishablelib'
|
|
);
|
|
expect(unitTestsExcluded).toContain('Running test for mylib');
|
|
|
|
const i18n = runCommand(
|
|
'npm run affected -- --target extract-i18n --files="libs/mylib/src/index.ts"'
|
|
);
|
|
expect(i18n).toContain('Running extract-i18n for myapp');
|
|
},
|
|
1000000
|
|
);
|
|
|
|
it(
|
|
'should print, build, and test all apps',
|
|
() => {
|
|
newProject();
|
|
newApp('myapp');
|
|
newApp('myapp2');
|
|
newLib('mylib');
|
|
newLib('mypublishablelib --publishable');
|
|
copyMissingPackages();
|
|
|
|
const affectedApps = runCommand('npm run affected:apps -- --all');
|
|
expect(affectedApps).toContain('myapp');
|
|
expect(affectedApps).toContain('myapp2');
|
|
expect(affectedApps).not.toContain('myapp-e2e');
|
|
|
|
const build = runCommand('npm run affected:build -- --all');
|
|
expect(build).toContain('Running build for myapp');
|
|
expect(build).toContain('Running build for myapp2');
|
|
expect(build).toContain('Running build for mypublishablelib');
|
|
expect(build).not.toContain('is not registered with the build command');
|
|
|
|
const buildExcluded = runCommand(
|
|
'npm run affected:build -- --files="libs/mylib/src/index.ts" --exclude myapp,myapp2,mypublishablelib'
|
|
);
|
|
expect(buildExcluded).toContain('No projects to run build');
|
|
|
|
const e2e = runCommand('npm run affected:e2e -- --all');
|
|
expect(e2e).toContain('Running e2e for myapp-e2e');
|
|
expect(e2e).toContain('Running e2e for myapp2-e2e');
|
|
|
|
const unitTests = runCommand('npm run affected:test -- --all');
|
|
expect(unitTests).toContain('Running test for mypublishablelib');
|
|
expect(unitTests).toContain('Running test for myapp2');
|
|
expect(unitTests).toContain('Running test for myapp');
|
|
expect(unitTests).toContain('Running test for mylib');
|
|
|
|
const i18n = runCommand(
|
|
'npm run affected -- --target extract-i18n --all'
|
|
);
|
|
expect(i18n).toContain('Running extract-i18n for myapp2');
|
|
expect(i18n).toContain('Running extract-i18n for myapp');
|
|
},
|
|
1000000
|
|
);
|
|
});
|