universo-platform-3d
172 строки · 4.6 Кб
1import { INestApplication } from '@nestjs/common'
2import { Test, TestingModule } from '@nestjs/testing'
3import request from 'supertest'
4import { beforeAll, describe, it, vi } from 'vitest'
5import {
6AuthGuardFirebase,
7FirebaseTokenAuthGuard
8} from '../src/auth/auth.guard'
9import { FirebaseAuthenticationService } from '../src/firebase/firebase-authentication.service'
10import { ScriptEntityController } from '../src/script-entity/script-entity.controller'
11import {
12ScriptEntity,
13ScriptEntityDocument
14} from '../src/script-entity/script-entity.schema'
15import { ScriptEntityService } from '../src/script-entity/script-entity.service'
16import { FileUploadService } from '../src/util/file-upload/file-upload.service'
17import { LoggerModule } from '../src/util/logger/logger.module'
18import {
19MockScriptEntityService,
20getMockClassesForProvidersArray
21} from './mocks/service.mocks'
22
23describe('Script-Entity Controller With Guard (Integration)', () => {
24let app: INestApplication
25let service: ScriptEntityService
26const id = 'some-id'
27
28beforeAll(async () => {
29const moduleFixture: TestingModule = await Test.createTestingModule({
30imports: [LoggerModule],
31controllers: [ScriptEntityController],
32providers: [
33...getMockClassesForProvidersArray([
34FirebaseAuthenticationService,
35ScriptEntityService,
36FileUploadService
37])
38]
39})
40// Note: guard is NOT overridden here
41.compile()
42
43app = moduleFixture.createNestApplication()
44await app.init()
45
46service = moduleFixture.get(ScriptEntityService)
47})
48
49describe('Auth required endpoints', () => {
50it('should fail findOne without firebase auth', () => {
51return request(app.getHttpServer())
52.get(`/script-entity/${id}`)
53.expect(403)
54})
55it('should fail create without firebase auth', () => {
56return request(app.getHttpServer()).post('/script-entity').expect(403)
57})
58it('should fail update without firebase auth', () => {
59return request(app.getHttpServer())
60.patch(`/script-entity/${id}`)
61.expect(403)
62})
63it('should fail delete without firebase auth', () => {
64return request(app.getHttpServer())
65.delete(`/script-entity/${id}`)
66.expect(403)
67})
68})
69})
70
71describe('Script-Entity Controller WITHOUT Guard (Integration)', () => {
72let app: INestApplication
73let service: ScriptEntityService
74// Modify mockEntity as needed for the test
75const id = 'some-id'
76const mockEntity: ScriptEntity = {
77blocks: [{ foo: 'bar' }],
78_id: id
79}
80
81beforeAll(async () => {
82const moduleFixture: TestingModule = await Test.createTestingModule({
83controllers: [ScriptEntityController],
84providers: [
85{
86provide: ScriptEntityService,
87useClass: MockScriptEntityService
88},
89...getMockClassesForProvidersArray([
90FirebaseAuthenticationService,
91FileUploadService
92])
93]
94})
95.overrideGuard(AuthGuardFirebase)
96.useValue({
97canActivate: () => true
98})
99.overrideGuard(FirebaseTokenAuthGuard)
100.useValue({
101canActivate: () => true
102})
103.compile()
104
105app = moduleFixture.createNestApplication()
106await app.init()
107
108service = moduleFixture.get(ScriptEntityService)
109})
110
111it('find one by ID', async () => {
112// Arrange
113vi.spyOn(service, 'findOne').mockResolvedValue(
114mockEntity as ScriptEntityDocument
115)
116
117// Act
118await request(app.getHttpServer())
119.get(`/script-entity/${id}`)
120
121// Assert
122.expect(200)
123.expect(await service.findOne('some-id'))
124})
125
126it('create one', async () => {
127// Arrange
128vi.spyOn(service, 'create').mockResolvedValue(
129mockEntity as ScriptEntityDocument
130)
131
132// Act
133await request(app.getHttpServer())
134.post('/script-entity')
135.send(mockEntity)
136
137// Assert
138.expect(201)
139.expect(await service.create(mockEntity))
140})
141
142it('should update one with an id', async () => {
143// Arrange
144vi.spyOn(service, 'update').mockResolvedValue(
145mockEntity as ScriptEntityDocument
146)
147
148// Act
149await request(app.getHttpServer())
150.patch(`/script-entity/${id}`)
151.send(mockEntity)
152
153// Assert
154.expect(200)
155.expect(await service.update(id, mockEntity))
156})
157
158it('should delete one by id', async () => {
159// Arrange
160vi.spyOn(service, 'delete').mockResolvedValue(
161mockEntity as ScriptEntityDocument
162)
163
164// Act
165await request(app.getHttpServer())
166.delete(`/script-entity/${id}`)
167
168// Assert
169.expect(200)
170.expect(await service.delete(id))
171})
172})
173