223 lines
8.1 KiB
PHP
223 lines
8.1 KiB
PHP
<?php
|
|
|
|
use App\Models\User;
|
|
use App\Http\Middleware\HandleInertiaRequests;
|
|
use cPad\Plugins\Forum\Models\ForumBoard;
|
|
use cPad\Plugins\Forum\Models\ForumCategory;
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
uses(Tests\TestCase::class);
|
|
|
|
beforeEach(function (): void {
|
|
$this->withoutMiddleware(HandleInertiaRequests::class);
|
|
|
|
createForumRestrictedCategoryAccessSchema();
|
|
|
|
config()->set('forum.category_role_access', [
|
|
'administrators-and-moderators-forum' => ['admin', 'manager'],
|
|
]);
|
|
});
|
|
|
|
it('hides restricted forum categories from guests and regular users', function () {
|
|
seedForumAccessBoards();
|
|
|
|
$this->get(route('forum.index'))
|
|
->assertOk()
|
|
->assertDontSee('Administrators and Moderators Forum')
|
|
->assertSee('Public Forum');
|
|
|
|
$member = makeForumAccessUser('member-role', 'user');
|
|
|
|
$this->actingAs($member)
|
|
->get(route('forum.index'))
|
|
->assertOk()
|
|
->assertDontSee('Administrators and Moderators Forum')
|
|
->assertSee('Public Forum');
|
|
|
|
$this->get(route('forum.category.show', ['categorySlug' => 'administrators-and-moderators-forum']))->assertNotFound();
|
|
$this->get(route('forum.board.show', ['boardSlug' => 'administrators-and-moderators-forum']))->assertNotFound();
|
|
|
|
$this->actingAs($member)
|
|
->get(route('forum.category.show', ['categorySlug' => 'administrators-and-moderators-forum']))
|
|
->assertNotFound();
|
|
|
|
$this->actingAs($member)
|
|
->get(route('forum.board.show', ['boardSlug' => 'administrators-and-moderators-forum']))
|
|
->assertNotFound();
|
|
});
|
|
|
|
it('allows admin and manager roles to access restricted forum categories', function () {
|
|
seedForumAccessBoards();
|
|
|
|
$admin = makeForumAccessUser('admin-role', 'admin');
|
|
$manager = makeForumAccessUser('manager-role', 'manager');
|
|
|
|
$this->actingAs($admin)
|
|
->get(route('forum.index'))
|
|
->assertOk()
|
|
->assertSee('Administrators and Moderators Forum');
|
|
|
|
$this->actingAs($admin)
|
|
->get(route('forum.category.show', ['categorySlug' => 'administrators-and-moderators-forum']))
|
|
->assertOk();
|
|
|
|
$this->actingAs($admin)
|
|
->get(route('forum.board.show', ['boardSlug' => 'administrators-and-moderators-forum']))
|
|
->assertOk();
|
|
|
|
$this->actingAs($manager)
|
|
->get(route('forum.index'))
|
|
->assertOk()
|
|
->assertSee('Administrators and Moderators Forum');
|
|
|
|
$this->actingAs($manager)
|
|
->get(route('forum.category.show', ['categorySlug' => 'administrators-and-moderators-forum']))
|
|
->assertOk();
|
|
|
|
$this->actingAs($manager)
|
|
->get(route('forum.board.show', ['boardSlug' => 'administrators-and-moderators-forum']))
|
|
->assertOk();
|
|
});
|
|
|
|
function createForumRestrictedCategoryAccessSchema(): void
|
|
{
|
|
foreach (['forum_posts', 'forum_topics', 'forum_boards', 'forum_categories', 'user_profiles', 'users'] as $table) {
|
|
Schema::dropIfExists($table);
|
|
}
|
|
|
|
Schema::create('users', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->string('username')->nullable();
|
|
$table->timestamp('username_changed_at')->nullable();
|
|
$table->timestamp('last_username_change_at')->nullable();
|
|
$table->string('onboarding_step')->nullable();
|
|
$table->string('name')->nullable();
|
|
$table->string('email')->nullable();
|
|
$table->timestamp('email_verified_at')->nullable();
|
|
$table->string('password')->nullable();
|
|
$table->boolean('is_active')->default(true);
|
|
$table->string('role')->nullable();
|
|
$table->rememberToken();
|
|
$table->timestamps();
|
|
$table->softDeletes();
|
|
});
|
|
|
|
Schema::create('user_profiles', function (Blueprint $table): void {
|
|
$table->unsignedBigInteger('user_id')->primary();
|
|
$table->string('avatar_hash')->nullable();
|
|
$table->timestamps();
|
|
});
|
|
|
|
Schema::create('forum_categories', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->string('name')->nullable();
|
|
$table->string('title')->nullable();
|
|
$table->string('slug')->unique();
|
|
$table->text('description')->nullable();
|
|
$table->unsignedBigInteger('parent_id')->nullable();
|
|
$table->integer('position')->default(0);
|
|
$table->boolean('is_active')->default(true);
|
|
$table->timestamps();
|
|
});
|
|
|
|
Schema::create('forum_boards', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->foreignId('category_id')->constrained('forum_categories')->cascadeOnDelete();
|
|
$table->unsignedBigInteger('legacy_category_id')->nullable();
|
|
$table->string('title');
|
|
$table->string('slug')->unique();
|
|
$table->text('description')->nullable();
|
|
$table->string('icon')->nullable();
|
|
$table->string('image')->nullable();
|
|
$table->integer('position')->default(0);
|
|
$table->boolean('is_active')->default(true);
|
|
$table->boolean('is_read_only')->default(false);
|
|
$table->timestamps();
|
|
});
|
|
|
|
Schema::create('forum_topics', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->foreignId('board_id')->constrained('forum_boards')->cascadeOnDelete();
|
|
$table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
|
|
$table->unsignedBigInteger('artwork_id')->nullable();
|
|
$table->unsignedBigInteger('legacy_thread_id')->nullable();
|
|
$table->string('title');
|
|
$table->string('slug')->unique();
|
|
$table->unsignedInteger('views')->default(0);
|
|
$table->unsignedInteger('replies_count')->default(0);
|
|
$table->boolean('is_pinned')->default(false);
|
|
$table->boolean('is_locked')->default(false);
|
|
$table->boolean('is_deleted')->default(false);
|
|
$table->unsignedBigInteger('last_post_id')->nullable();
|
|
$table->timestamp('last_post_at')->nullable();
|
|
$table->timestamps();
|
|
});
|
|
|
|
Schema::create('forum_posts', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->unsignedBigInteger('thread_id')->nullable();
|
|
$table->foreignId('topic_id')->nullable()->constrained('forum_topics')->nullOnDelete();
|
|
$table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
|
|
$table->text('content')->nullable();
|
|
$table->boolean('is_edited')->default(false);
|
|
$table->timestamp('edited_at')->nullable();
|
|
$table->timestamps();
|
|
$table->softDeletes();
|
|
});
|
|
}
|
|
|
|
function seedForumAccessBoards(): array
|
|
{
|
|
$restrictedCategory = ForumCategory::query()->create([
|
|
'title' => 'Administrators and Moderators Forum',
|
|
'slug' => 'administrators-and-moderators-forum',
|
|
'description' => 'Restricted board.',
|
|
'is_active' => true,
|
|
'position' => 1,
|
|
]);
|
|
|
|
$publicCategory = ForumCategory::query()->create([
|
|
'title' => 'Public Forum',
|
|
'slug' => 'public-forum',
|
|
'description' => 'Visible to everyone.',
|
|
'is_active' => true,
|
|
'position' => 2,
|
|
]);
|
|
|
|
$restrictedBoard = ForumBoard::query()->create([
|
|
'category_id' => $restrictedCategory->id,
|
|
'title' => 'Administrators and Moderators Forum',
|
|
'slug' => 'administrators-and-moderators-forum',
|
|
'description' => 'Restricted board.',
|
|
'is_active' => true,
|
|
'position' => 1,
|
|
]);
|
|
|
|
$publicBoard = ForumBoard::query()->create([
|
|
'category_id' => $publicCategory->id,
|
|
'title' => 'Public Forum',
|
|
'slug' => 'public-forum',
|
|
'description' => 'Visible to everyone.',
|
|
'is_active' => true,
|
|
'position' => 1,
|
|
]);
|
|
|
|
return [$restrictedCategory, $publicCategory, $restrictedBoard, $publicBoard];
|
|
}
|
|
|
|
function makeForumAccessUser(string $username, string $role): User
|
|
{
|
|
return User::query()->create([
|
|
'username' => $username,
|
|
'username_changed_at' => now()->subDays(120),
|
|
'last_username_change_at' => now()->subDays(120),
|
|
'onboarding_step' => 'complete',
|
|
'name' => ucfirst($role) . ' User',
|
|
'email' => $username . '@example.com',
|
|
'email_verified_at' => now(),
|
|
'password' => 'password',
|
|
'is_active' => true,
|
|
'role' => $role,
|
|
]);
|
|
} |