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