You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
8.9 KiB

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Visit;
use App\Models\Admin;
use App\Models\Department;
use App\Models\VisitArea;
use App\Models\VisitTime;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Sanctum\Sanctum;
class ApiRoutesTest extends TestCase
{
use RefreshDatabase;
protected $admin;
protected $department;
protected $visitArea;
protected $visitTime;
protected function setUp(): void
{
parent::setUp();
// 创建测试数据
$this->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);
}
}