assertEquals($fillableFields, $channel->getFillable()); } public function test_table_name(): void { $channel = new PlatformChannel(); $this->assertEquals('platform_channels', $channel->getTable()); } public function test_casts_is_active_to_boolean(): void { $channel = PlatformChannel::factory()->create(['is_active' => '1']); $this->assertIsBool($channel->is_active); $this->assertTrue($channel->is_active); $channel->update(['is_active' => '0']); $channel->refresh(); $this->assertIsBool($channel->is_active); $this->assertFalse($channel->is_active); } public function test_belongs_to_platform_instance_relationship(): void { $instance = PlatformInstance::factory()->create(); $channel = PlatformChannel::factory()->create(['platform_instance_id' => $instance->id]); $this->assertInstanceOf(PlatformInstance::class, $channel->platformInstance); $this->assertEquals($instance->id, $channel->platformInstance->id); $this->assertEquals($instance->name, $channel->platformInstance->name); } public function test_belongs_to_language_relationship(): void { $language = Language::factory()->create(); $channel = PlatformChannel::factory()->create(['language_id' => $language->id]); $this->assertInstanceOf(Language::class, $channel->language); $this->assertEquals($language->id, $channel->language->id); $this->assertEquals($language->name, $channel->language->name); } public function test_belongs_to_many_platform_accounts_relationship(): void { $channel = PlatformChannel::factory()->create(); $account1 = PlatformAccount::factory()->create(); $account2 = PlatformAccount::factory()->create(); // Attach accounts with pivot data $channel->platformAccounts()->attach($account1->id, [ 'is_active' => true, 'priority' => 100 ]); $channel->platformAccounts()->attach($account2->id, [ 'is_active' => false, 'priority' => 50 ]); $accounts = $channel->platformAccounts; $this->assertCount(2, $accounts); $this->assertTrue($accounts->contains('id', $account1->id)); $this->assertTrue($accounts->contains('id', $account2->id)); // Test pivot data $account1FromRelation = $accounts->find($account1->id); $this->assertEquals(1, $account1FromRelation->pivot->is_active); $this->assertEquals(100, $account1FromRelation->pivot->priority); $account2FromRelation = $accounts->find($account2->id); $this->assertEquals(0, $account2FromRelation->pivot->is_active); $this->assertEquals(50, $account2FromRelation->pivot->priority); } public function test_active_platform_accounts_relationship(): void { $channel = PlatformChannel::factory()->create(); $activeAccount1 = PlatformAccount::factory()->create(); $activeAccount2 = PlatformAccount::factory()->create(); $inactiveAccount = PlatformAccount::factory()->create(); // Attach accounts $channel->platformAccounts()->attach($activeAccount1->id, [ 'is_active' => true, 'priority' => 100 ]); $channel->platformAccounts()->attach($activeAccount2->id, [ 'is_active' => true, 'priority' => 200 ]); $channel->platformAccounts()->attach($inactiveAccount->id, [ 'is_active' => false, 'priority' => 150 ]); $activeAccounts = $channel->activePlatformAccounts; $this->assertCount(2, $activeAccounts); $this->assertTrue($activeAccounts->contains('id', $activeAccount1->id)); $this->assertTrue($activeAccounts->contains('id', $activeAccount2->id)); $this->assertFalse($activeAccounts->contains('id', $inactiveAccount->id)); } public function test_full_name_attribute(): void { $instance = PlatformInstance::factory()->create(['url' => 'https://lemmy.example.com']); $channel = PlatformChannel::factory()->create([ 'platform_instance_id' => $instance->id, 'name' => 'technology' ]); $this->assertEquals('https://lemmy.example.com/c/technology', $channel->full_name); } public function test_belongs_to_many_feeds_relationship(): void { $channel = PlatformChannel::factory()->create(); $feed1 = Feed::factory()->create(); $feed2 = Feed::factory()->create(); // Create routes (which act as pivot records) Route::create([ 'feed_id' => $feed1->id, 'platform_channel_id' => $channel->id, 'is_active' => true, 'priority' => 100 ]); Route::create([ 'feed_id' => $feed2->id, 'platform_channel_id' => $channel->id, 'is_active' => false, 'priority' => 50 ]); $feeds = $channel->feeds; $this->assertCount(2, $feeds); $this->assertTrue($feeds->contains('id', $feed1->id)); $this->assertTrue($feeds->contains('id', $feed2->id)); // Test pivot data $feed1FromRelation = $feeds->find($feed1->id); $this->assertEquals(1, $feed1FromRelation->pivot->is_active); $this->assertEquals(100, $feed1FromRelation->pivot->priority); } public function test_active_feeds_relationship(): void { $channel = PlatformChannel::factory()->create(); $activeFeed1 = Feed::factory()->create(); $activeFeed2 = Feed::factory()->create(); $inactiveFeed = Feed::factory()->create(); // Create routes Route::create([ 'feed_id' => $activeFeed1->id, 'platform_channel_id' => $channel->id, 'is_active' => true, 'priority' => 100 ]); Route::create([ 'feed_id' => $activeFeed2->id, 'platform_channel_id' => $channel->id, 'is_active' => true, 'priority' => 200 ]); Route::create([ 'feed_id' => $inactiveFeed->id, 'platform_channel_id' => $channel->id, 'is_active' => false, 'priority' => 150 ]); $activeFeeds = $channel->activeFeeds; $this->assertCount(2, $activeFeeds); $this->assertTrue($activeFeeds->contains('id', $activeFeed1->id)); $this->assertTrue($activeFeeds->contains('id', $activeFeed2->id)); $this->assertFalse($activeFeeds->contains('id', $inactiveFeed->id)); // Test ordering by priority descending $feedIds = $activeFeeds->pluck('id')->toArray(); $this->assertEquals($activeFeed2->id, $feedIds[0]); // Priority 200 $this->assertEquals($activeFeed1->id, $feedIds[1]); // Priority 100 } public function test_channel_creation_with_factory(): void { $channel = PlatformChannel::factory()->create(); $this->assertInstanceOf(PlatformChannel::class, $channel); $this->assertNotNull($channel->platform_instance_id); $this->assertIsString($channel->name); $this->assertIsString($channel->channel_id); $this->assertIsBool($channel->is_active); } public function test_channel_creation_with_explicit_values(): void { $instance = PlatformInstance::factory()->create(); $language = Language::factory()->create(); $channel = PlatformChannel::create([ 'platform_instance_id' => $instance->id, 'name' => 'test_channel', 'display_name' => 'Test Channel', 'channel_id' => 'channel_123', 'description' => 'A test channel', 'language_id' => $language->id, 'is_active' => false ]); $this->assertEquals($instance->id, $channel->platform_instance_id); $this->assertEquals('test_channel', $channel->name); $this->assertEquals('Test Channel', $channel->display_name); $this->assertEquals('channel_123', $channel->channel_id); $this->assertEquals('A test channel', $channel->description); $this->assertEquals($language->id, $channel->language_id); $this->assertFalse($channel->is_active); } public function test_channel_update(): void { $channel = PlatformChannel::factory()->create([ 'name' => 'original_name', 'is_active' => true ]); $channel->update([ 'name' => 'updated_name', 'is_active' => false ]); $channel->refresh(); $this->assertEquals('updated_name', $channel->name); $this->assertFalse($channel->is_active); } public function test_channel_deletion(): void { $channel = PlatformChannel::factory()->create(); $channelId = $channel->id; $channel->delete(); $this->assertDatabaseMissing('platform_channels', ['id' => $channelId]); } public function test_channel_with_display_name(): void { $channel = PlatformChannel::factory()->create([ 'name' => 'tech', 'display_name' => 'Technology Discussion' ]); $this->assertEquals('tech', $channel->name); $this->assertEquals('Technology Discussion', $channel->display_name); } public function test_channel_without_display_name(): void { $channel = PlatformChannel::factory()->create([ 'name' => 'general', 'display_name' => 'General' ]); $this->assertEquals('general', $channel->name); $this->assertEquals('General', $channel->display_name); } public function test_channel_timestamps(): void { $channel = PlatformChannel::factory()->create(); $this->assertNotNull($channel->created_at); $this->assertNotNull($channel->updated_at); $this->assertInstanceOf(\Carbon\Carbon::class, $channel->created_at); $this->assertInstanceOf(\Carbon\Carbon::class, $channel->updated_at); } public function test_channel_can_have_multiple_accounts_with_different_priorities(): void { $channel = PlatformChannel::factory()->create(); $account1 = PlatformAccount::factory()->create(); $account2 = PlatformAccount::factory()->create(); $account3 = PlatformAccount::factory()->create(); // Attach accounts with different priorities $channel->platformAccounts()->attach([ $account1->id => ['is_active' => true, 'priority' => 300], $account2->id => ['is_active' => true, 'priority' => 100], $account3->id => ['is_active' => false, 'priority' => 200] ]); $allAccounts = $channel->platformAccounts; $activeAccounts = $channel->activePlatformAccounts; $this->assertCount(3, $allAccounts); $this->assertCount(2, $activeAccounts); // Test that we can access pivot data foreach ($allAccounts as $account) { $this->assertNotNull($account->pivot->priority); $this->assertIsInt($account->pivot->is_active); } } }