department = Department::factory()->create(); $this->admin = Admin::factory()->create(['department_id' => $this->department->id]); $this->visitArea = VisitArea::factory()->create(); $this->visitTime = VisitTime::factory()->create(); // 认证管理员 Sanctum::actingAs($this->admin, ['admin']); } /** @test */ public function it_can_get_visit_list() { // 创建测试拜访记录 $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) ->assertJsonStructure([ 'code', 'message', 'data' => [ 'current_page', 'data', 'total' ] ]); } /** @test */ public function it_can_get_visit_detail() { // 创建测试拜访记录 $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/show?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' => [ 'id', 'name', 'mobile', 'type', 'audit_status', 'date', 'visit_area', 'visit_time', 'accept_department', 'accept_admin', 'accept_admin_sign', 'logs', ] ]); } /** @test */ public function it_can_save_visit() { $visitData = [ 'name' => '测试访客', 'mobile' => '13800138000', 'type' => Visit::TYPE_VISITOR, 'date' => now()->format('Y-m-d'), 'start_date' => now()->format('Y-m-d'), 'end_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, 'audit_status' => Visit::AUDIT_STATUS_PENDING, ]; $response = $this->postJson('/api/admin/visits/save?token=' . $this->admin->createToken('test')->plainTextToken, $visitData); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertDatabaseHas('visits', [ 'name' => '测试访客', 'mobile' => '13800138000', 'type' => Visit::TYPE_VISITOR, ]); } /** @test */ public function it_can_update_visit() { // 创建测试拜访记录 $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, ]); $updateData = [ 'id' => $visit->id, 'name' => '更新后的访客', 'mobile' => '13900139000', 'type' => Visit::TYPE_VISITOR, 'date' => now()->format('Y-m-d'), 'start_date' => now()->format('Y-m-d'), 'end_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, 'audit_status' => Visit::AUDIT_STATUS_APPROVED, ]; $response = $this->postJson('/api/admin/visits/save?token=' . $this->admin->createToken('test')->plainTextToken, $updateData); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $visit->refresh(); $this->assertEquals('更新后的访客', $visit->name); $this->assertEquals('13900139000', $visit->mobile); $this->assertEquals(Visit::AUDIT_STATUS_APPROVED, $visit->audit_status); } /** @test */ public function it_can_delete_visit() { // 创建测试拜访记录 $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/admin/visits/destroy?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertSoftDeleted('visits', ['id' => $visit->id]); } /** @test */ public function it_can_get_visit_log_list() { // 创建测试拜访记录和日志 $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, ]); $log = VisitLog::factory()->create([ 'visit_id' => $visit->id, 'admin_id' => $this->admin->id, ]); $response = $this->getJson('/api/admin/visit-logs/index?token=' . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' => [ 'current_page', 'data', 'total' ] ]); } /** @test */ public function it_can_save_visit_log() { // 创建测试拜访记录 $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, ]); $logData = [ 'visit_id' => $visit->id, 'type' => VisitLog::TYPE_ENTER, 'remark' => '测试日志', ]; $response = $this->postJson('/api/admin/visit-logs/save?token=' . $this->admin->createToken('test')->plainTextToken, $logData); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertDatabaseHas('visit_logs', [ 'visit_id' => $visit->id, 'type' => VisitLog::TYPE_ENTER, 'remark' => '测试日志', ]); } /** @test */ public function it_can_delete_visit_log() { // 创建测试拜访记录和日志 $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, ]); $log = VisitLog::factory()->create([ 'visit_id' => $visit->id, 'admin_id' => $this->admin->id, ]); $response = $this->postJson("/api/admin/visit-logs/destroy?id={$log->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertSoftDeleted('visit_logs', ['id' => $log->id]); } /** @test */ public function it_can_get_study_list() { // 创建测试学习记录 $study = Study::factory()->create(); $response = $this->getJson('/api/admin/studies/index?token=' . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' => [ 'current_page', 'data', 'total' ] ]); } /** @test */ public function it_can_save_study() { $studyData = [ 'name' => '测试学习', 'content' => '学习内容', 'type' => Study::TYPE_VISITOR, 'expire_day' => 30, 'minute' => 60, 'rate' => 80.0, ]; $response = $this->postJson('/api/admin/studies/save?token=' . $this->admin->createToken('test')->plainTextToken, $studyData); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertDatabaseHas('studies', [ 'name' => '测试学习', 'content' => '学习内容', 'type' => Study::TYPE_VISITOR, ]); } /** @test */ public function it_can_get_blacklist() { // 创建测试黑名单记录 $blacklist = Blacklist::factory()->create(); $response = $this->getJson('/api/admin/blacklists/index?token=' . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200) ->assertJsonStructure([ 'code', 'message', 'data' => [ 'current_page', 'data', 'total' ] ]); } /** @test */ public function it_can_save_blacklist() { $blacklistData = [ 'name' => '测试黑名单', 'mobile' => '13800138000', 'idcard' => '110101199001011234', 'credent' => Blacklist::CREDENT_ID_CARD, 'status' => Blacklist::STATUS_ENABLED, ]; $response = $this->postJson('/api/admin/blacklists/save?token=' . $this->admin->createToken('test')->plainTextToken, $blacklistData); $response->assertStatus(200) ->assertJson([ 'code' => 200, 'message' => 'success' ]); $this->assertDatabaseHas('blacklists', [ 'name' => '测试黑名单', 'mobile' => '13800138000', 'idcard' => '110101199001011234', ]); } /** @test */ public function it_requires_authentication_for_admin_routes() { $response = $this->getJson('/api/admin/visits/index'); $response->assertStatus(401); } /** @test */ public function it_supports_multilingual_responses() { $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/admin/visits/show?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200); // 测试英文响应 $response = $this->withHeaders(['Accept-Language' => 'en']) ->getJson("/api/admin/visits/show?id={$visit->id}&token=" . $this->admin->createToken('test')->plainTextToken); $response->assertStatus(200); } }