Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,8 @@ jobs:
- name: Format
run: yarn format

- name: Test
run: yarn test

- name: Build
run: yarn build
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ echo "Running pre-commit..."

BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)

if echo "$BRANCH_NAME" | grep -qE '^(feature|bugfix|release|hotfix|refactor)\/[a-z0-9-]+$'; then
if echo "$BRANCH_NAME" | grep -qE '^(feature|bugfix|release|hotfix|refactor|test)\/[a-z0-9-]+$'; then
echo "✅ Valid branch name: $BRANCH_NAME"
else
echo "🚫 The branch name '$BRANCH_NAME' does not follow the Gitflow standard."
Expand Down
2 changes: 1 addition & 1 deletion .husky/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)

if echo "$BRANCH_NAME" | grep -qE '^(feature|bugfix|release|hotfix|refactor)\/[a-z0-9-]+$'; then
if echo "$BRANCH_NAME" | grep -qE '^(feature|bugfix|release|hotfix|refactor|test)\/[a-z0-9-]+$'; then
echo "✅ Valid branch name: $BRANCH_NAME"
else
echo "🚫 The branch name '$BRANCH_NAME' does not follow the Gitflow standard."
Expand Down
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ build:
install:
docker compose -f yarn.cli.yml run --rm yarn install

# Run test
test:
docker compose -f yarn.cli.yml run --rm yarn test

# Run coverage
test-coverage:
docker compose -f yarn.cli.yml run --rm yarn test:coverage

# Updates all project libraries to their latest versions using Yarn,
# running in a container defined in the yarn.cli.yml file.
upgrade-lib:
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,17 @@ Follow the steps below to run the project in development mode.
make generate-index
```

- Runs test:
```bash
make test
```

- Runs test with coverage:
```bash
make test-coverage
```


### 2.2. Documentation

The project includes several forms of documentation accessible locally:
Expand Down
10 changes: 10 additions & 0 deletions README.pt-br.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,16 @@ Siga os passos abaixo para rodar o projeto em modo desenvolvimento.
make generate-index
```

- Executa testes:
```bash
make test
```

- Executa testes de cobertura:
```bash
make test-coverage
```


### 2.2. Documentação

Expand Down
17 changes: 17 additions & 0 deletions app/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig.json');

module.exports = {
moduleFileExtensions: ['js', 'json', 'ts'],
rootDir: './',
testRegex: '.*\\.spec\\.ts$',
transform: {
'^.+\\.(t|j)s$': 'ts-jest',
},
coverageDirectory: './coverage',
testEnvironment: 'node',
moduleDirectories: ['node_modules', 'src', 'test'],
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, {
prefix: '<rootDir>/',
}),
};
6 changes: 3 additions & 3 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs}/**/*.ts\"",
"lint:fix": "eslint \"{src,apps,libs}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test": "jest --config jest.config.js",
"test:watch": "jest --watch --config jest.config.js",
"test:coverage": "jest --coverage --config jest.config.js",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CheckApiKeyUsecase } from '@core/usecases/auth';
import { ApiKeyApplicationRepositoryProvider } from '@core/providers/repositories';
import { ApikeyApplicationCoreEntity } from '@core/domain/entities/auth';
import { CustomUnauthorizedException } from 'src/core/domain/exceptions';
import { CustomUnauthorizedException } from '@core/domain/exceptions';

export class CheckApiKeyUsecaseImpl implements CheckApiKeyUsecase {
constructor(private readonly repositoryProvider: ApiKeyApplicationRepositoryProvider) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NotificationOrderCoreEntity } from 'src/core/domain/entities/notifications';
import { NotificationOrderCoreEntity } from '@core/domain/entities/notifications';
import { NotificationOrderRegisterUsecase } from '@core/usecases/notification';
import { ProducerQueueProvider } from '@core/providers/queue';
import { configEnv } from '@shared/config';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NotificationOrderCoreEntity } from 'src/core/domain/entities/notifications';
import { NotificationOrderCoreEntity } from '@core/domain/entities/notifications';

