Files
Gnuboard7/tests/Unit/Http/Requests/ActivityLog/ActivityLogIndexRequestTest.php
T
2026-04-01 10:30:52 +09:00

294 lines
9.4 KiB
PHP

<?php
namespace Tests\Unit\Http\Requests\ActivityLog;
use App\Enums\ActivityLogType;
use App\Http\Requests\ActivityLog\ActivityLogIndexRequest;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Validator;
use Tests\TestCase;
/**
* ActivityLogIndexRequest 검증 테스트
*
* 활동 로그 목록 조회 요청의 유효성 검증 규칙을 테스트합니다.
*/
class ActivityLogIndexRequestTest extends TestCase
{
use RefreshDatabase;
/**
* FormRequest 인스턴스의 rules를 사용하여 Validator 생성
*
* @param array $data 검증할 데이터
* @return \Illuminate\Validation\Validator
*/
private function makeValidator(array $data): \Illuminate\Validation\Validator
{
$request = new ActivityLogIndexRequest;
return Validator::make($data, $request->rules());
}
// ========================================================================
// authorize
// ========================================================================
public function test_authorize_returns_true(): void
{
$request = new ActivityLogIndexRequest;
$this->assertTrue($request->authorize());
}
// ========================================================================
// 빈 요청 (모두 optional)
// ========================================================================
public function test_empty_request_passes_validation(): void
{
$validator = $this->makeValidator([]);
$this->assertTrue($validator->passes());
}
// ========================================================================
// log_type
// ========================================================================
public function test_valid_log_type_array_passes(): void
{
$validator = $this->makeValidator([
'log_type' => ['admin', 'user'],
]);
$this->assertTrue($validator->passes());
}
public function test_all_log_type_values_pass(): void
{
$validator = $this->makeValidator([
'log_type' => ActivityLogType::values(),
]);
$this->assertTrue($validator->passes());
}
public function test_invalid_log_type_value_fails(): void
{
$validator = $this->makeValidator([
'log_type' => ['invalid_type'],
]);
$this->assertTrue($validator->fails());
}
// ========================================================================
// action
// ========================================================================
public function test_valid_action_passes(): void
{
$validator = $this->makeValidator([
'action' => 'user.create',
]);
$this->assertTrue($validator->passes());
}
public function test_action_exceeding_max_length_fails(): void
{
$validator = $this->makeValidator([
'action' => str_repeat('a', 101),
]);
$this->assertTrue($validator->fails());
}
// ========================================================================
// search
// ========================================================================
public function test_valid_search_passes(): void
{
$validator = $this->makeValidator([
'search' => '홍길동',
]);
$this->assertTrue($validator->passes());
}
public function test_search_exceeding_max_length_fails(): void
{
$validator = $this->makeValidator([
'search' => str_repeat('a', 256),
]);
$this->assertTrue($validator->fails());
}
// ========================================================================
// search_type
// ========================================================================
public function test_valid_search_type_values_pass(): void
{
foreach (['all', 'action', 'description', 'ip_address'] as $type) {
$validator = $this->makeValidator(['search_type' => $type]);
$this->assertTrue($validator->passes(), "search_type={$type} should pass");
}
}
public function test_invalid_search_type_fails(): void
{
$validator = $this->makeValidator(['search_type' => 'invalid']);
$this->assertTrue($validator->fails());
}
// ========================================================================
// actor
// ========================================================================
public function test_valid_actor_passes(): void
{
$validator = $this->makeValidator(['actor' => '홍길동']);
$this->assertTrue($validator->passes());
}
public function test_actor_exceeding_max_length_fails(): void
{
$validator = $this->makeValidator(['actor' => str_repeat('a', 256)]);
$this->assertTrue($validator->fails());
}
// ========================================================================
// date_from / date_to
// ========================================================================
public function test_valid_date_range_passes(): void
{
$validator = $this->makeValidator([
'date_from' => '2026-01-01',
'date_to' => '2026-03-28',
]);
$this->assertTrue($validator->passes());
}
public function test_date_to_before_date_from_fails(): void
{
$validator = $this->makeValidator([
'date_from' => '2026-03-28',
'date_to' => '2026-01-01',
]);
$this->assertTrue($validator->fails());
}
public function test_date_from_only_passes(): void
{
$validator = $this->makeValidator([
'date_from' => '2026-01-01',
]);
$this->assertTrue($validator->passes());
}
// ========================================================================
// per_page
// ========================================================================
public function test_valid_per_page_passes(): void
{
$validator = $this->makeValidator(['per_page' => 50]);
$this->assertTrue($validator->passes());
}
public function test_per_page_zero_fails(): void
{
$validator = $this->makeValidator(['per_page' => 0]);
$this->assertTrue($validator->fails());
}
public function test_per_page_exceeding_max_fails(): void
{
$validator = $this->makeValidator(['per_page' => 101]);
$this->assertTrue($validator->fails());
}
public function test_per_page_min_boundary_passes(): void
{
$validator = $this->makeValidator(['per_page' => 1]);
$this->assertTrue($validator->passes());
}
public function test_per_page_max_boundary_passes(): void
{
$validator = $this->makeValidator(['per_page' => 100]);
$this->assertTrue($validator->passes());
}
// ========================================================================
// sort_by / sort_order
// ========================================================================
public function test_valid_sort_by_values_pass(): void
{
foreach (['created_at', 'action', 'log_type'] as $sortBy) {
$validator = $this->makeValidator(['sort_by' => $sortBy]);
$this->assertTrue($validator->passes(), "sort_by={$sortBy} should pass");
}
}
public function test_invalid_sort_by_fails(): void
{
$validator = $this->makeValidator(['sort_by' => 'invalid_column']);
$this->assertTrue($validator->fails());
}
public function test_valid_sort_order_values_pass(): void
{
foreach (['asc', 'desc'] as $order) {
$validator = $this->makeValidator(['sort_order' => $order]);
$this->assertTrue($validator->passes(), "sort_order={$order} should pass");
}
}
public function test_invalid_sort_order_fails(): void
{
$validator = $this->makeValidator(['sort_order' => 'random']);
$this->assertTrue($validator->fails());
}
// ========================================================================
// user_id
// ========================================================================
public function test_valid_user_id_passes(): void
{
$user = \App\Models\User::factory()->create();
$validator = $this->makeValidator(['user_id' => $user->id]);
$this->assertTrue($validator->passes());
}
public function test_nonexistent_user_id_fails(): void
{
$validator = $this->makeValidator(['user_id' => 99999]);
$this->assertTrue($validator->fails());
}
// ========================================================================
// 복합 검증
// ========================================================================
public function test_all_valid_filters_combined_passes(): void
{
$user = \App\Models\User::factory()->create();
$validator = $this->makeValidator([
'log_type' => ['admin', 'system'],
'action' => 'user.update',
'user_id' => $user->id,
'loggable_type' => 'App\\Models\\User',
'search' => '검색어',
'search_type' => 'action',
'actor' => '홍길동',
'date_from' => '2026-01-01',
'date_to' => '2026-03-28',
'per_page' => 20,
'sort_by' => 'created_at',
'sort_order' => 'desc',
]);
$this->assertTrue($validator->passes());
}
}