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
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);
|
|
}
|
|
}
|