fedi-feed-router/backend/tests/Unit/Models/LanguageTest.php
2025-08-16 10:09:38 +02:00

151 lines
6.6 KiB
PHP

<?php
namespace Tests\Unit\Models;
use Domains\Feed\Models\Feed;
use Domains\Feed\Models\Route;
use Domains\Platform\Models\PlatformChannel;
use Domains\Settings\Models\Language;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class LanguageTest extends TestCase
{
use RefreshDatabase;
public function test_routes_relationship(): void
{
$language = Language::factory()->create();
$feed1 = Feed::factory()->create();
$feed2 = Feed::factory()->create();
$channel1 = PlatformChannel::factory()->create(['language_id' => $language->id]);
$channel2 = PlatformChannel::factory()->create(['language_id' => $language->id]);
$route1 = Route::create([
'feed_id' => $feed1->id,
'platform_channel_id' => $channel1->id,
'language_id' => $language->id,
'is_active' => true,
'priority' => 50
]);
$route2 = Route::create([
'feed_id' => $feed2->id,
'platform_channel_id' => $channel2->id,
'language_id' => $language->id,
'is_active' => false,
'priority' => 60
]);
$routes = $language->routes;
$this->assertCount(2, $routes);
$this->assertTrue($routes->contains('id', $route1->id));
$this->assertTrue($routes->contains('id', $route2->id));
}
public function test_available_for_routes_scope(): void
{
// Create languages
$language1 = Language::factory()->create(['is_active' => true]);
$language2 = Language::factory()->create(['is_active' => true]);
$language3 = Language::factory()->create(['is_active' => false]); // inactive language
// Create feeds and channels
$feed1 = Feed::factory()->create(['is_active' => true]);
$feed2 = Feed::factory()->create(['is_active' => false]); // inactive feed
$channel1 = PlatformChannel::factory()->create(['language_id' => $language1->id, 'is_active' => true]);
$channel2 = PlatformChannel::factory()->create(['language_id' => $language2->id, 'is_active' => false]); // inactive channel
// Attach languages to feeds
$feed1->languages()->attach($language1->id, ['url' => $feed1->url, 'is_active' => true, 'is_primary' => true]);
$feed2->languages()->attach($language2->id, ['url' => $feed2->url, 'is_active' => true, 'is_primary' => true]);
$feed1->languages()->attach($language3->id, ['url' => $feed1->url, 'is_active' => true, 'is_primary' => false]);
$availableLanguages = Language::availableForRoutes()->get();
// Only language1 should be available (has active feed and active channel)
$this->assertCount(1, $availableLanguages);
$this->assertEquals($language1->id, $availableLanguages->first()->id);
}
public function test_with_active_feeds_scope(): void
{
$language1 = Language::factory()->create(['is_active' => true]);
$language2 = Language::factory()->create(['is_active' => true]);
$activeFeed = Feed::factory()->create(['is_active' => true]);
$inactiveFeed = Feed::factory()->create(['is_active' => false]);
// Attach languages to feeds
$activeFeed->languages()->attach($language1->id, ['url' => $activeFeed->url, 'is_active' => true, 'is_primary' => true]);
$inactiveFeed->languages()->attach($language2->id, ['url' => $inactiveFeed->url, 'is_active' => true, 'is_primary' => true]);
$languagesWithActiveFeeds = Language::withActiveFeeds()->get();
$this->assertCount(1, $languagesWithActiveFeeds);
$this->assertEquals($language1->id, $languagesWithActiveFeeds->first()->id);
}
public function test_with_active_channels_scope(): void
{
$language1 = Language::factory()->create(['is_active' => true]);
$language2 = Language::factory()->create(['is_active' => true]);
PlatformChannel::factory()->create(['language_id' => $language1->id, 'is_active' => true]);
PlatformChannel::factory()->create(['language_id' => $language2->id, 'is_active' => false]);
$languagesWithActiveChannels = Language::withActiveChannels()->get();
$this->assertCount(1, $languagesWithActiveChannels);
$this->assertEquals($language1->id, $languagesWithActiveChannels->first()->id);
}
public function test_can_be_used_for_routes_method(): void
{
$language = Language::factory()->create(['is_active' => true]);
$feed = Feed::factory()->create(['is_active' => true]);
$channel = PlatformChannel::factory()->create(['language_id' => $language->id, 'is_active' => true]);
// Attach language to feed
$feed->languages()->attach($language->id, ['url' => $feed->url, 'is_active' => true, 'is_primary' => true]);
$this->assertTrue($language->canBeUsedForRoutes());
}
public function test_can_be_used_for_routes_method_returns_false_when_language_inactive(): void
{
$language = Language::factory()->create(['is_active' => false]);
$feed = Feed::factory()->create(['is_active' => true]);
$channel = PlatformChannel::factory()->create(['language_id' => $language->id, 'is_active' => true]);
// Attach language to feed
$feed->languages()->attach($language->id, ['url' => $feed->url, 'is_active' => true, 'is_primary' => true]);
$this->assertFalse($language->canBeUsedForRoutes());
}
public function test_can_be_used_for_routes_method_returns_false_when_no_active_feeds(): void
{
$language = Language::factory()->create(['is_active' => true]);
$feed = Feed::factory()->create(['is_active' => false]); // inactive feed
$channel = PlatformChannel::factory()->create(['language_id' => $language->id, 'is_active' => true]);
// Attach language to inactive feed
$feed->languages()->attach($language->id, ['url' => $feed->url, 'is_active' => true, 'is_primary' => true]);
$this->assertFalse($language->canBeUsedForRoutes());
}
public function test_can_be_used_for_routes_method_returns_false_when_no_active_channels(): void
{
$language = Language::factory()->create(['is_active' => true]);
$feed = Feed::factory()->create(['is_active' => true]);
$channel = PlatformChannel::factory()->create(['language_id' => $language->id, 'is_active' => false]); // inactive channel
// Attach language to feed
$feed->languages()->attach($language->id, ['url' => $feed->url, 'is_active' => true, 'is_primary' => true]);
$this->assertFalse($language->canBeUsedForRoutes());
}
}