export interface NotificationOrderRegisterUsecase {
execute(notificationOrderCoreEntity: Partial<NotificationOrderCoreEntity>): Promise<void>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { OrderCreationCoreEntity, OrderCoreEntity, OrderCoordsCoreEntity } from
import { OrderCreationUseCase } from '@core/usecases/orders';
import { OrderRepositoryProvider } from '@core/providers/repositories';
import { NotificationOrderRegisterUsecase } from '@core/usecases/notification';
import { NotificationOrderCoreEntity } from 'src/core/domain/entities/notifications';
import { NotificationOrderCoreEntity } from '@core/domain/entities/notifications';

export class OrderCreationUseCaseImpl implements OrderCreationUseCase {
constructor(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { OrderRepositoryProvider } from '@core/providers/repositories';
import { CustomResourceNotFoundException } from 'src/core/domain/exceptions';
import { CustomResourceNotFoundException } from '@core/domain/exceptions';
import { CodeError } from '@core/domain/exceptions/error';
import { OrderCoreEntity, OrderFindByIdCoreEntity } from '@core/domain/entities/orders';
import { OrderFindByIdUsecase } from '@core/usecases/orders';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { DynamicModule, Module, Type } from '@nestjs/common';
* ```typescript
* import { Module } from '@nestjs/shared';
* import { WebhookIntegrationClientProviderImpl } from '@infrastructure/integrations/webhook-client/impl';
* import { IntegrationConfigModule } from 'src/infrastructure/integrations/config/abstract';
* import { IntegrationConfigModule } from '@infrastructure/integrations/config/abstract';
* import { WebhookConfigModule } from '@infrastructure/integrations/webhook-client/config';
*
* const integrationConfigModule = IntegrationConfigModule.forFeature(WebhookIntegrationClientProviderImpl);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Module } from '@nestjs/common';
import { WebhookIntegrationClientModule } from 'src/infrastructure/integrations/webhook-client';
import { IntegrationInfraConfigModule } from 'src/infrastructure/integrations/config/abstract';
import { WebhookIntegrationClientModule } from '@infrastructure/integrations/webhook-client';
import { IntegrationInfraConfigModule } from '@infrastructure/integrations/config/abstract';

const integrationInfraConfigModule = IntegrationInfraConfigModule.forModules([WebhookIntegrationClientModule]);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Module } from '@nestjs/common';
import { WebhookIntegrationClientProviderImpl } from '@infrastructure/integrations/webhook-client/impl';
import { IntegrationConfigModule } from 'src/infrastructure/integrations/config/abstract';
import { IntegrationConfigModule } from '@infrastructure/integrations/config/abstract';
import { WebhookConfigModule } from '@infrastructure/integrations/webhook-client/config';

const integrationConfigModule = IntegrationConfigModule.forFeature(WebhookIntegrationClientProviderImpl);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from '@core/domain/entities/orders';
import { MongoRepository } from 'typeorm/repository/MongoRepository';
import { OrderEntity } from '@infrastructure/repositories/orders/entity';
import { OrderInfraMapper } from 'src/infrastructure/repositories/orders/mappers';
import { OrderInfraMapper } from '@infrastructure/repositories/orders/mappers';
import { OrderAggregationResult } from '@infrastructure/repositories/orders/types';

@Injectable()
Expand Down
144 changes: 144 additions & 0 deletions app/test/entrypoints/web/rest/orders/orders.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ApiKeyGuard } from '@entrypoints/web/shared/middleware/apikey';
import {
OrderCreationUseCaseImpl,
OrderEndUsecaseImpl,
OrderFindByIdUsecaseImpl,
OrderQueryQuantityStatusUsecaseImpl,
OrderQueryUsecaseImpl,
OrderStartUsecaseImpl
} from '@core/usecases/orders/impl';
import {
OrderCreationRequest,
OrderQueryQuantityStatusRequest,
OrderQueryRequest
} from '@entrypoints/web/rest/orders/request';
import {
OrderCreateResponse,
OrderItemsResponse,
OrderPaginationResponse,
OrderQuantityStatusResponse
} from '@entrypoints/web/rest/orders/response';
import { OrdersController } from '@entrypoints/web/rest/orders';
import { OrderStatus } from '@core/domain/enums';


describe('OrdersController', () => {
let controller: OrdersController;

const mockOrderCreationUseCase = { execute: jest.fn() };
const mockOrderQueryUsecase = { execute: jest.fn() };
const mockOrderQueryQuantityStatusUsecase = { execute: jest.fn() };
const mockOrderFindByIdUsecase = { execute: jest.fn() };
const mockOrderStartUsecase = { execute: jest.fn() };
const mockOrderEndUsecase = { execute: jest.fn() };

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [OrdersController],
providers: [
{ provide: OrderCreationUseCaseImpl.name, useValue: mockOrderCreationUseCase },
{ provide: OrderQueryUsecaseImpl.name, useValue: mockOrderQueryUsecase },
{ provide: OrderQueryQuantityStatusUsecaseImpl.name, useValue: mockOrderQueryQuantityStatusUsecase },
{ provide: OrderFindByIdUsecaseImpl.name, useValue: mockOrderFindByIdUsecase },
{ provide: OrderStartUsecaseImpl.name, useValue: mockOrderStartUsecase },
{ provide: OrderEndUsecaseImpl.name, useValue: mockOrderEndUsecase }
]
})
.overrideGuard(ApiKeyGuard)
.useValue({ canActivate: jest.fn(() => true) })
.compile();

controller = module.get<OrdersController>(OrdersController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});

it('should call OrderCreationUseCase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockDto: OrderCreationRequest = {
serviceDescription: 'BHUT serviço',
companyName: 'BHUT',
companyAddressLatitude: -39.932048,
companyAddressLongitude: 34.664223,
schedulingDate: '2024-12-27'
};
const mockResponse: OrderCreateResponse = {
id: '6773205c93b1daa335239f03',
employeeId: 'a780e1d0-0b60-4a0f-b2a2-fda12ecb81af',
status: 'OPEN',
createdAt: '2024-12-30T22:36:12.881Z'
};
jest.spyOn(mockOrderCreationUseCase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.createOrder(mockRequest, mockDto);
expect(mockOrderCreationUseCase.execute).toHaveBeenCalledWith(expect.anything());
expect(result).toEqual(expect.anything());
});

it('should call OrderQueryUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockDto: OrderQueryRequest = {
page: 0,
pageSize: 10,
};
const mockResponse: OrderPaginationResponse = {
items: [],
pagination: {
page: 0,
pageSize: 10,
total: 0
},
totalHours: {
hours: 0,
minutes: 0,
seconds: 0
}
};
jest.spyOn(mockOrderQueryUsecase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.getFilter(mockRequest, mockDto);
expect(mockOrderQueryUsecase.execute).toHaveBeenCalledWith(expect.anything());
expect(result).toEqual(expect.anything());
});

it('should call OrderQueryQuantityStatusUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockDto: OrderQueryQuantityStatusRequest = {
startDate: '2024-12-01',
endDate: '2024-12-15'
};
const mockResponse: OrderQuantityStatusResponse[] = [{
status: OrderStatus.OPEN,
day: 1,
month: 12,
week: 1,
year: 2024,
quantity: 10
}];
jest.spyOn(mockOrderQueryQuantityStatusUsecase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.getQuantityStatus(mockRequest, mockDto);
expect(mockOrderQueryQuantityStatusUsecase.execute).toHaveBeenCalledWith(expect.anything());
expect(result).toEqual(expect.anything());
});

it('should call OrderFindByIdUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockDto: string = "6773205c93b1daa335239f03";
const mockResponse: OrderItemsResponse = {
companyName: 'Company',
createdAt: new Date().toJSON(),
employeeId: 'a780e1d0-0b60-4a0f-b2a2-fda12ecb81af',
id: mockDto,
schedulingDate: '2024-12-10',
serviceDescription: 'Description',
status: OrderStatus.OPEN,
updatedAt: new Date().toJSON()
};
jest.spyOn(mockOrderFindByIdUsecase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.getOrderById(mockRequest, mockDto);
expect(mockOrderFindByIdUsecase.execute).toHaveBeenCalledWith(expect.anything());
expect(result).toEqual(expect.anything());
});

});
1 change: 0 additions & 1 deletion app/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"compilerOptions": {
"module": "commonjs",

"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
Expand Down
Loading