diff --git a/.ctirc b/.ctirc index 4f66353..1ac340a 100644 --- a/.ctirc +++ b/.ctirc @@ -19,7 +19,9 @@ "include": [ "**/*.ts" ], - "exclude": [], + "exclude": [ + "**/__mocks__/*" + ], "skipEmptyDir": true, "startFrom": "./lib", "output": "./dist", diff --git a/.github/actions/eslint-report/action.yml b/.github/actions/eslint-report/action.yml new file mode 100644 index 0000000..fa83296 --- /dev/null +++ b/.github/actions/eslint-report/action.yml @@ -0,0 +1,9 @@ +name: Eslint Report +description: Create the report from Eslint analysis + +runs: + using: 'composite' + steps: + - name: Generate eslint report + shell: bash + run: yarn lint:report || echo "::warning::yarn lint:report command is missing" diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6d28d06..ad87851 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -60,6 +60,9 @@ jobs: - name: Restore cached node_modules uses: ./.github/actions/cache-dependencies + - name: Generate lint report + uses: ./.github/actions/eslint-report + - name: Run unit tests run: yarn run test:coverage diff --git a/jest.config.js b/jest.config.js index 8d3b3c7..a5388ae 100644 --- a/jest.config.js +++ b/jest.config.js @@ -19,6 +19,7 @@ module.exports = { '/coverage', '.eslintrc.js', 'jest.config.js', + '/*/*/index.ts', '.*.provider.ts$', '.*.module.ts$', '.*.model.ts$', @@ -26,6 +27,7 @@ module.exports = { '.*.mock.ts$', '.*.dto.ts$', '.*\\.(spec|test)\\.(t|j)s$', + '__mocks__', ], moduleFileExtensions: ['js', 'json', 'ts'], clearMocks: true, diff --git a/lib/functions/spyConstructor/__mocks__/stub-constructor.ts b/lib/functions/spyConstructor/__mocks__/stub-constructor.ts new file mode 100644 index 0000000..cac1e67 --- /dev/null +++ b/lib/functions/spyConstructor/__mocks__/stub-constructor.ts @@ -0,0 +1,3 @@ +export class StubConstructorExample { + public foo = 'bar'; +} diff --git a/lib/functions/spyConstructor/index.ts b/lib/functions/spyConstructor/index.ts new file mode 100644 index 0000000..5e794b2 --- /dev/null +++ b/lib/functions/spyConstructor/index.ts @@ -0,0 +1 @@ +export * from './spy-constructor'; diff --git a/lib/functions/spyConstructor/spy-constructor.spec.ts b/lib/functions/spyConstructor/spy-constructor.spec.ts new file mode 100644 index 0000000..b06dbe1 --- /dev/null +++ b/lib/functions/spyConstructor/spy-constructor.spec.ts @@ -0,0 +1,25 @@ +import { spyConstructor } from './spy-constructor'; + +describe('spyConstructor', () => { + it('should returns a mock of the constructor', () => { + const spiedObject = spyConstructor( + './__mocks__/stub-constructor', + 'StubConstructorExample', + ); + + expect(spiedObject._isMockFunction).toBeTrue(); + }); + + it('should mocks the constructor with the desired value', () => { + const mockedValue = jest.fn(); + + const spiedObject = spyConstructor( + './__mocks__/stub-constructor', + 'StubConstructorExample', + ).mockReturnValue(mockedValue); + + const resultFromMock = spiedObject(); + + expect(resultFromMock).toBe(mockedValue); + }); +}); diff --git a/lib/functions/spyConstructor/spy-constructor.ts b/lib/functions/spyConstructor/spy-constructor.ts new file mode 100644 index 0000000..6a25ec9 --- /dev/null +++ b/lib/functions/spyConstructor/spy-constructor.ts @@ -0,0 +1,11 @@ +export function spyConstructor( + module: string, + constructorName: Key, +): ReturnType { + jest.doMock(module); + + const moduleImport = jest.requireActual(module); + + const spiedConstructor = jest.spyOn(moduleImport, constructorName as any); + return spiedConstructor; +} diff --git a/lib/index.ts b/lib/index.ts index 5109393..f3de061 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,2 +1,3 @@ +export * from './functions/spyConstructor'; export * from './mocks/create-mock-with-uuid'; export * from './utils'; diff --git a/package.json b/package.json index 02d5803..ca4658f 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,9 @@ "reflect-metadata": "^0.2.2", "uuid": "^10.0.0" }, + "peerDependencies": { + "jest": "^29.7.0" + }, "config": { "commitizen": { "path": "./node_modules/cz-conventional-changelog" diff --git a/sonar-project.properties b/sonar-project.properties index 7049355..a8f76cc 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,10 +1,10 @@ sonar.projectKey=friendly-testers_ts-testing-buddy sonar.organization=friendly-testers sonar.testExecutionReportPaths=./test-report.xml -sonar.exclusions=**/node_modules/**,**/dist/**,**/coverage/**,**/lib/**/*.model.ts,,**/lib/**/*.dto.ts,**/lib/**/*.module.ts,**/lib/configs/**,**/lib/datasources/migrations/**,**/lib/main.ts,**/lib/server.ts,**/lib/app.ts,**/lib/index.ts,**/lib/bootstrap.ts +sonar.exclusions=**/node_modules/**,**/dist/**,**/coverage/**,**/lib/**/*.model.ts,**/lib/**/__mocks__/**,**/lib/**/*.dto.ts,**/lib/**/*.module.ts,**/lib/configs/**,**/lib/datasources/migrations/**,**/lib/main.ts,**/lib/server.ts,**/lib/app.ts,**/lib/index.ts,**/lib/bootstrap.ts,**/lib/**/index.ts sonar.sources=lib sonar.test.inclusions=**/*.spec.ts,**/*.test.ts,**/*.spec.tsx,**/*.test.tsx -sonar.test.exclusions=**/node_modules/**,**/dist/**,**/coverage/**,**/lib/**/*.model.ts,**/lib/**/*.dto.ts,**/lib/**/*.module.ts,**/lib/configs/**,**/lib/datasources/migrations/**,**/lib/main.ts,**/lib/server.ts,**/lib/app.ts,**/lib/index.ts,**/lib/bootstrap.ts +sonar.test.exclusions=**/node_modules/**,**/dist/**,**/coverage/**,**/lib/**/*.model.ts,**/lib/**/__mocks__/**,**/lib/**/*.dto.ts,**/lib/**/*.module.ts,**/lib/configs/**,**/lib/datasources/migrations/**,**/lib/main.ts,**/lib/server.ts,**/lib/app.ts,**/lib/index.ts,**/lib/bootstrap.ts,**/lib/**/index.ts sonar.typescript.lcov.reportPaths=coverage/lcov.info sonar.eslint.reportPaths=./eslint-report.json sonar.typescript.tsconfigPath=./tsconfig.json diff --git a/tsconfig.build.json b/tsconfig.build.json index aed3485..0dfdc8b 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] + "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "**/__mocks__/*"] }