initializeTestEnvironment(); // 创建测试服务 $this->userService = $this->createTestUserService(); $this->userController = new UserController($this->userService); } /** * 测试用户注册 API */ public function testUserRegistrationApi(): void { $userData = [ 'username' => 'integration_test_user', 'email' => 'integration@test.com', 'password' => 'testpassword123', 'nickname' => 'Integration Test User' ]; $request = $this->createRequest('POST', '/api/users/register', $userData); $response = $this->userController->register($request); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(201, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertArrayHasKey('user_id', $responseData); $this->assertArrayHasKey('token', $responseData); } /** * 测试用户登录 API */ public function testUserLoginApi(): void { // 先注册用户 $this->createTestUser(); $loginData = [ 'username' => 'integration_test_user', 'password' => 'testpassword123' ]; $request = $this->createRequest('POST', '/api/auth/login', $loginData); $response = $this->userController->login($request); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertArrayHasKey('token', $responseData); $this->assertArrayHasKey('user', $responseData); } /** * 测试获取用户信息 API */ public function testGetUserApi(): void { // 创建并登录用户 $user = $this->createTestUser(); $token = $this->authenticateUser($user); $request = $this->createRequest('GET', '/api/users/' . $user['id']); $request->headers->set('Authorization', "Bearer {$token}"); $response = $this->userController->show($request, $user['id']); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertEquals($user['id'], $responseData['user']['id']); $this->assertEquals('integration_test_user', $responseData['user']['username']); } /** * 测试更新用户信息 API */ public function testUpdateUserApi(): void { $user = $this->createTestUser(); $token = $this->authenticateUser($user); $updateData = [ 'nickname' => 'Updated Integration User', 'phone' => '13800138000' ]; $request = $this->createRequest('PUT', '/api/users/' . $user['id'], $updateData); $request->headers->set('Authorization', "Bearer {$token}"); $response = $this->userController->update($request, $user['id']); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertEquals('更新成功', $responseData['message']); } /** * 测试删除用户 API */ public function testDeleteUserApi(): void { $user = $this->createTestUser(); $token = $this->authenticateUser($user); $request = $this->createRequest('DELETE', '/api/users/' . $user['id']); $request->headers->set('Authorization', "Bearer {$token}"); $response = $this->userController->destroy($request, $user['id']); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertEquals('删除成功', $responseData['message']); } /** * 测试用户列表 API */ public function testUserListApi(): void { // 创建多个测试用户 for ($i = 1; $i <= 5; $i++) { $this->createTestUser("test_user_{$i}", "test{$i}@example.com"); } $request = $this->createRequest('GET', '/api/users?page=1&limit=10'); $response = $this->userController->index($request); $this->assertInstanceOf(HttpResponse::class, $response); $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); $this->assertArrayHasKey('items', $responseData['data']); $this->assertArrayHasKey('pagination', $responseData['data']); $this->assertLessThanOrEqual(10, count($responseData['data']['items'])); } /** * 测试分页功能 */ public function testPaginationFunctionality(): void { // 创建20个测试用户 for ($i = 1; $i <= 20; $i++) { $this->createTestUser("page_user_{$i}", "page{$i}@example.com"); } // 测试第一页 $request = $this->createRequest('GET', '/api/users?page=1&limit=5'); $response = $this->userController->index($request); $responseData = json_decode($response->getContent(), true); $this->assertEquals(5, count($responseData['data']['items'])); $this->assertEquals(1, $responseData['data']['pagination']['page']); $this->assertEquals(5, $responseData['data']['pagination']['page_size']); $this->assertEquals(4, $responseData['data']['pagination']['total_pages']); // 测试第二页 $request = $this->createRequest('GET', '/api/users?page=2&limit=5'); $response = $this->userController->index($request); $responseData = json_decode($response->getContent(), true); $this->assertEquals(5, count($responseData['data']['items'])); $this->assertEquals(2, $responseData['data']['pagination']['page']); } /** * 测试搜索功能 */ public function testSearchFunctionality(): void { // 创建测试用户 $this->createTestUser('search_user_1', 'search1@test.com'); $this->createTestUser('search_user_2', 'search2@test.com'); $this->createTestUser('other_user', 'other@test.com'); // 搜索用户名 $request = $this->createRequest('GET', '/api/users?search=search_user'); $response = $this->userController->index($request); $responseData = json_decode($response->getContent(), true); $this->assertEquals(2, count($responseData['data']['items'])); foreach ($responseData['data']['items'] as $user) { $this->assertStringContainsString('search_user', $user['username']); } } /** * 测试权限验证 */ public function testPermissionValidation(): void { $user = $this->createTestUser(); // 未认证访问 $request = $this->createRequest('GET', '/api/users/' . $user['id']); $response = $this->userController->show($request, $user['id']); $this->assertEquals(401, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertFalse($responseData['success']); $this->assertEquals('未授权访问', $responseData['message']); } /** * 测试输入验证 */ public function testInputValidation(): void { // 测试无效的注册数据 $invalidData = [ 'username' => '', // 空用户名 'email' => 'invalid-email', // 无效邮箱 'password' => '123', // 密码太短 ]; $request = $this->createRequest('POST', '/api/users/register', $invalidData); $response = $this->userController->register($request); $this->assertEquals(422, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertFalse($responseData['success']); $this->assertArrayHasKey('errors', $responseData); } /** * 测试并发请求处理 */ public function testConcurrentRequests(): void { $user = $this->createTestUser(); $token = $this->authenticateUser($user); // 模拟并发请求 $requests = []; for ($i = 0; $i < 10; $i++) { $request = $this->createRequest('GET', '/api/users/' . $user['id']); $request->headers->set('Authorization', "Bearer {$token}"); $requests[] = $request; } $responses = []; foreach ($requests as $request) { $responses[] = $this->userController->show($request, $user['id']); } // 验证所有请求都成功 foreach ($responses as $response) { $this->assertEquals(200, $response->getStatusCode()); $responseData = json_decode($response->getContent(), true); $this->assertTrue($responseData['success']); } } /** * 测试数据库事务 */ public function testDatabaseTransaction(): void { $userData = [ 'username' => 'transaction_test_user', 'email' => 'transaction@test.com', 'password' => 'testpassword123', 'nickname' => 'Transaction Test User' ]; $request = $this->createRequest('POST', '/api/users/register', $userData); // 模拟数据库错误 $this->simulateDatabaseError(); $response = $this->userController->register($request); // 验证事务回滚 $this->assertEquals(500, $response->getStatusCode()); // 验证用户未被创建 $checkRequest = $this->createRequest('GET', '/api/users?search=transaction_test_user'); $checkResponse = $this->userController->index($checkRequest); $checkData = json_decode($checkResponse->getContent(), true); $this->assertEquals(0, count($checkData['data']['items'])); } /** * 测试缓存功能 */ public function testCacheFunctionality(): void { $user = $this->createTestUser(); $token = $this->authenticateUser($user); // 第一次请求 $request1 = $this->createRequest('GET', '/api/users/' . $user['id']); $request1->headers->set('Authorization', "Bearer {$token}"); $response1 = $this->userController->show($request1, $user['id']); // 第二次请求(应该从缓存获取) $request2 = $this->createRequest('GET', '/api/users/' . $user['id']); $request2->headers->set('Authorization', "Bearer {$token}"); $response2 = $this->userController->show($request2, $user['id']); // 验证响应一致 $this->assertEquals( $response1->getContent(), $response2->getContent() ); } /** * 初始化测试环境 */ private function initializeTestEnvironment(): void { // 设置测试数据库 $this->setupTestDatabase(); // 设置测试缓存 $this->setupTestCache(); // 清理测试数据 $this->cleanupTestData(); } /** * 设置测试数据库 */ private function setupTestDatabase(): void { // 创建内存数据库 // 运行迁移 // 设置测试数据 } /** * 设置测试缓存 */ private function setupTestCache(): void { // 使用数组缓存驱动 // 清空缓存 } /** * 清理测试数据 */ private function cleanupTestData(): void { // 删除测试用户 // 清理缓存 } /** * 创建测试用户服务 */ private function createTestUserService(): UserService { // 返回配置好的测试服务 return new UserService(/* test dependencies */); } /** * 创建测试用户 */ private function createTestUser(string $username = 'integration_test_user', string $email = 'integration@test.com'): array { $userData = [ 'username' => $username, 'email' => $email, 'password' => 'testpassword123', 'nickname' => 'Integration Test User' ]; $request = $this->createRequest('POST', '/api/users/register', $userData); $response = $this->userController->register($request); $responseData = json_decode($response->getContent(), true); return [ 'id' => $responseData['user_id'], 'username' => $username, 'email' => $email ]; } /** * 认证用户 */ private function authenticateUser(array $user): string { $loginData = [ 'username' => $user['username'], 'password' => 'testpassword123' ]; $request = $this->createRequest('POST', '/api/auth/login', $loginData); $response = $this->userController->login($request); $responseData = json_decode($response->getContent(), true); return $responseData['token']; } /** * 创建请求对象 */ private function createRequest(string $method, string $uri, array $data = []): Request { $request = new Request(); // 设置请求方法 $_SERVER['REQUEST_METHOD'] = $method; // 设置请求URI $_SERVER['REQUEST_URI'] = $uri; // 设置请求数据 if ($method === 'POST' || $method === 'PUT') { $_POST = $data; $_REQUEST = array_merge($_REQUEST, $data); } else { $_GET = array_merge($_GET, $data); $_REQUEST = array_merge($_REQUEST, $data); } return $request; } /** * 模拟数据库错误 */ private function simulateDatabaseError(): void { // 模拟数据库连接错误或其他异常 } }