import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import request from 'supertest'; import { AppModule } from '../src/app.module'; describe('M2 E2E Tests', () => { let app: INestApplication; beforeAll(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); app.setGlobalPrefix('api', { exclude: ['admin-api/(.*)', 'internal/(.*)'] }); await app.init(); }); afterAll(async () => { await app.close(); }); async function loginAdmin(): Promise { const res = await request(app.getHttpServer()) .post('/admin-api/auth/login') .send({ email: 'admin@zhixi.app', password: 'admin123' }); return res.body?.data?.accessToken || ''; } // ══════════════════════════════════════════════ // M2-01: User & Account 深化 // ══════════════════════════════════════════════ describe('M2-01 User & Account Deepening', () => { let token: string; beforeAll(async () => { token = await loginAdmin(); }); // ── Admin membership management ── it('GET /admin-api/users/memberships → 200 member list', async () => { if (!token) return; const res = await request(app.getHttpServer()) .get('/admin-api/users/memberships') .set('Authorization', `Bearer ${token}`) .expect(200); expect(Array.isArray(res.body.data)).toBe(true); }); it('POST /admin-api/users/memberships → 200 assign membership', async () => { if (!token) return; const res = await request(app.getHttpServer()) .post('/admin-api/users/memberships') .set('Authorization', `Bearer ${token}`) .send({ userId: 'user1', planId: 'plan-free' }) .expect([200, 201]); expect(res.body.data).toHaveProperty('id'); }); // ── Admin deletion requests ── it('GET /admin-api/users/deletion-requests → 200 list', async () => { if (!token) return; const res = await request(app.getHttpServer()) .get('/admin-api/users/deletion-requests') .set('Authorization', `Bearer ${token}`) .expect(200); expect(Array.isArray(res.body.data)).toBe(true); }); it('POST /admin-api/users/deletion-requests/:id/approve → approve', async () => { if (!token) return; const res = await request(app.getHttpServer()) .post('/admin-api/users/deletion-requests/test-id/approve') .set('Authorization', `Bearer ${token}`) .expect([200, 201]); expect(res.body.data).toHaveProperty('status', 'completed'); }); it('POST /admin-api/users/deletion-requests/:id/reject → reject', async () => { if (!token) return; const res = await request(app.getHttpServer()) .post('/admin-api/users/deletion-requests/test-id2/reject') .set('Authorization', `Bearer ${token}`) .expect([200, 201]); expect(res.body.data).toHaveProperty('status', 'cancelled'); }); // ── Admin device view ── it('GET /admin-api/users/:userId/devices → 200 device list', async () => { if (!token) return; const res = await request(app.getHttpServer()) .get('/admin-api/users/user1/devices') .set('Authorization', `Bearer ${token}`) .expect(200); expect(Array.isArray(res.body.data)).toBe(true); }); }); });