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.

409 lines
13 KiB

11 months ago
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Visit;
use App\Models\VisitLog;
use App\Models\Study;
use App\Models\StudyAsk;
use App\Models\Blacklist;
use App\Models\Admin;
use App\Models\Department;
use App\Models\VisitArea;
use App\Models\VisitTime;
use App\Models\Upload;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Laravel\Sanctum\Sanctum;
class AdminControllerTest extends TestCase
{
use RefreshDatabase, WithFaker;
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();
// 认证管理员
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);
}
}