setAccessible(true); expect($ref->invoke($controller, null))->toBeNull(); expect($ref->invoke($controller, '/forums/12'))->toBe(12); expect($ref->invoke($controller, '7'))->toBe(7); expect($ref->invoke($controller, 'abc'))->toBeNull(); }); it('loadLastPostsByForum returns empty for no ids', function (): void { $controller = new ForumController(); $ref = new ReflectionMethod($controller, 'loadLastPostsByForum'); $ref->setAccessible(true); expect($ref->invoke($controller, []))->toBe([]); }); it('resolveGroupColor returns null for missing roles', function (): void { $controller = new ForumController(); $user = User::factory()->create(); $user->setRelation('roles', null); $ref = new ReflectionMethod($controller, 'resolveGroupColor'); $ref->setAccessible(true); expect($ref->invoke($controller, null))->toBeNull(); expect($ref->invoke($controller, $user))->toBeNull(); }); it('resolveGroupColor returns first sorted role color', function (): void { $controller = new ForumController(); $user = User::factory()->create(); $roleB = Role::create(['name' => 'ROLE_B', 'color' => '#bbbbbb']); $roleA = Role::create(['name' => 'ROLE_A', 'color' => '#aaaaaa']); $user->roles()->attach([$roleB->id, $roleA->id]); $user->load('roles'); $ref = new ReflectionMethod($controller, 'resolveGroupColor'); $ref->setAccessible(true); expect($ref->invoke($controller, $user))->toBe('#aaaaaa'); }); it('resolveGroupColor returns null when roles have no colors', function (): void { $controller = new ForumController(); $user = User::factory()->create(); $role = Role::create(['name' => 'ROLE_EMPTY', 'color' => null]); $user->roles()->attach($role); $user->load('roles'); $ref = new ReflectionMethod($controller, 'resolveGroupColor'); $ref->setAccessible(true); expect($ref->invoke($controller, $user))->toBeNull(); }); it('loadLastPostsByForum returns latest post per forum', function (): void { $controller = new ForumController(); $ref = new ReflectionMethod($controller, 'loadLastPostsByForum'); $ref->setAccessible(true); $category = Forum::create([ 'name' => 'Category U', 'description' => null, 'type' => 'category', 'parent_id' => null, 'position' => 1, ]); $forum = Forum::create([ 'name' => 'Forum U', 'description' => null, 'type' => 'forum', 'parent_id' => $category->id, 'position' => 1, ]); $thread = Thread::create([ 'forum_id' => $forum->id, 'user_id' => null, 'title' => 'Thread', 'body' => 'Body', ]); $older = Post::create([ 'thread_id' => $thread->id, 'user_id' => null, 'body' => 'Old', ]); $newer = Post::create([ 'thread_id' => $thread->id, 'user_id' => null, 'body' => 'New', ]); Post::whereKey($older->id)->update([ 'created_at' => now()->subDay(), 'updated_at' => now()->subDay(), ]); Post::whereKey($newer->id)->update([ 'created_at' => now()->addSeconds(10), 'updated_at' => now()->addSeconds(10), ]); $result = $ref->invoke($controller, [$forum->id]); expect($result[$forum->id]->id)->toBe($newer->id); });