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
50 changes: 47 additions & 3 deletions app/eslint.config.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
const tsParser = require('@typescript-eslint/parser');
const typescriptPlugin = require('@typescript-eslint/eslint-plugin');
const prettierPlugin = require('eslint-plugin-prettier');
const importPlugin = require('eslint-plugin-import');
const boundariesPlugin = require('eslint-plugin-boundaries');


module.exports = [
{
Expand All @@ -19,7 +22,22 @@ module.exports = [
},
plugins: {
'@typescript-eslint': typescriptPlugin,
prettier: prettierPlugin
prettier: prettierPlugin,
'import': importPlugin,
boundaries: boundariesPlugin
},
settings: {
'import/resolver': {
typescript: {
project: './tsconfig.json'
}
},
'boundaries/elements': [
{ type: 'core', pattern: 'src/core/**' },
{ type: 'entrypoints', pattern: 'src/entrypoints/**' },
{ type: 'infrastructure', pattern: 'src/infrastructure/**' },
{ type: 'shared', pattern: 'src/shared/**' }
],
},
rules: {
'@typescript-eslint/interface-name-prefix': 'off',
Expand All @@ -32,7 +50,33 @@ module.exports = [
{
endOfLine: 'auto'
}
]
],
"boundaries/element-types": [2, {
default: "disallow",
message: "The '${file.type}' layer is not allowed to import the '${dependency.type}'. Because it violates the principle of responsibility.",
rules: [
{
from: ["entrypoints"],
allow: ["entrypoints", "infrastructure", "core", "shared"],
importKind: "value",
},
{
from: ["core"],
allow: ["core"],
importKind: "value",
},
{
from: ["infrastructure"],
allow: ["infrastructure", "core", "shared"],
importKind: "value",
},
{
from: ["shared"],
allow: ["shared", "core"],
importKind: "value",
},
]
}]
}
},
{
Expand All @@ -41,4 +85,4 @@ module.exports = [
'dist/**/*'
]
}
];
];
11 changes: 7 additions & 4 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
"build": "NODE_ENV=production && nest build",
"generate-index": "node generate-index.js",
"seed": "ts-node -r tsconfig-paths/register src/seed.ts",
"format": "prettier --check \"src/**/*.ts\"",
"format:fix": "prettier --write \"src/**/*.ts\"",
"format": "prettier --check \"{src,test}/**/*.ts\"",
"format:fix": "prettier --write \"{src,test}/**/*.ts\"",
"start": "nest start",
"dev": "nest start --watch",
"start:debug": "nest start --watch --debug 0.0.0.0:9229",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs}/**/*.ts\"",
"lint:fix": "eslint \"{src,apps,libs}/**/*.ts\" --fix",
"lint": "eslint \"{src,test}/**/*.ts\"",
"lint:fix": "eslint \"{src,test}/**/*.ts\" --fix",
"test": "jest --config jest.config.js",
"test:watch": "jest --watch --config jest.config.js",
"test:coverage": "jest --coverage --config jest.config.js",
Expand Down Expand Up @@ -65,6 +65,9 @@
"eslint": "^9.17.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-import": "^2.31.0",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint-plugin-boundaries": "^5.0.1",
"jest": "^29.7.0",
"prettier": "^3.4.2",
"source-map-support": "^0.5.21",
Expand Down
86 changes: 35 additions & 51 deletions app/test/entrypoints/web/rest/orders/orders.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,11 @@
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, OrderEndRequest,
OrderQueryQuantityStatusRequest,
OrderQueryRequest, OrderStartRequest
} from '@entrypoints/web/rest/orders/request';
import {
OrderCreateResponse,
OrderItemsResponse,
OrderPaginationResponse,
OrderQuantityStatusResponse
} from '@entrypoints/web/rest/orders/response';
import { OrderCreationUseCaseImpl, OrderEndUsecaseImpl, OrderFindByIdUsecaseImpl, OrderQueryQuantityStatusUsecaseImpl, OrderQueryUsecaseImpl, OrderStartUsecaseImpl } from '@core/usecases/orders/impl';
import { OrderCreationRequest, OrderEndRequest, OrderQueryQuantityStatusRequest, OrderQueryRequest, OrderStartRequest } 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;

