Skip to content

Commit c7b6f44

Browse files
Add claims entity and tests
1 parent fbb64f5 commit c7b6f44

29 files changed

+629
-66
lines changed

package-lock.json

+82-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+7-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
"bcrypt": "^5.1.1",
3232
"class-transformer": "^0.5.1",
3333
"class-validator": "^0.14.1",
34+
"cloudinary": "^1.41.3",
3435
"cross-env": "^7.0.3",
36+
"multer": "^1.4.5-lts.1",
37+
"multer-storage-cloudinary": "^4.0.0",
3538
"reflect-metadata": "^0.2.0",
3639
"rxjs": "^7.8.1"
3740
},
@@ -42,6 +45,7 @@
4245
"@types/bcrypt": "^5.0.2",
4346
"@types/express": "^4.17.17",
4447
"@types/jest": "^29.5.2",
48+
"@types/multer": "^1.4.11",
4549
"@types/node": "^20.3.1",
4650
"@types/supertest": "^6.0.0",
4751
"@typescript-eslint/eslint-plugin": "^7.7.1",
@@ -82,7 +86,9 @@
8286
"dto",
8387
"entity",
8488
"main",
85-
"prisma"
89+
"prisma",
90+
"cloudinary",
91+
"multer"
8692
],
8793
"coverageDirectory": "../coverage",
8894
"testEnvironment": "node"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Claim" ADD COLUMN "imageUrl" TEXT;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Claim" ALTER COLUMN "status" SET DEFAULT 'open';

