From ec85d37f2d53704131820b99bf58063cd53bf70e Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:23:06 -0600 Subject: [PATCH 01/13] feat: config SonarQube --- .github/actions/sonarcloud/action.yml | 28 +++++++++++++++++++++++++++ .github/workflows/ci.yml | 24 +++++++++++++++++++++++ sonar-project.properties | 23 ++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 .github/actions/sonarcloud/action.yml create mode 100644 .github/workflows/ci.yml create mode 100644 sonar-project.properties diff --git a/.github/actions/sonarcloud/action.yml b/.github/actions/sonarcloud/action.yml new file mode 100644 index 0000000..20d62bd --- /dev/null +++ b/.github/actions/sonarcloud/action.yml @@ -0,0 +1,28 @@ +name: sonarcloud +description: SonarCloud Scan action +inputs: + sonar-token: + description: sonarToken + required: true + report-path: + description: report Path + required: true + +runs: + using: composite + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Download coverage data for artisan-api + uses: actions/download-artifact@v4 + with: + path: ./components/artisan-api/coverage + name: artisan-api-test-coverage + - name: SonarCloud Scan + uses: SonarSource/sonarqube-scan-action@v4.2.0 + env: + SONAR_TOKEN: ${{inputs.sonar-token}} + with: + args: > + -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4b60b2e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +permissions: + id-token: write + contents: read + +jobs: + quality: + name: Quality + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Sonarcloud Scan + uses: ./.github/actions/sonarcloud + with: + sonar-token: ${{ secrets.SONARCLOUD_USER_TOKEN }} \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..7599bf4 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,23 @@ +# must be unique in a given SonarQube instance +sonar.projectKey=AlexByte18_artisan-api +sonar.organization=artisan + +# --- optional properties --- +sonar.javascript.lcov.reportPaths=**/coverage/**/lcov.info +sonar.scm.exclusions.disabled=true +sonar.scm.forceReloadAll=true + +# Path is relative to the sonar-project.properties file. Defaults to . +sonar.sources=. + +# Encoding of the source code. Default is default system encoding +sonar.sourceEncoding=UTF-8 +sonar.inclusions=**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.tf +sonar.exclusions=**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/__mocks__/**/* +sonar.typescript.file.suffixes=.ts,.tsx + +# Coverage exclusions for specific files or folders +# Excluding artisan-api from coverage temporarily +sonar.coverage.exclusions=components/artisan-api/src/__service_tests__/**/*,components/artisan-api/src/testHelpers/**/*,components/artisan-api/scripts/**/*,components/artisan-api/**/handler.ts,components/artisan-api/src/resources/Profiles/dev-assets/index.ts +sonar.tests=. +sonar.test.inclusions=**/*.test.tsx,**/*.test.ts,**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts \ No newline at end of file From 10810c4d359eb269429db7e56ebdb8756a819051 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:26:38 -0600 Subject: [PATCH 02/13] feat: updata sonarcloud config --- .github/actions/sonarcloud/action.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/actions/sonarcloud/action.yml b/.github/actions/sonarcloud/action.yml index 20d62bd..4850b90 100644 --- a/.github/actions/sonarcloud/action.yml +++ b/.github/actions/sonarcloud/action.yml @@ -14,11 +14,6 @@ runs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Download coverage data for artisan-api - uses: actions/download-artifact@v4 - with: - path: ./components/artisan-api/coverage - name: artisan-api-test-coverage - name: SonarCloud Scan uses: SonarSource/sonarqube-scan-action@v4.2.0 env: From 8e089740fd67c7481bb791bdd2eceffd5726ea35 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:29:35 -0600 Subject: [PATCH 03/13] wip: test new sonarcloud config --- .github/actions/sonarcloud/action.yml | 39 +++++++++++++-------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/.github/actions/sonarcloud/action.yml b/.github/actions/sonarcloud/action.yml index 4850b90..09d275e 100644 --- a/.github/actions/sonarcloud/action.yml +++ b/.github/actions/sonarcloud/action.yml @@ -1,23 +1,20 @@ name: sonarcloud description: SonarCloud Scan action -inputs: - sonar-token: - description: sonarToken - required: true - report-path: - description: report Path - required: true - -runs: - using: composite - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: SonarCloud Scan - uses: SonarSource/sonarqube-scan-action@v4.2.0 - env: - SONAR_TOKEN: ${{inputs.sonar-token}} - with: - args: > - -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} \ No newline at end of file +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + sonarqube: + name: SonarQube + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarQube Scan + uses: SonarSource/sonarqube-scan-action@v6 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file From 90ee35108f069287cec22886ab81b9ec1db00175 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:31:37 -0600 Subject: [PATCH 04/13] feat: restore sonarcloud config --- .github/actions/sonarcloud/action.yml | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/actions/sonarcloud/action.yml b/.github/actions/sonarcloud/action.yml index 09d275e..ed8ec2a 100644 --- a/.github/actions/sonarcloud/action.yml +++ b/.github/actions/sonarcloud/action.yml @@ -1,20 +1,20 @@ name: sonarcloud description: SonarCloud Scan action -on: - push: - branches: - - master - pull_request: - types: [opened, synchronize, reopened] -jobs: - sonarqube: - name: SonarQube - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: SonarQube Scan - uses: SonarSource/sonarqube-scan-action@v6 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file +inputs: + sonar-token: + description: sonarToken + required: true + +runs: + using: composite + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarCloud Scan + uses: SonarSource/sonarqube-scan-action@v4.2.0 + env: + SONAR_TOKEN: ${{inputs.sonar-token}} + with: + args: > + -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} \ No newline at end of file From 8716de6fb1d46978aa5ad84811bf42becb0ff986 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:41:18 -0600 Subject: [PATCH 05/13] fix: sonarcloud config issue --- .github/actions/sonarcloud/action.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/actions/sonarcloud/action.yml b/.github/actions/sonarcloud/action.yml index ed8ec2a..38d3efd 100644 --- a/.github/actions/sonarcloud/action.yml +++ b/.github/actions/sonarcloud/action.yml @@ -14,7 +14,4 @@ runs: - name: SonarCloud Scan uses: SonarSource/sonarqube-scan-action@v4.2.0 env: - SONAR_TOKEN: ${{inputs.sonar-token}} - with: - args: > - -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} \ No newline at end of file + SONAR_TOKEN: ${{inputs.sonar-token}} \ No newline at end of file From cbd1579700db86627be4ff1e35da3e2be0bdbc37 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:46:21 -0600 Subject: [PATCH 06/13] fix: secret name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b60b2e..c843f34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,4 +21,4 @@ jobs: - name: Sonarcloud Scan uses: ./.github/actions/sonarcloud with: - sonar-token: ${{ secrets.SONARCLOUD_USER_TOKEN }} \ No newline at end of file + sonar-token: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file From eae890c4a2d18663f980232bf8e9bee4eaeefc0c Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Thu, 4 Dec 2025 23:52:43 -0600 Subject: [PATCH 07/13] wip: debug sonar config --- .github/workflows/ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c843f34..48a6c97 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,15 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Debug Token + run: | + if [ -z "${{ secrets.SONAR_TOKEN }}" ]; then + echo "ERROR: SONAR_TOKEN está vacío" + else + echo "SONAR_TOKEN existe (primeros 10 caracteres): $(echo ${{ secrets.SONAR_TOKEN }} | cut -c1-10)..." + echo "Longitud del token: $(echo -n ${{ secrets.SONAR_TOKEN }} | wc -c)" + fi + - name: Sonarcloud Scan uses: ./.github/actions/sonarcloud with: From 2af5ee3514ddb2568f721e3dfe68cd752c9ea8df Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 00:12:05 -0600 Subject: [PATCH 08/13] feat: final sonar config --- .github/workflows/ci.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48a6c97..c843f34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,15 +18,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Debug Token - run: | - if [ -z "${{ secrets.SONAR_TOKEN }}" ]; then - echo "ERROR: SONAR_TOKEN está vacío" - else - echo "SONAR_TOKEN existe (primeros 10 caracteres): $(echo ${{ secrets.SONAR_TOKEN }} | cut -c1-10)..." - echo "Longitud del token: $(echo -n ${{ secrets.SONAR_TOKEN }} | wc -c)" - fi - - name: Sonarcloud Scan uses: ./.github/actions/sonarcloud with: From 2f502f42db4b1a1fabc31592d2f87723db9c0d20 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 00:48:03 -0600 Subject: [PATCH 09/13] test: add dtos test --- src/auth/dto/create-user-dto.spec.ts | 34 ++++++++++++++++++++++++++ src/auth/dto/login-user-dto.spec.ts | 33 +++++++++++++++++++++++++ src/common/dtos/pagination.dto.spec.ts | 26 ++++++++++++++++++++ src/common/dtos/pagination.dto.ts | 23 ++++++++++++++--- src/products/dto/create-product.dto.ts | 9 ++++++- src/products/dto/update-product.dto.ts | 2 +- 6 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 src/auth/dto/create-user-dto.spec.ts create mode 100644 src/auth/dto/login-user-dto.spec.ts create mode 100644 src/common/dtos/pagination.dto.spec.ts diff --git a/src/auth/dto/create-user-dto.spec.ts b/src/auth/dto/create-user-dto.spec.ts new file mode 100644 index 0000000..6ab449b --- /dev/null +++ b/src/auth/dto/create-user-dto.spec.ts @@ -0,0 +1,34 @@ +import { validate } from "class-validator"; +import { CreateUserDto } from "./create-user-dto"; +import { error } from "console"; + +describe('CreateUserDto', () => { + + it('should have the correct properties', async () => { + const createUserDto = new CreateUserDto(); + + createUserDto.email = 'test@test.com'; + createUserDto.password = 'Password123'; + createUserDto.fullName = 'User test'; + + const errors = await validate(createUserDto); + + expect(errors.length).toBe(0); + }); + + it('shold throw errors if password in not valid', async () => { + const createUserDto = new CreateUserDto(); + + createUserDto.email = 'test@test.com'; + createUserDto.password = 'password'; + createUserDto.fullName = 'User test'; + + const errors = await validate(createUserDto); + const passwordError = errors.find(error => error.property === 'password'); + + expect(passwordError).toBeDefined(); + expect(passwordError.constraints).toBeDefined(); + expect(passwordError.constraints.matches).toBe('The password must have a Uppercase, lowercase letter and a number'); + }); + +}); \ No newline at end of file diff --git a/src/auth/dto/login-user-dto.spec.ts b/src/auth/dto/login-user-dto.spec.ts new file mode 100644 index 0000000..bc964c1 --- /dev/null +++ b/src/auth/dto/login-user-dto.spec.ts @@ -0,0 +1,33 @@ +import { plainToClass } from "class-transformer" +import { LoginUserDto } from "./login-user-dto" +import { validate } from "class-validator"; + +describe('LoginUserDto', () => { + + it('should have the correct properties', async () => { + const loginUserDto = plainToClass(LoginUserDto, { + email: 'test@test.com', + password: 'Password123', + }); + + const errors = await validate(loginUserDto); + + expect(errors.length).toBe(0); + }); + + + it('shold throw error if password is not valid', async () => { + const loginUserDto = plainToClass(LoginUserDto, { + email: 'test@test.com', + password: 'invalidpassword', + }); + + const errors = validate(loginUserDto); + const passwordError = (await errors).find(error => error.property === 'password'); + + expect(passwordError).toBeDefined(); + expect(passwordError.constraints).toBeDefined(); + expect(passwordError.constraints.matches).toBe('The password must have a Uppercase, lowercase letter and a number'); + }) + +}) \ No newline at end of file diff --git a/src/common/dtos/pagination.dto.spec.ts b/src/common/dtos/pagination.dto.spec.ts new file mode 100644 index 0000000..e173ef3 --- /dev/null +++ b/src/common/dtos/pagination.dto.spec.ts @@ -0,0 +1,26 @@ +import { plainToClass } from "class-transformer" +import { PaginationDto } from "./pagination.dto" +import { validate } from "class-validator"; + +describe('PaginationDto', () => { + it('shold work with default parameters', async () => { + const paginationDto = plainToClass(PaginationDto, {}); + + const errors = await validate(paginationDto); + + expect(paginationDto).toBeDefined(); + expect(errors.length).toBe(0); + }); + + it('should validate limit as a positive number', async () => { + const paginationDto = plainToClass(PaginationDto, { limit: -1 }); + + const errors = await validate(paginationDto); + + const limitError = errors.find(error => error.property === 'limit'); + + expect(limitError).toBeDefined(); + expect(limitError.constraints.isPositive).toBeDefined(); + }); + +}); \ No newline at end of file diff --git a/src/common/dtos/pagination.dto.ts b/src/common/dtos/pagination.dto.ts index 40a1613..f9bbfee 100644 --- a/src/common/dtos/pagination.dto.ts +++ b/src/common/dtos/pagination.dto.ts @@ -1,17 +1,34 @@ +import { ApiProperty } from "@nestjs/swagger" import { Type } from "class-transformer" -import { IsOptional, IsPositive, Min, min } from "class-validator" +import { IsIn, IsOptional, IsPositive, Min } from "class-validator" export class PaginationDto { + @ApiProperty({ + default: 10, + description: 'How many rows do you need', + + }) @IsOptional() @IsPositive() @Type(() => Number) limit?: number + @ApiProperty({ + default: 0, + description: 'How many rows do you want to skip', + }) @IsOptional() - @IsPositive() @Min(0) @Type(() => Number) - offset?: number + offset?: number; + + @ApiProperty({ + default: '', + description: 'Filter results by gender', + }) + @IsOptional() + @IsIn(['men', 'women', 'kid']) + gender: 'men' | 'women' | 'kid'; } \ No newline at end of file diff --git a/src/products/dto/create-product.dto.ts b/src/products/dto/create-product.dto.ts index 28a97ad..a60e478 100644 --- a/src/products/dto/create-product.dto.ts +++ b/src/products/dto/create-product.dto.ts @@ -1,8 +1,15 @@ -import { IsArray, IsIn, IsInt, IsNumber, IsOptional, isPositive, IsPositive, IsString, MinLength } from "class-validator" +import { ApiProperty } from "@nestjs/swagger" +import { IsArray, IsIn, IsInt, IsNumber, IsOptional, IsPositive, IsString, MinLength } from "class-validator" export class CreateProductDto { + @ApiProperty({ + example: 'T-Shirt', + description: 'Product title (unique)', + nullable: false, + minLength: 1 + }) @IsString() @MinLength(1) title: string diff --git a/src/products/dto/update-product.dto.ts b/src/products/dto/update-product.dto.ts index e2d43fc..87b9d7f 100644 --- a/src/products/dto/update-product.dto.ts +++ b/src/products/dto/update-product.dto.ts @@ -1,4 +1,4 @@ -import { PartialType } from '@nestjs/mapped-types'; +import { PartialType } from '@nestjs/swagger'; import { CreateProductDto } from './create-product.dto'; export class UpdateProductDto extends PartialType(CreateProductDto) {} From cd2643fa3d08eef7473587891ced94ebd15b41b4 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 00:48:34 -0600 Subject: [PATCH 10/13] test: add entities test --- src/auth/entities/user.entity.ts | 2 +- src/products/entities/product.entity.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/auth/entities/user.entity.ts b/src/auth/entities/user.entity.ts index f35e0d8..e91a9cd 100644 --- a/src/auth/entities/user.entity.ts +++ b/src/auth/entities/user.entity.ts @@ -1,4 +1,4 @@ -import { Product } from "src/products/entities"; +import { Product } from "../../products/entities/product.entity"; import { BeforeInsert, BeforeUpdate, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; @Entity('users') diff --git a/src/products/entities/product.entity.ts b/src/products/entities/product.entity.ts index c5b94b3..c22c335 100644 --- a/src/products/entities/product.entity.ts +++ b/src/products/entities/product.entity.ts @@ -1,6 +1,6 @@ import { BeforeInsert, Column, Entity, PrimaryGeneratedColumn, BeforeUpdate, OneToMany, ManyToOne } from "typeorm"; import { ProductImage } from "./product-image.entity"; -import { User } from "src/auth/entities/user.entity"; +import { User } from "../../auth/entities/user.entity"; import { ApiProperty } from "@nestjs/swagger"; @Entity({ name: 'products' }) From 65ad12cb022d46a15a21b7248fb2135df43a002e Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 22:12:06 -0600 Subject: [PATCH 11/13] feat: update exclusions --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 7599bf4..42bd067 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -20,4 +20,4 @@ sonar.typescript.file.suffixes=.ts,.tsx # Excluding artisan-api from coverage temporarily sonar.coverage.exclusions=components/artisan-api/src/__service_tests__/**/*,components/artisan-api/src/testHelpers/**/*,components/artisan-api/scripts/**/*,components/artisan-api/**/handler.ts,components/artisan-api/src/resources/Profiles/dev-assets/index.ts sonar.tests=. -sonar.test.inclusions=**/*.test.tsx,**/*.test.ts,**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts \ No newline at end of file +sonar.test.inclusions=**/*.test.tsx,**/*.test.ts,**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/*.test.tsx,**/*.spec.tsx, \ No newline at end of file From d2eeb684c15fd6735b15ae538541568a2d808bc8 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 22:17:04 -0600 Subject: [PATCH 12/13] feat: add .spec to exclusions --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 36fe742..ed0e375 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -13,7 +13,7 @@ sonar.sources=. # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 sonar.inclusions=**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.tf -sonar.exclusions=**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/__mocks__/**/* +sonar.exclusions=**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/__mocks__/**/*,**/*.spec.tsx, sonar.typescript.file.suffixes=.ts,.tsx # Coverage exclusions for specific files or folders From 231be0d70558e246977763cc11041da878159979 Mon Sep 17 00:00:00 2001 From: THAlexCortes Date: Fri, 5 Dec 2025 22:22:14 -0600 Subject: [PATCH 13/13] fix: sonar exclusion in config file --- sonar-project.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index ed0e375..2cd3f96 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -13,11 +13,11 @@ sonar.sources=. # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 sonar.inclusions=**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.tf -sonar.exclusions=**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/__mocks__/**/*,**/*.spec.tsx, +sonar.exclusions=**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/__mocks__/**/*,**/*.spec.tsx,**/*.spec.ts, sonar.typescript.file.suffixes=.ts,.tsx # Coverage exclusions for specific files or folders # Excluding artisan-api from coverage temporarily sonar.coverage.exclusions=components/artisan-api/src/__service_tests__/**/*,components/artisan-api/src/testHelpers/**/*,components/artisan-api/scripts/**/*,components/artisan-api/**/handler.ts,components/artisan-api/src/resources/Profiles/dev-assets/index.ts sonar.tests=. -sonar.test.inclusions=**/*.test.tsx,**/*.test.ts,**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/*.test.tsx,**/*.spec.tsx, +sonar.test.inclusions=**/*.test.tsx,**/*.test.ts,**/testHelpers/**/*,**/__tests__/**/*,**/mock*.ts,**/*.test.tsx,**/*.spec.tsx,**/*.spec.ts,