rwadurian/backend/services/authorization-service/test/app.e2e-spec.ts

124 lines
4.2 KiB
TypeScript

import { Test, TestingModule } from '@nestjs/testing'
import { INestApplication, ValidationPipe } from '@nestjs/common'
import * as request from 'supertest'
import { AppModule } from '@/app.module'
import { GlobalExceptionFilter } from '@/shared/filters'
import { TransformInterceptor } from '@/shared/interceptors'
import { PrismaClient } from '@prisma/client'
describe('Authorization Service E2E Tests', () => {
let app: INestApplication
let prisma: PrismaClient
const isDockerEnv = process.env.NODE_ENV === 'test' && process.env.DATABASE_URL?.includes('test-db')
beforeAll(async () => {
// In Docker environment, infrastructure must be available
// In local environment, gracefully skip if infrastructure is not available
try {
// Initialize Prisma and run migrations
prisma = new PrismaClient()
await prisma.$connect()
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile()
app = moduleFixture.createNestApplication()
app.setGlobalPrefix('api/v1')
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}),
)
app.useGlobalFilters(new GlobalExceptionFilter())
app.useGlobalInterceptors(new TransformInterceptor())
await app.init()
console.log('E2E tests initialized successfully with infrastructure')
} catch (error) {
if (isDockerEnv) {
// In Docker, infrastructure should always be available
throw new Error(`E2E tests failed to initialize in Docker environment: ${error}`)
}
console.log('E2E tests skipped: Infrastructure not available')
console.log('To run E2E tests, ensure PostgreSQL, Redis, and Kafka are running')
console.log('Or use: docker-compose -f docker-compose.test.yml up')
}
}, 60000) // 60 second timeout for initialization
afterAll(async () => {
if (app) {
await app.close()
}
if (prisma) {
await prisma.$disconnect()
}
})
describe('Health Check', () => {
it('should be defined', () => {
expect(true).toBe(true)
})
})
describe('Authentication Tests', () => {
it('should return 401 for unauthorized access to /api/v1/authorizations/my', async () => {
if (!app) {
console.log('Skipping test: App not initialized')
return
}
return request(app.getHttpServer())
.get('/api/v1/authorizations/my')
.expect(401)
})
it('should return 401 for unauthorized access to /api/v1/admin/authorizations/province-company', async () => {
if (!app) {
console.log('Skipping test: App not initialized')
return
}
return request(app.getHttpServer())
.post('/api/v1/admin/authorizations/province-company')
.send({ userId: 'test', provinceCode: '430000', provinceName: '湖南省' })
.expect(401)
})
})
describe('Validation Tests', () => {
it('should return 401 when posting to /api/v1/authorizations/community without token', async () => {
if (!app) {
console.log('Skipping test: App not initialized')
return
}
return request(app.getHttpServer())
.post('/api/v1/authorizations/community')
.send({ communityName: '测试社区' })
.expect(401)
})
it('should return 401 when posting to /api/v1/authorizations/province without token', async () => {
if (!app) {
console.log('Skipping test: App not initialized')
return
}
return request(app.getHttpServer())
.post('/api/v1/authorizations/province')
.send({ provinceCode: '430000', provinceName: '湖南省' })
.expect(401)
})
it('should return 401 when posting to /api/v1/authorizations/city without token', async () => {
if (!app) {
console.log('Skipping test: App not initialized')
return
}
return request(app.getHttpServer())
.post('/api/v1/authorizations/city')
.send({ cityCode: '430100', cityName: '长沙市' })
.expect(401)
})
})
})