From 7f3c3dcdf4b6a906d09f58ddd00190b1e8481f74 Mon Sep 17 00:00:00 2001 From: Kilian Panot Date: Sun, 10 Dec 2023 00:14:47 +0900 Subject: [PATCH] feat: add integration test for Otter Create package --- package.json | 4 +-- packages/@o3r/create/.eslintrc.js | 15 ++++++++ packages/@o3r/create/package.json | 4 ++- packages/@o3r/create/project.json | 7 ++++ packages/@o3r/create/src/index.it.spec.ts | 35 +++++++++++++++++++ packages/@o3r/create/src/index.ts | 19 ++++++++-- .../@o3r/create/testing/jest.config.it.js | 8 +++++ packages/@o3r/create/tsconfig.build.json | 3 ++ packages/@o3r/create/tsconfig.json | 3 ++ packages/@o3r/create/tsconfig.spec.json | 12 +++++++ packages/@o3r/test-helpers/src/public_api.ts | 4 +-- .../src/utilities/package-manager.ts | 2 +- .../@o3r/test-helpers/tsconfig.build.json | 5 +-- yarn.lock | 2 ++ 14 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 packages/@o3r/create/src/index.it.spec.ts create mode 100644 packages/@o3r/create/testing/jest.config.it.js create mode 100644 packages/@o3r/create/tsconfig.spec.json diff --git a/package.json b/package.json index 01ed53163f..9abfbbd63e 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "publish:extensions:affected": "yarn nx affected --target=publish-extension --parallel $(yarn get:cpus-number)", "lint": "yarn nx run-many --target=lint --parallel $(yarn get:cpus-number)", "lint:affected": "yarn nx affected --target=lint --parallel $(yarn get:cpus-number)", - "test": "yarn nx run-many --target=test --parallel 2 --cacheDirectory=$(yarn get:current-dir)/.cache/jest", - "test:affected": "yarn nx affected --target=test --parallel 2 --cacheDirectory=$(yarn get:current-dir)/.cache/jest", + "test": "yarn nx run-many --target=test --parallel $(yarn get:cpus-number) --cacheDirectory=$(yarn get:current-dir)/.cache/jest", + "test:affected": "yarn nx affected --target=test --parallel $(yarn get:cpus-number) --cacheDirectory=$(yarn get:current-dir)/.cache/jest", "test-int": "yarn nx run-many --target=test-int --parallel 2", "postinstall": "husky install && yarn build:tools && yarn harmonize:version", "build:storybook": "yarn doc:generate:json && yarn ng run storybook:extract-style && build-storybook", diff --git a/packages/@o3r/create/.eslintrc.js b/packages/@o3r/create/.eslintrc.js index dc7b3341e7..dc3f24599b 100644 --- a/packages/@o3r/create/.eslintrc.js +++ b/packages/@o3r/create/.eslintrc.js @@ -7,10 +7,25 @@ module.exports = { 'tsconfigRootDir': __dirname, 'project': [ 'tsconfig.build.json', + 'tsconfig.spec.json', 'tsconfig.eslint.json' ], 'sourceType': 'module' }, + 'overrides': [ + { + 'files': [ + '**/package.json' + ], + 'rules': { + '@nx/dependency-checks': ['error', { + 'buildTargets': ['build', 'compile', 'test'], + 'ignoredDependencies': ['@o3r/test-helpers'], + 'checkObsoleteDependencies': false + }] + } + } + ], 'extends': [ '../../../.eslintrc.js' ] diff --git a/packages/@o3r/create/package.json b/packages/@o3r/create/package.json index e3e5fe8e6d..dee8761191 100644 --- a/packages/@o3r/create/package.json +++ b/packages/@o3r/create/package.json @@ -17,7 +17,8 @@ "dependencies": { "@angular/cli": "~17.0.3", "@schematics/angular": "~17.0.3", - "minimist": "^1.2.6" + "minimist": "^1.2.6", + "tslib": "^2.5.3" }, "devDependencies": { "@angular-eslint/eslint-plugin": "~17.1.0", @@ -29,6 +30,7 @@ "@o3r/build-helpers": "workspace:^", "@o3r/eslint-config-otter": "workspace:^", "@o3r/eslint-plugin": "workspace:^", + "@o3r/test-helpers": "workspace:^", "@types/jest": "~29.5.2", "@types/minimist": "^1.2.2", "@types/node": "^18.0.0", diff --git a/packages/@o3r/create/project.json b/packages/@o3r/create/project.json index df2de95061..05c690d588 100644 --- a/packages/@o3r/create/project.json +++ b/packages/@o3r/create/project.json @@ -30,6 +30,13 @@ ] } }, + "test-int": { + "executor": "@nx/jest:jest", + "options": { + "jestConfig": "packages/@o3r/create/testing/jest.config.it.js", + "silent": false + } + }, "prepare-publish": { "executor": "nx:run-script", "options": { diff --git a/packages/@o3r/create/src/index.it.spec.ts b/packages/@o3r/create/src/index.it.spec.ts new file mode 100644 index 0000000000..908132ee03 --- /dev/null +++ b/packages/@o3r/create/src/index.it.spec.ts @@ -0,0 +1,35 @@ +import { + getDefaultExecSyncOptions, + getPackageManager, + getYarnVersionFromRoot, + packageManagerCreate, + packageManagerExec, + packageManagerInstall, + prepareTestEnv, + setupLocalRegistry +} from '@o3r/test-helpers'; +import * as path from 'node:path'; + +const appName = 'test-create-app'; +let baseFolderPath: string; +let appPackagePath: string; +const execAppOptions = getDefaultExecSyncOptions(); +const packageManager = getPackageManager(); + +describe('Create new otter project command', () => { + setupLocalRegistry(); + beforeEach(async () => { + const isYarnTest = packageManager.startsWith('yarn'); + const yarnVersion = isYarnTest ? getYarnVersionFromRoot(process.cwd()) || 'latest' : undefined; + baseFolderPath = await prepareTestEnv(appName, 'blank', yarnVersion); + appPackagePath = path.join(baseFolderPath, appName); + execAppOptions.cwd = baseFolderPath; + }); + + test('should generate a project with an application', () => { + expect(() => packageManagerCreate(`@o3r ${appName}`, execAppOptions)).not.toThrow(); + expect(() => packageManagerInstall({ ...execAppOptions, cwd: appPackagePath })).not.toThrow(); + expect(() => packageManagerExec('ng g application my-app', { ...execAppOptions, cwd: appPackagePath })).not.toThrow(); + expect(() => packageManagerExec('ng build my-app', { ...execAppOptions, cwd: appPackagePath })).not.toThrow(); + }); +}); diff --git a/packages/@o3r/create/src/index.ts b/packages/@o3r/create/src/index.ts index 2884863325..835aa9345a 100644 --- a/packages/@o3r/create/src/index.ts +++ b/packages/@o3r/create/src/index.ts @@ -108,14 +108,25 @@ const isNgNewOptions = (arg: string) => { if (arg.startsWith('--')) { return entries.some(([key]) => [`--${key}`, `--no-${key}`, `--${key.replaceAll(/([A-Z])/g, '-$1').toLowerCase()}`, `--no-${key.replaceAll(/([A-Z])/g, '-$1').toLowerCase()}`].includes(arg)); } else if (arg.startsWith('-')) { - return entries.some(([_, {alias}]) => alias && arg === `-${alias}`); + return entries.some(([, {alias}]) => alias && arg === `-${alias}`); } return true; }; +const schematicsCliOptions: any[][] = Object.entries(argv) + .filter(([key]) => key !== '_') + .map(([key, value]) => value === true && [key] || value === false && key.length > 1 && [`no-${key}`] || [key, value]) + .map(([key, value]) => { + const optionKey = key.length > 1 ? `--${key}` : `-${key}`; + return typeof value === 'undefined' ? [optionKey] : [optionKey, value]; + }); + const createNgProject = () => { - const { error } = spawnSync(process.execPath, [binPath, 'new', ...args.filter(isNgNewOptions), '--skip-install'], { + const options = schematicsCliOptions + .filter(([key]) => isNgNewOptions(key)) + .flat(); + const { error } = spawnSync(process.execPath, [binPath, 'new', ...argv._, ...options, '--skip-install'], { stdio: 'inherit' }); @@ -128,7 +139,9 @@ const createNgProject = () => { const addOtterFramework = (relativeDirectory = '.') => { const cwd = resolve(process.cwd(), relativeDirectory); - const { error } = spawnSync(process.execPath, [binPath, 'add', `@o3r/core@${version || 'latest'}`, ...args.filter((arg) => arg.startsWith('-'))], { + const options = schematicsCliOptions + .flat(); + const { error } = spawnSync(process.execPath, [binPath, 'add', `@o3r/core@${version || 'latest'}`, ...options], { stdio: 'inherit', cwd }); diff --git a/packages/@o3r/create/testing/jest.config.it.js b/packages/@o3r/create/testing/jest.config.it.js new file mode 100644 index 0000000000..693a6db125 --- /dev/null +++ b/packages/@o3r/create/testing/jest.config.it.js @@ -0,0 +1,8 @@ +const { dirname } = require('node:path'); +const getJestConfig = require('../../../../jest.config.it').getJestConfig; + +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +module.exports = { + ...getJestConfig(dirname(__dirname)), + displayName: require('../package.json').name +}; diff --git a/packages/@o3r/create/tsconfig.build.json b/packages/@o3r/create/tsconfig.build.json index ade18bbca0..861bc3d1d1 100644 --- a/packages/@o3r/create/tsconfig.build.json +++ b/packages/@o3r/create/tsconfig.build.json @@ -12,5 +12,8 @@ }, "include": [ "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" ] } diff --git a/packages/@o3r/create/tsconfig.json b/packages/@o3r/create/tsconfig.json index 6d13634267..b9b3ca5336 100644 --- a/packages/@o3r/create/tsconfig.json +++ b/packages/@o3r/create/tsconfig.json @@ -4,6 +4,9 @@ "references": [ { "path": "./tsconfig.build.json" + }, + { + "path": "./tsconfig.spec.json" } ] } diff --git a/packages/@o3r/create/tsconfig.spec.json b/packages/@o3r/create/tsconfig.spec.json new file mode 100644 index 0000000000..4646d3c88a --- /dev/null +++ b/packages/@o3r/create/tsconfig.spec.json @@ -0,0 +1,12 @@ +{ + "extends": "../../../tsconfig.jest", + "compilerOptions": { + "incremental": true, + "composite": true, + "outDir": "test", + "rootDir": "." + }, + "include": [ + "./src/**/*.spec.ts" + ] +} diff --git a/packages/@o3r/test-helpers/src/public_api.ts b/packages/@o3r/test-helpers/src/public_api.ts index 21dc6ec635..3825ffaf14 100644 --- a/packages/@o3r/test-helpers/src/public_api.ts +++ b/packages/@o3r/test-helpers/src/public_api.ts @@ -1,3 +1,3 @@ export * from './prepare-test-env'; -export * from './test-environments'; -export * from './utilities'; +export * from './test-environments/index'; +export * from './utilities/index'; diff --git a/packages/@o3r/test-helpers/src/utilities/package-manager.ts b/packages/@o3r/test-helpers/src/utilities/package-manager.ts index f5942b2fb0..274d05f52b 100644 --- a/packages/@o3r/test-helpers/src/utilities/package-manager.ts +++ b/packages/@o3r/test-helpers/src/utilities/package-manager.ts @@ -25,7 +25,7 @@ const PACKAGE_MANAGERS_CMD = { yarn: { add: 'yarn add', create: 'yarn create', - exec: 'yarn exec', + exec: 'yarn', install: 'yarn install', run: 'yarn run', workspaceExec: 'yarn workspace', diff --git a/packages/@o3r/test-helpers/tsconfig.build.json b/packages/@o3r/test-helpers/tsconfig.build.json index 03c842bdfa..b1f2f21e17 100644 --- a/packages/@o3r/test-helpers/tsconfig.build.json +++ b/packages/@o3r/test-helpers/tsconfig.build.json @@ -9,9 +9,6 @@ }, "include": ["src/**/*.ts"], "exclude": [ - "**/*.spec.ts", - "src/**/fixtures/**/*.ts", - "src/builders/**/*.ts", - "src/helpers/**/*.ts" + "**/*.spec.ts" ] } diff --git a/yarn.lock b/yarn.lock index de09ded54c..c5bfa4463a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6962,6 +6962,7 @@ __metadata: "@o3r/build-helpers": "workspace:^" "@o3r/eslint-config-otter": "workspace:^" "@o3r/eslint-plugin": "workspace:^" + "@o3r/test-helpers": "workspace:^" "@schematics/angular": "npm:~17.0.3" "@types/jest": "npm:~29.5.2" "@types/minimist": "npm:^1.2.2" @@ -6983,6 +6984,7 @@ __metadata: rimraf: "npm:^5.0.1" rxjs: "npm:^7.8.1" ts-jest: "npm:~29.1.1" + tslib: "npm:^2.5.3" type-fest: "npm:^3.12.0" typescript: "npm:~5.2.2" bin: