assertTrue($request->authorize()); } public function test_rules_include_required_fields(): void { $request = new StoreRouteRequest(); $rules = $request->rules(); $this->assertArrayHasKey('feed_id', $rules); $this->assertArrayHasKey('platform_channel_id', $rules); $this->assertArrayHasKey('language_id', $rules); $this->assertArrayHasKey('is_active', $rules); $this->assertArrayHasKey('priority', $rules); $this->assertStringContainsString('required', $rules['feed_id']); $this->assertStringContainsString('exists:feeds,id', $rules['feed_id']); $this->assertStringContainsString('required', $rules['platform_channel_id']); $this->assertStringContainsString('exists:platform_channels,id', $rules['platform_channel_id']); $this->assertStringContainsString('required', $rules['language_id']); $this->assertStringContainsString('exists:languages,id', $rules['language_id']); } public function test_validation_passes_with_valid_data(): void { $language = Language::factory()->create(); $feed = Feed::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $language->id]); // Attach language to feed $feed->languages()->attach($language->id, [ 'url' => $feed->url, 'is_active' => true, 'is_primary' => true ]); $data = [ 'feed_id' => $feed->id, 'platform_channel_id' => $channel->id, 'language_id' => $language->id, 'is_active' => true, 'priority' => 50 ]; $request = new StoreRouteRequest(); $rules = $request->rules(); $validator = Validator::make($data, $rules); $this->assertTrue($validator->passes()); } public function test_validation_fails_without_required_fields(): void { $data = []; $request = new StoreRouteRequest(); $rules = $request->rules(); $validator = Validator::make($data, $rules); $this->assertFalse($validator->passes()); $this->assertArrayHasKey('feed_id', $validator->errors()->toArray()); $this->assertArrayHasKey('platform_channel_id', $validator->errors()->toArray()); $this->assertArrayHasKey('language_id', $validator->errors()->toArray()); } public function test_validation_fails_with_invalid_foreign_keys(): void { $data = [ 'feed_id' => 999, 'platform_channel_id' => 999, 'language_id' => 999, 'is_active' => true, 'priority' => 50 ]; $request = new StoreRouteRequest(); $rules = $request->rules(); $validator = Validator::make($data, $rules); $this->assertFalse($validator->passes()); $this->assertArrayHasKey('feed_id', $validator->errors()->toArray()); $this->assertArrayHasKey('platform_channel_id', $validator->errors()->toArray()); $this->assertArrayHasKey('language_id', $validator->errors()->toArray()); } public function test_language_consistency_validation_fails_when_feed_lacks_language(): void { $language1 = Language::factory()->create(); $language2 = Language::factory()->create(); $feed = Feed::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $language1->id]); // Attach only language2 to feed, but request language1 $feed->languages()->attach($language2->id, [ 'url' => $feed->url, 'is_active' => true, 'is_primary' => true ]); $data = [ 'feed_id' => $feed->id, 'platform_channel_id' => $channel->id, 'language_id' => $language1->id, 'is_active' => true, 'priority' => 50 ]; $request = new StoreRouteRequest(); $request->merge($data); $rules = $request->rules(); $validator = Validator::make($data, $rules); // Call the custom validation method $request->withValidator($validator); $this->assertFalse($validator->passes()); $this->assertStringContainsString('The selected feed does not support this language', $validator->errors()->first('language_id')); } public function test_language_consistency_validation_fails_when_channel_lacks_language(): void { $language1 = Language::factory()->create(); $language2 = Language::factory()->create(); $feed = Feed::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $language2->id]); // Attach language1 to feed, but channel has language2 $feed->languages()->attach($language1->id, [ 'url' => $feed->url, 'is_active' => true, 'is_primary' => true ]); $data = [ 'feed_id' => $feed->id, 'platform_channel_id' => $channel->id, 'language_id' => $language1->id, 'is_active' => true, 'priority' => 50 ]; $request = new StoreRouteRequest(); $request->merge($data); $rules = $request->rules(); $validator = Validator::make($data, $rules); // Call the custom validation method $request->withValidator($validator); $this->assertFalse($validator->passes()); $this->assertStringContainsString('The selected channel does not support this language', $validator->errors()->first('language_id')); } public function test_custom_messages(): void { $request = new StoreRouteRequest(); $messages = $request->messages(); $this->assertArrayHasKey('feed_id.required', $messages); $this->assertArrayHasKey('platform_channel_id.required', $messages); $this->assertArrayHasKey('language_id.required', $messages); $this->assertEquals('A feed must be selected.', $messages['feed_id.required']); $this->assertEquals('A platform channel must be selected.', $messages['platform_channel_id.required']); $this->assertEquals('A language must be selected.', $messages['language_id.required']); } }