department = Department::factory()->create(); $this->admin = Admin::factory()->create(['department_id' => $this->department->id]); $this->visitArea = VisitArea::factory()->create(); $this->visitTime = VisitTime::factory()->create(); } /** @test */ public function test_routes_exist() { // 测试门岗端路由 $this->assertTrue(\Route::has('gate.visits.index')); $this->assertTrue(\Route::has('gate.visits.show')); $this->assertTrue(\Route::has('gate.visits.update')); // 测试后台管理路由 $this->assertTrue(\Route::has('admin.visits.index')); $this->assertTrue(\Route::has('admin.visits.show')); $this->assertTrue(\Route::has('admin.visits.save')); $this->assertTrue(\Route::has('admin.visits.destroy')); $this->assertTrue(\Route::has('admin.visit-logs.index')); $this->assertTrue(\Route::has('admin.visit-logs.show')); $this->assertTrue(\Route::has('admin.visit-logs.save')); $this->assertTrue(\Route::has('admin.visit-logs.destroy')); $this->assertTrue(\Route::has('admin.studies.index')); $this->assertTrue(\Route::has('admin.studies.show')); $this->assertTrue(\Route::has('admin.studies.save')); $this->assertTrue(\Route::has('admin.studies.destroy')); $this->assertTrue(\Route::has('admin.blacklists.index')); $this->assertTrue(\Route::has('admin.blacklists.show')); $this->assertTrue(\Route::has('admin.blacklists.save')); $this->assertTrue(\Route::has('admin.blacklists.destroy')); } /** @test */ public function test_gate_routes_are_accessible() { // 创建测试拜访记录 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); // 测试门岗端拜访列表 $response = $this->getJson('/api/gate/visits'); $response->assertStatus(200); // 测试门岗端拜访详情 $response = $this->getJson("/api/gate/visits/{$visit->id}"); $response->assertStatus(200); // 测试门岗端拜访更新 $response = $this->postJson("/api/gate/visits/{$visit->id}/update", [ 'action' => 'enter', ]); $response->assertStatus(200); } /** @test */ public function test_admin_routes_require_authentication() { // 测试未认证的请求 $response = $this->getJson('/api/admin/visits/index'); $response->assertStatus(401); $response = $this->getJson('/api/admin/visits/show?id=1'); $response->assertStatus(401); $response = $this->postJson('/api/admin/visits/save', []); $response->assertStatus(401); $response = $this->postJson('/api/admin/visits/destroy?id=1'); $response->assertStatus(401); } /** @test */ public function test_admin_routes_with_authentication() { // 认证管理员 Sanctum::actingAs($this->admin, ['admin']); // 创建测试拜访记录 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); // 测试后台管理拜访列表 $response = $this->getJson('/api/admin/visits/index?token=' . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200); // 测试后台管理拜访详情 $response = $this->getJson("/api/admin/visits/show?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200); // 测试后台管理拜访保存 $response = $this->postJson('/api/admin/visits/save?token=' . $this->admin->createToken('test')->plainTextToken, [ 'name' => '测试访客', 'mobile' => '13800138000', 'type' => Visit::TYPE_VISITOR, 'date' => now()->format('Y-m-d'), 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); $response->assertStatus(200); // 测试后台管理拜访删除 $response = $this->postJson("/api/admin/visits/destroy?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200); } /** @test */ public function test_multilingual_support() { // 创建测试拜访记录 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); // 测试中文响应 $response = $this->withHeaders(['Accept-Language' => 'zh-CN']) ->getJson('/api/gate/visits'); $response->assertStatus(200); // 测试英文响应 $response = $this->withHeaders(['Accept-Language' => 'en']) ->getJson('/api/gate/visits'); $response->assertStatus(200); // 测试默认语言响应 $response = $this->getJson('/api/gate/visits'); $response->assertStatus(200); } /** @test */ public function test_api_response_structure() { // 创建测试拜访记录 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); // 测试门岗端响应结构 $response = $this->getJson('/api/gate/visits'); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' ]); // 测试后台管理响应结构 Sanctum::actingAs($this->admin, ['admin']); $response = $this->getJson('/api/admin/visits/index?token=' . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' ]); } /** @test */ public function test_error_handling() { // 测试404错误 $response = $this->getJson('/api/gate/visits/999999'); $response->assertStatus(200) ->assertJson([ 'code' => 404 ]); // 测试无效操作 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, ]); $response = $this->postJson("/api/gate/visits/{$visit->id}/update", [ 'action' => 'invalid_action', ]); $response->assertStatus(200) ->assertJson([ 'code' => 400 ]); } /** @test */ public function test_file_relationships() { // 创建测试上传文件 $upload = \App\Models\Upload::factory()->create(); // 创建测试拜访记录 $visit = Visit::factory()->create([ 'accept_department_id' => $this->department->id, 'accept_admin_id' => $this->admin->id, 'visit_area_id' => $this->visitArea->id, 'visit_time_id' => $this->visitTime->id, 'accept_admin_sign' => $upload->id, 'file' => [$upload->id], 'vehicle_images' => [$upload->id], ]); // 测试文件关联关系 $this->assertNotNull($visit->acceptAdminSign); $this->assertEquals($upload->id, $visit->acceptAdminSign->id); $this->assertCount(1, $visit->files); $this->assertEquals($upload->id, $visit->files->first()->id); $this->assertCount(1, $visit->vehicle_images); $this->assertEquals($upload->id, $visit->vehicle_images->first()->id); } }