prisma/schema.prisma

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ model User {
1717
id String @id @default(uuid())
1818
name String
1919
email String @unique
20-
password String
20+
password String
2121
age Int
2222
licenseYear Int
2323
bankAccount String?
@@ -41,11 +41,12 @@ model Claim {
4141
id String @id @default(uuid())
4242
policyId String
4343
operatorId String?
44-
status String
44+
status String @default("open")
4545
type String
4646
phoneNumber String
4747
address String
4848
claimNumber Int @default(autoincrement())
49+
imageUrl String?
4950
policy Policy @relation(fields: [policyId], references: [id])
5051
operator Operator? @relation(fields: [operatorId], references: [id])
5152
}

src/app.module.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ import { PoliciesModule } from './policies/policies.module';
66
import { PrismaModule } from './prisma/prisma.module';
77
import { PrismaService } from './prisma/prisma.service';
88
import { CoreModule } from './core/core.module';
9+
import { ClaimsModule } from './claims/claims.module';
910

1011
@Module({
11-
imports: [UsersModule, PoliciesModule, PrismaModule, CoreModule],
12+
imports: [
13+
UsersModule,
14+
PoliciesModule,
15+
PrismaModule,
16+
CoreModule,
17+
ClaimsModule,
18+
],
1219
controllers: [AppController],
1320
providers: [AppService, PrismaService],
1421
})

src/claims/claims.controller.spec.ts

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { ClaimsController } from './claims.controller';
3+
import { ClaimsService } from './claims.service';
4+
import { PrismaService } from '../prisma/prisma.service';
5+
import { CryptoService } from '../core/crypto/crypto.service';
6+
import { LoggedGuard } from '../core/auth/logged.guard';
7+
import { CreateClaimDto } from './dto/create-claim.dto';
8+
9+
class Claim {
10+
id: string;
11+
policyId: string;
12+
operatorId: string;
13+
status: string;
14+
type: string;
15+
phoneNumber: string;
16+
address: string;
17+
claimNumber: number;
18+
imageUrl: string;
19+
}
20+
21+
const mockPrismaService = {};
22+
const mockClaimsService = {
23+
createClaim: jest.fn(),
24+
findByPolicyId: jest.fn(),
25+
};
26+
27+
const mockCryptoService = {
28+
verifyToken: jest.fn().mockResolvedValue(true),
29+
};
30+
31+
describe('ClaimsController', () => {
32+
let controller: ClaimsController;
33+
let service: ClaimsService;
34+
35+
beforeEach(async () => {
36+
const module: TestingModule = await Test.createTestingModule({
37+
controllers: [ClaimsController],
38+
providers: [
39+
{ provide: ClaimsService, useValue: mockClaimsService },
40+
{ provide: PrismaService, useValue: mockPrismaService },
41+
{ provide: CryptoService, useValue: mockCryptoService },
42+
LoggedGuard,
43+
],
44+
}).compile();
45+
46+
controller = module.get<ClaimsController>(ClaimsController);
47+
service = module.get<ClaimsService>(ClaimsService);
48+
});
49+
50+
it('should be defined', () => {
51+
expect(controller).toBeDefined();
52+
});
53+
54+
describe('createClaim', () => {
55+
it('should create a claim and return the result', async () => {
56+
const createClaimDto: CreateClaimDto = {
57+
type: 'crash',
58+
phoneNumber: '1234567890',
59+
address: '123 Main St',
60+
} as any;
61+
const file = { originalname: 'file.png' } as any;
62+
const policyId = '1';
63+
const result: Claim = {
64+
id: '1',
65+
policyId,
66+
operatorId: 'randomId',
67+
status: 'pending',
68+
type: 'crash',
69+
phoneNumber: '1234567890',
70+
address: '123 Main St',
71+
claimNumber: 1,
72+
imageUrl: 'http://example.com/image.png',
73+
};
74+
75+
jest.spyOn(service, 'createClaim').mockResolvedValue(result);
76+
77+
const response = await controller.createClaim(
78+
policyId,
79+
createClaimDto,
80+
file,
81+
);
82+
83+
expect(response).toBe(result);
84+
expect(service.createClaim).toHaveBeenCalledWith(
85+
policyId,
86+
createClaimDto,
87+
file,
88+
);
89+
});
90+
});
91+
92+
describe('getClaimsByPolicyId', () => {
93+
it('should return claims for the given policy ID', async () => {
94+
const policyId = '1';
95+
const claims: Claim[] = [
96+
{
97+
id: '1',
98+
policyId,
99+
operatorId: 'randomId',
100+
status: 'pending',
101+
type: 'crash',
102+
phoneNumber: '1234567890',
103+
address: '123 Main St',
104+
claimNumber: 1,
105+
imageUrl: 'http://example.com/image.png',
106+
},
107+
];
108+
109+
jest.spyOn(service, 'findByPolicyId').mockResolvedValue(claims);
110+
111+
const response = await controller.getClaimsByPolicyId(policyId);
112+
113+
expect(response).toBe(claims);
114+
expect(service.findByPolicyId).toHaveBeenCalledWith(policyId);
115+
});
116+
});
117+
});

src/claims/claims.controller.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {
2+
Controller,
3+
Get,
4+
Post,
5+
Body,
6+
Param,
7+
UploadedFile,
8+
UseInterceptors,
9+
UseGuards,
10+
} from '@nestjs/common';
11+
import { ClaimsService } from './claims.service';
12+
import { CreateClaimDto } from './dto/create-claim.dto';
13+
import { FileInterceptor } from '@nestjs/platform-express';
14+
import { multerConfig, multerOptions } from '../middleware/multer.middleware';
15+
import { LoggedGuard } from '../core/auth/logged.guard';
16+
17+
@Controller('claims')
18+
export class ClaimsController {
19+
constructor(private readonly claimsService: ClaimsService) {}
20+
21+
@UseGuards(LoggedGuard)
22+
@Post('policy/:policyId')
23+
@UseInterceptors(
24+
FileInterceptor('image', { ...multerConfig, ...multerOptions }),
25+
)
26+
async createClaim(
27+
@Param('policyId') policyId: string,
28+
@Body() createClaimDto: CreateClaimDto,
29+
@UploadedFile() file: Express.Multer.File,
30+
) {
31+
return this.claimsService.createClaim(policyId, createClaimDto, file);
32+
}
33+
34+
@UseGuards(LoggedGuard)
35+
@Get('policy/:policyId')
36+
async getClaimsByPolicyId(@Param('policyId') policyId: string) {
37+
return this.claimsService.findByPolicyId(policyId);
38+
}
39+
}

src/claims/claims.module.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Module } from '@nestjs/common';
2+
import { ClaimsService } from './claims.service';
3+
import { ClaimsController } from './claims.controller';
4+
import { PrismaService } from 'src/prisma/prisma.service';
5+
import { PrismaModule } from 'src/prisma/prisma.module';
6+
import { CoreModule } from 'src/core/core.module';
7+
8+
@Module({
9+
controllers: [ClaimsController],
10+
providers: [ClaimsService, PrismaService],
11+
imports: [PrismaModule, CoreModule],
12+
})
13+
export class ClaimsModule {}

0 commit comments

Comments
 (0)