|
|
@@ -0,0 +1,271 @@
|
|
|
+import { describe, it, expect } from 'vitest';
|
|
|
+import { IntegrationTestAssertions, ApiResponseAssertions } from '../../src/integration-test-utils';
|
|
|
+
|
|
|
+// 模拟实体用于测试
|
|
|
+class MockEntity {
|
|
|
+ id?: number;
|
|
|
+ name?: string;
|
|
|
+}
|
|
|
+
|
|
|
+describe('IntegrationTestAssertions', () => {
|
|
|
+ describe('expectStatus', () => {
|
|
|
+ it('应该在状态码匹配时通过', () => {
|
|
|
+ const response = { status: 200 };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectStatus(response, 200);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在状态码不匹配时抛出错误', () => {
|
|
|
+ const response = { status: 404 };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectStatus(response, 200);
|
|
|
+ }).toThrow('Expected status 200, but got 404');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectResponseToHave', () => {
|
|
|
+ it('应该在响应包含特定字段时通过', () => {
|
|
|
+ const response = { data: { id: 1, name: 'test' } };
|
|
|
+ const expectedFields = { id: 1, name: 'test' };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectResponseToHave(response, expectedFields);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在字段值不匹配时抛出错误', () => {
|
|
|
+ const response = { data: { id: 1, name: 'test' } };
|
|
|
+ const expectedFields = { id: 2, name: 'test' };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectResponseToHave(response, expectedFields);
|
|
|
+ }).toThrow('Expected field id to be 2, but got 1');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在字段不存在时抛出错误', () => {
|
|
|
+ const response = { data: { id: 1 } };
|
|
|
+ const expectedFields = { name: 'test' };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectResponseToHave(response, expectedFields);
|
|
|
+ }).toThrow('Expected field name to be test, but got undefined');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectResponseStructure', () => {
|
|
|
+ it('应该在响应包含特定结构时通过', () => {
|
|
|
+ const response = { data: { id: 1, name: 'test', email: 'test@example.com' } };
|
|
|
+ const structure = { id: 'number', name: 'string', email: 'string' };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectResponseStructure(response, structure);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在响应缺少字段时抛出错误', () => {
|
|
|
+ const response = { data: { id: 1, name: 'test' } };
|
|
|
+ const structure = { id: 'number', name: 'string', email: 'string' };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectResponseStructure(response, structure);
|
|
|
+ }).toThrow('Expected response to have key: email');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectErrorResponse', () => {
|
|
|
+ it('应该在响应包含错误信息时通过', () => {
|
|
|
+ const response = { data: { error: 'Validation failed' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectErrorResponse(response, 'Validation');
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在响应不包含错误信息时抛出错误', () => {
|
|
|
+ const response = { data: { success: true } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectErrorResponse(response, 'Validation');
|
|
|
+ }).toThrow('Expected error response to contain "Validation"');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在错误信息不匹配时抛出错误', () => {
|
|
|
+ const response = { data: { error: 'Authentication failed' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectErrorResponse(response, 'Validation');
|
|
|
+ }).toThrow('Expected error response to contain "Validation"');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectSuccessResponse', () => {
|
|
|
+ it('应该在成功响应时通过', () => {
|
|
|
+ const response = { data: { success: true, data: {} } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectSuccessResponse(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在响应包含错误时抛出错误', () => {
|
|
|
+ const response = { data: { error: 'Something went wrong' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectSuccessResponse(response);
|
|
|
+ }).toThrow('Expected success response');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在响应为空时抛出错误', () => {
|
|
|
+ const response = { data: null };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectSuccessResponse(response);
|
|
|
+ }).toThrow('Expected success response');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectListResponseCount', () => {
|
|
|
+ it('应该在列表响应数量匹配时通过', () => {
|
|
|
+ const response = { data: [1, 2, 3] };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectListResponseCount(response, 3);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在列表响应数量不匹配时抛出错误', () => {
|
|
|
+ const response = { data: [1, 2, 3] };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectListResponseCount(response, 5);
|
|
|
+ }).toThrow('Expected 5 items, but got 3');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在响应不是数组时抛出错误', () => {
|
|
|
+ const response = { data: { items: [1, 2, 3] } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectListResponseCount(response, 3);
|
|
|
+ }).toThrow('Expected array response');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectPaginationResponse', () => {
|
|
|
+ it('应该在分页响应格式正确时通过', () => {
|
|
|
+ const response = {
|
|
|
+ data: {
|
|
|
+ data: [1, 2, 3],
|
|
|
+ total: 10,
|
|
|
+ page: 1,
|
|
|
+ pageSize: 3
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectPaginationResponse(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在缺少分页字段时抛出错误', () => {
|
|
|
+ const response = {
|
|
|
+ data: {
|
|
|
+ data: [1, 2, 3],
|
|
|
+ total: 10
|
|
|
+ // 缺少 page 和 pageSize
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectPaginationResponse(response);
|
|
|
+ }).toThrow('Expected pagination response to have field: page');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在数据不是数组时抛出错误', () => {
|
|
|
+ const response = {
|
|
|
+ data: {
|
|
|
+ data: { items: [1, 2, 3] }, // 应该是数组
|
|
|
+ total: 10,
|
|
|
+ page: 1,
|
|
|
+ pageSize: 3
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ IntegrationTestAssertions.expectPaginationResponse(response);
|
|
|
+ }).toThrow('Expected pagination data to be an array');
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+describe('ApiResponseAssertions', () => {
|
|
|
+ describe('expectSuccess', () => {
|
|
|
+ it('应该在成功响应时通过', () => {
|
|
|
+ const response = { status: 200, data: { success: true } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectSuccess(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该在状态码不是200时抛出错误', () => {
|
|
|
+ const response = { status: 404, data: { success: true } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectSuccess(response);
|
|
|
+ }).toThrow('Expected status 200, but got 404');
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectCreated', () => {
|
|
|
+ it('应该在创建响应时通过', () => {
|
|
|
+ const response = { status: 201, data: { id: 1 } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectCreated(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectUnauthorized', () => {
|
|
|
+ it('应该在未授权响应时通过', () => {
|
|
|
+ const response = { status: 401, data: { error: 'Unauthorized access' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectUnauthorized(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectForbidden', () => {
|
|
|
+ it('应该在禁止访问响应时通过', () => {
|
|
|
+ const response = { status: 403, data: { error: 'Forbidden access' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectForbidden(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectNotFound', () => {
|
|
|
+ it('应该在未找到响应时通过', () => {
|
|
|
+ const response = { status: 404, data: { error: 'Resource not found' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectNotFound(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('expectValidationError', () => {
|
|
|
+ it('应该在验证错误响应时通过', () => {
|
|
|
+ const response = { status: 400, data: { error: 'Validation failed' } };
|
|
|
+
|
|
|
+ expect(() => {
|
|
|
+ ApiResponseAssertions.expectValidationError(response);
|
|
|
+ }).not.toThrow();
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|