Expand All @@ -42,8 +25,8 @@ describe('OrdersController', () => {
{ provide: OrderQueryQuantityStatusUsecaseImpl.name, useValue: mockOrderQueryQuantityStatusUsecase },
{ provide: OrderFindByIdUsecaseImpl.name, useValue: mockOrderFindByIdUsecase },
{ provide: OrderStartUsecaseImpl.name, useValue: mockOrderStartUsecase },
{ provide: OrderEndUsecaseImpl.name, useValue: mockOrderEndUsecase }
]
{ provide: OrderEndUsecaseImpl.name, useValue: mockOrderEndUsecase },
],
})
.overrideGuard(ApiKeyGuard)
.useValue({ canActivate: jest.fn(() => true) })
Expand All @@ -57,19 +40,19 @@ describe('OrdersController', () => {
});

it('should call OrderCreationUseCase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
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'
schedulingDate: '2024-12-27',
};
const mockResponse: OrderCreateResponse = {
id: '6773205c93b1daa335239f03',
employeeId: 'a780e1d0-0b60-4a0f-b2a2-fda12ecb81af',
status: 'OPEN',
createdAt: '2024-12-30T22:36:12.881Z'
createdAt: '2024-12-30T22:36:12.881Z',
};
jest.spyOn(mockOrderCreationUseCase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.createOrder(mockRequest, mockDto);
Expand All @@ -78,7 +61,7 @@ describe('OrdersController', () => {
});

it('should call OrderQueryUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockRequest = { headers: { 'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d' }, body: {} } as any;
const mockDto: OrderQueryRequest = {
page: 0,
pageSize: 10,
Expand All @@ -88,13 +71,13 @@ describe('OrdersController', () => {
pagination: {
page: 0,
pageSize: 10,
total: 0
total: 0,
},
totalHours: {
hours: 0,
minutes: 0,
seconds: 0
}
seconds: 0,
},
};
jest.spyOn(mockOrderQueryUsecase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.getFilter(mockRequest, mockDto);
Expand All @@ -103,28 +86,30 @@ describe('OrdersController', () => {
});

it('should call OrderQueryQuantityStatusUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockRequest = { headers: { 'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d' }, body: {} } as any;
const mockDto: OrderQueryQuantityStatusRequest = {
startDate: '2024-12-01',
endDate: '2024-12-15'
endDate: '2024-12-15',
};
const mockResponse: OrderQuantityStatusResponse[] = [{
status: OrderStatus.OPEN,
day: 1,
month: 12,
week: 1,
year: 2024,
quantity: 10
}];
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 mockRequest = { headers: { 'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d' }, body: {} } as any;
const mockDto: string = '6773205c93b1daa335239f03';
const mockResponse: OrderItemsResponse = {
companyName: 'Company',
createdAt: new Date().toJSON(),
Expand All @@ -133,7 +118,7 @@ describe('OrdersController', () => {
schedulingDate: '2024-12-10',
serviceDescription: 'Description',
status: OrderStatus.OPEN,
updatedAt: new Date().toJSON()
updatedAt: new Date().toJSON(),
};
jest.spyOn(mockOrderFindByIdUsecase, 'execute').mockResolvedValue(mockResponse);
const result = await controller.getOrderById(mockRequest, mockDto);
Expand All @@ -142,26 +127,25 @@ describe('OrdersController', () => {
});

it('should call OrderStartUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockRequest = { headers: { 'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d' }, body: {} } as any;
const mockDto: OrderStartRequest = {
startDatetime: "2024-12-29T22:59:41.255Z",
startDatetime: '2024-12-29T22:59:41.255Z',
recordedLatitude: 13.174342,
recordedLongitude: 101.215167
}
recordedLongitude: 101.215167,
};
await controller.startOrder(mockRequest, '6773205c93b1daa335239f03', mockDto);
expect(mockOrderStartUsecase.execute).toHaveBeenCalledWith(expect.anything());
});

it('should call OrderEndUsecase.execute with correct parameters', async () => {
const mockRequest = { headers: {'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d'}, body: {} } as any;
const mockRequest = { headers: { 'x-api-key': '8c2e7d525bd34adfb52bb1fb24357a2d' }, body: {} } as any;
const mockDto: OrderEndRequest = {
endDatetime: "2024-12-29T23:59:41.255Z",
endDatetime: '2024-12-29T23:59:41.255Z',
recordedLatitude: 13.174342,
recordedLongitude: 101.215167,
comment: 'Finished'
}
comment: 'Finished',
};
await controller.endOrder(mockRequest, '6773205c93b1daa335239f03', mockDto);
expect(mockOrderEndUsecase.execute).toHaveBeenCalledWith(expect.anything());
});

});
1 change: 1 addition & 0 deletions app/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
Expand Down
Loading
Loading