service = new RoutingValidationService(); } public function test_validate_language_compatibility_passes_when_feed_has_no_language(): void { $feed = Feed::factory()->create(['language_id' => null]); $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]), PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]), ]); $this->service->validateLanguageCompatibility($feed, $channels); // If we get here without exception, the test passes $this->assertTrue(true); } public function test_validate_language_compatibility_passes_when_channels_have_no_language(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => null, 'platform_instance_id' => $instance->id]), PlatformChannel::factory()->create(['language_id' => null, 'platform_instance_id' => $instance->id]), ]); $this->service->validateLanguageCompatibility($feed, $channels); // If we get here without exception, the test passes $this->assertTrue(true); } public function test_validate_language_compatibility_passes_when_languages_match(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]), PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]), ]); $this->service->validateLanguageCompatibility($feed, $channels); // If we get here without exception, the test passes $this->assertTrue(true); } public function test_validate_language_compatibility_passes_with_mixed_null_and_matching_languages(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]), PlatformChannel::factory()->create(['language_id' => null, 'platform_instance_id' => $instance->id]), PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]), ]); $this->service->validateLanguageCompatibility($feed, $channels); // If we get here without exception, the test passes $this->assertTrue(true); } public function test_validate_language_compatibility_throws_exception_when_languages_mismatch(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]); $channels = collect([$channel]); $this->expectException(RoutingMismatchException::class); $this->service->validateLanguageCompatibility($feed, $channels); } public function test_validate_language_compatibility_throws_exception_on_first_mismatch(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $mismatchChannel = PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]); $matchingChannel = PlatformChannel::factory()->create(['language_id' => $enLanguage->id, 'platform_instance_id' => $instance->id]); $channels = collect([$mismatchChannel, $matchingChannel]); $this->expectException(RoutingMismatchException::class); $this->service->validateLanguageCompatibility($feed, $channels); } public function test_validate_language_compatibility_with_empty_collection(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $channels = collect([]); $this->service->validateLanguageCompatibility($feed, $channels); // If we get here without exception, the test passes $this->assertTrue(true); } public function test_validate_language_compatibility_exception_contains_correct_feed_and_channel(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]); $channels = collect([$channel]); try { $this->service->validateLanguageCompatibility($feed, $channels); $this->fail('Expected RoutingMismatchException to be thrown'); } catch (RoutingMismatchException $e) { // Exception should contain the feed and channel that caused the mismatch $this->assertInstanceOf(RoutingMismatchException::class, $e); } } public function test_validate_language_compatibility_with_multiple_mismatching_channels(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $frLanguage = Language::factory()->create(['short_code' => 'fr']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]), // This should trigger exception PlatformChannel::factory()->create(['language_id' => $frLanguage->id, 'platform_instance_id' => $instance->id]), // This won't be reached ]); $this->expectException(RoutingMismatchException::class); $this->service->validateLanguageCompatibility($feed, $channels); } public function test_validate_language_compatibility_ignores_channels_after_first_mismatch(): void { $enLanguage = Language::factory()->create(['short_code' => 'en']); $esLanguage = Language::factory()->create(['short_code' => 'es']); $frLanguage = Language::factory()->create(['short_code' => 'fr']); $feed = Feed::factory()->create(['language_id' => $enLanguage->id]); $instance = PlatformInstance::factory()->create(); $channels = collect([ PlatformChannel::factory()->create(['language_id' => null, 'platform_instance_id' => $instance->id]), // Should be skipped PlatformChannel::factory()->create(['language_id' => $esLanguage->id, 'platform_instance_id' => $instance->id]), // Should cause exception PlatformChannel::factory()->create(['language_id' => $frLanguage->id, 'platform_instance_id' => $instance->id]), // Should not be reached ]); $this->expectException(RoutingMismatchException::class); $this->service->validateLanguageCompatibility($feed, $channels); } }