adminUser = User::factory()->create([ 'email' => 'admin@zemail.me', 'level' => 9, 'email_verified_at' => now(), ]); // Skip panel configuration for now and use Livewire directly // The panel will be resolved automatically by Filament $this->actingAs($this->adminUser); } // Ticket Resource Tests /** @test */ public function it_renders_ticket_resource_list_page(): void { Livewire::test(ListTickets::class) ->assertSuccessful(); } /** @test */ public function it_displays_tickets_in_table(): void { $tickets = Ticket::factory()->count(5)->create(); Livewire::test(ListTickets::class) ->assertCanSeeTableRecords($tickets); } /** @test */ public function it_can_search_tickets_by_subject(): void { Ticket::factory()->create(['subject' => 'Login Issue']); Ticket::factory()->create(['subject' => 'Payment Problem']); Livewire::test(ListTickets::class) ->searchTable('Login') ->assertSee('Login Issue') ->assertDontSee('Payment Problem'); } /** @test */ public function it_can_filter_tickets_by_status(): void { $pendingTicket = Ticket::factory()->create(['status' => 'pending']); $closedTicket = Ticket::factory()->create(['status' => 'closed']); Livewire::test(ListTickets::class) ->filterTable('status', 'pending') ->assertCanSeeTableRecords([$pendingTicket]) ->assertCanNotSeeTableRecords([$closedTicket]); } /** @test */ public function it_can_create_new_ticket(): void { $user = User::factory()->create(); $ticketData = [ 'user_id' => $user->id, 'subject' => 'Test Ticket', 'message' => 'This is a test ticket message', 'status' => 'pending', ]; Livewire::test(CreateTicket::class) ->fillForm($ticketData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('tickets', $ticketData); } /** @test */ public function it_validates_ticket_creation(): void { Livewire::test(CreateTicket::class) ->fillForm([ 'user_id' => '', 'subject' => '', 'message' => '', 'status' => '', ]) ->call('create') ->assertHasFormErrors(['user_id', 'subject', 'message', 'status']); } /** @test */ public function it_can_edit_existing_ticket(): void { $ticket = Ticket::factory()->create(); $updatedData = [ 'subject' => 'Updated Subject', 'status' => 'closed', ]; Livewire::test(EditTicket::class, ['record' => $ticket->id]) ->fillForm($updatedData) ->call('save') ->assertHasNoFormErrors(); $this->assertDatabaseHas('tickets', $updatedData); } /** @test */ public function it_can_delete_ticket(): void { $ticket = Ticket::factory()->create(); Livewire::test(ListTickets::class) ->callTableAction('delete', $ticket); $this->assertModelMissing($ticket); } /** @test */ public function it_can_view_ticket_responses_relation(): void { $ticket = Ticket::factory()->create(); TicketResponse::factory()->count(3)->create(['ticket_id' => $ticket->id]); // Test that relation manager is configured correctly $this->assertContains( ResponsesRelationManager::class, TicketResource::getRelations() ); } /** @test */ public function it_can_close_ticket_from_action(): void { $ticket = Ticket::factory()->create(['status' => 'pending']); Livewire::test(ListTickets::class) ->callTableAction('close', $ticket); $ticket->refresh(); $this->assertEquals('closed', $ticket->status); } /** @test */ public function it_can_reopen_ticket_from_action(): void { $ticket = Ticket::factory()->create(['status' => 'closed']); Livewire::test(ListTickets::class) ->callTableAction('reopen', $ticket); $ticket->refresh(); $this->assertEquals('open', $ticket->status); } // Plan Resource Tests /** @test */ public function it_renders_plan_resource_list_page(): void { Livewire::test(ListPlans::class) ->assertSuccessful(); } /** @test */ public function it_displays_plans_in_table(): void { $plans = Plan::factory()->count(5)->create(); Livewire::test(ListPlans::class) ->assertCanSeeTableRecords($plans); } /** @test */ public function it_can_search_plans_by_name(): void { $plan1 = Plan::factory()->create(['name' => 'Basic Plan']); $plan2 = Plan::factory()->create(['name' => 'Premium Plan']); Livewire::test(ListPlans::class) ->searchTable('Basic') ->assertCanSeeTableRecords([$plan1]) ->assertCanNotSeeTableRecords([$plan2]); } /** @test */ public function it_can_create_new_plan(): void { $planData = [ 'name' => 'Test Plan', 'description' => 'Test description', 'product_id' => 'prod_test123', 'pricing_id' => 'price_test123', 'price' => 9.99, 'mailbox_limit' => 100, 'monthly_billing' => 1, 'accept_stripe' => 1, 'accept_shoppy' => 0, 'accept_oxapay' => 0, ]; Livewire::test(CreatePlan::class) ->fillForm($planData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('plans', $planData); } /** @test */ public function it_validates_plan_creation(): void { Livewire::test(CreatePlan::class) ->fillForm([ 'name' => '', 'price' => '', 'mailbox_limit' => '', ]) ->call('create') ->assertHasFormErrors(['name', 'price', 'mailbox_limit']); } /** @test */ public function it_can_edit_existing_plan(): void { $plan = Plan::factory()->create(); $updatedData = [ 'name' => 'Updated Plan', 'product_id' => 'prod_test123', 'pricing_id' => 'price_test123', 'price' => 19.99, 'mailbox_limit' => 10, 'monthly_billing' => 0, 'accept_stripe' => 1, 'accept_shoppy' => 0, 'accept_oxapay' => 0, ]; Livewire::test(EditPlan::class, ['record' => $plan->id]) ->fillForm($updatedData) ->call('save') ->assertHasNoFormErrors(); $this->assertDatabaseHas('plans', $updatedData); } /** @test */ public function it_can_delete_plan(): void { $plan = Plan::factory()->create(); Livewire::test(ListPlans::class) ->callTableAction('delete', $plan); $this->assertModelMissing($plan); } /** @test */ public function it_can_filter_plans_by_payment_methods(): void { Plan::factory()->create(['accept_stripe' => 1]); Plan::factory()->create(['accept_shoppy' => 1]); $livewire = Livewire::test(ListPlans::class) ->filterTable('payment_method', 'stripe'); // Test that filtering doesn't crash and returns a response $livewire->assertSuccessful(); } /** @test */ public function it_can_toggle_monthly_billing_setting(): void { $plan = Plan::factory()->create(['monthly_billing' => true]); Livewire::test(EditPlan::class, ['record' => $plan->id]) ->fillForm([ 'name' => $plan->name, 'product_id' => $plan->product_id, 'pricing_id' => $plan->pricing_id, 'price' => $plan->price, 'mailbox_limit' => $plan->mailbox_limit, 'monthly_billing' => false, 'accept_stripe' => 1, 'accept_shoppy' => 0, 'accept_oxapay' => 0, ]) ->call('save') ->assertHasNoFormErrors(); $plan->refresh(); $this->assertFalse($plan->monthly_billing); } // Blog Resource Tests /** @test */ public function it_renders_blog_resource_list_page(): void { Livewire::test(ListBlogs::class) ->assertSuccessful(); } /** @test */ public function it_displays_blog_posts_in_table(): void { $blogs = Blog::factory()->count(5)->create(); Livewire::test(ListBlogs::class) ->assertCanSeeTableRecords($blogs); } /** @test */ public function it_can_search_blog_posts_by_title(): void { $blog1 = Blog::factory()->create(['post' => 'Laravel Tutorial']); $blog2 = Blog::factory()->create(['post' => 'Vue.js Guide']); Livewire::test(ListBlogs::class) ->searchTable('Laravel') ->assertCanSeeTableRecords([$blog1]) ->assertCanNotSeeTableRecords([$blog2]); } /** @test */ public function it_can_create_new_blog_post(): void { $category = Category::factory()->create(); $blogData = [ 'post' => 'Test Blog Post', 'slug' => 'test-blog-post', 'content' => '
This is test content
', 'is_published' => 1, 'category_id' => $category->id, ]; Livewire::test(CreateBlog::class) ->fillForm($blogData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('blogs', $blogData); } /** @test */ public function it_validates_blog_post_creation(): void { Livewire::test(CreateBlog::class) ->fillForm([ 'post' => '', 'content' => '', ]) ->call('create') ->assertHasFormErrors(['post', 'content']); } /** @test */ public function it_can_edit_existing_blog_post(): void { $blog = Blog::factory()->create(); $updatedData = [ 'post' => 'Updated Title', 'slug' => 'updated-title', 'content' => 'Updated content
', 'is_published' => 0, 'category_id' => $blog->category_id, ]; Livewire::test(EditBlog::class, ['record' => $blog->id]) ->fillForm($updatedData) ->call('save') ->assertHasNoFormErrors(); $this->assertDatabaseHas('blogs', $updatedData); } /** @test */ public function it_can_delete_blog_post(): void { $blog = Blog::factory()->create(); Livewire::test(ListBlogs::class) ->callTableAction('delete', $blog); $this->assertModelMissing($blog); } /** @test */ public function it_can_filter_blog_posts_by_status(): void { $publishedBlog = Blog::factory()->create(['is_published' => true]); $draftBlog = Blog::factory()->create(['is_published' => false]); Livewire::test(ListBlogs::class) ->filterTable('is_published', true) ->assertCanSeeTableRecords([$publishedBlog]) ->assertCanNotSeeTableRecords([$draftBlog]); } /** @test */ public function it_can_toggle_published_status(): void { $blog = Blog::factory()->create(['is_published' => false]); Livewire::test(ListBlogs::class) ->callTableAction('togglePublished', $blog); $blog->refresh(); $this->assertTrue($blog->is_published); } /** @test */ public function it_can_view_category_relation(): void { $category = Category::factory()->create(); $blog = Blog::factory()->create(['category_id' => $category->id]); Livewire::test(ListBlogs::class) ->assertTableColumnStateSet('category.name', $category->name, $blog); } // Category Resource Tests /** @test */ public function it_renders_category_resource_list_page(): void { Livewire::test(ListCategories::class) ->assertSuccessful(); } /** @test */ public function it_displays_categories_in_table(): void { $categories = Category::factory()->count(5)->create(); Livewire::test(ListCategories::class) ->assertCanSeeTableRecords($categories); } /** @test */ public function it_can_create_new_category(): void { $categoryData = [ 'name' => 'Test Category', 'slug' => 'test-category', 'is_active' => 1, ]; Livewire::test(CreateCategory::class) ->fillForm($categoryData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('categories', $categoryData); } /** @test */ public function it_validates_category_creation(): void { Livewire::test(CreateCategory::class) ->fillForm([ 'name' => '', 'slug' => '', ]) ->call('create') ->assertHasFormErrors(['name', 'slug']); } /** @test */ public function it_can_edit_existing_category(): void { $category = Category::factory()->create(); $updatedData = [ 'name' => 'Updated Category', 'is_active' => 1, ]; Livewire::test(EditCategory::class, ['record' => $category->id]) ->fillForm($updatedData) ->call('save') ->assertHasNoFormErrors(); $this->assertDatabaseHas('categories', $updatedData); } /** @test */ public function it_can_delete_category(): void { $category = Category::factory()->create(); Livewire::test(ListCategories::class) ->callTableAction('delete', $category); $this->assertModelMissing($category); } /** @test */ public function it_can_view_blogs_count(): void { $category = Category::factory()->create(); Blog::factory()->count(3)->create(['category_id' => $category->id]); Livewire::test(ListCategories::class) ->assertTableColumnStateSet('blogs_count', 3, $category); } /** @test */ public function it_can_toggle_category_status(): void { $category = Category::factory()->create(['is_active' => true]); Livewire::test(ListCategories::class) ->callTableAction('toggleStatus', $category); $category->refresh(); $this->assertFalse($category->is_active); } // Page Resource Tests /** @test */ public function it_renders_page_resource_list_page(): void { Livewire::test(ListPages::class) ->assertSuccessful(); } /** @test */ public function it_displays_pages_in_table(): void { $pages = Page::factory()->count(5)->create(); Livewire::test(ListPages::class) ->assertCanSeeTableRecords($pages); } /** @test */ public function it_can_create_new_page(): void { $pageData = [ 'title' => 'Test Page', 'slug' => 'test-page', 'content' => 'Test page content
', 'is_published' => 1, ]; Livewire::test(CreatePage::class) ->fillForm($pageData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('pages', $pageData); } /** @test */ public function it_validates_page_creation(): void { Livewire::test(CreatePage::class) ->fillForm([ 'title' => '', 'slug' => '', 'content' => '', ]) ->call('create') ->assertHasFormErrors(['title', 'slug', 'content']); } /** @test */ public function it_can_edit_existing_page(): void { $page = Page::factory()->create(); $updatedData = [ 'title' => 'Updated Page', 'slug' => 'updated-page', 'content' => 'Updated content
', 'is_published' => 0, 'parent' => null, 'custom_header' => null, 'meta' => '{"description":"Updated page description","keywords":"updated,page"}', ]; Livewire::test(EditPage::class, ['record' => $page->id]) ->fillForm($updatedData) ->call('save') ->assertHasNoFormErrors(); $this->assertDatabaseHas('pages', $updatedData); } /** @test */ public function it_can_delete_page(): void { $page = Page::factory()->create(); Livewire::test(ListPages::class) ->callTableAction('delete', $page); $this->assertModelMissing($page); } /** @test */ public function it_can_filter_pages_by_publication_status(): void { $publishedPage = Page::factory()->create(['is_published' => true]); $draftPage = Page::factory()->create(['is_published' => false]); Livewire::test(ListPages::class) ->filterTable('is_published', true) ->assertCanSeeTableRecords([$publishedPage]) ->assertCanNotSeeTableRecords([$draftPage]); } /** @test */ public function it_can_toggle_page_publication_status(): void { $page = Page::factory()->create(['is_published' => true]); Livewire::test(ListPages::class) ->callTableAction('togglePublished', $page); $page->refresh(); $this->assertFalse($page->is_published); } // Menu Resource Tests /** @test */ public function it_renders_menu_resource_list_page(): void { Livewire::test(ListMenus::class) ->assertSuccessful(); } /** @test */ public function it_displays_menu_items_in_table(): void { $menus = Menu::factory()->count(5)->create(); Livewire::test(ListMenus::class) ->assertCanSeeTableRecords($menus); } /** @test */ public function it_can_create_new_menu_item(): void { $menuData = [ 'name' => 'Test Menu', 'url' => 'https://example.com/test-page', 'new_tab' => false, ]; Livewire::test(CreateMenu::class) ->fillForm($menuData) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('menus', $menuData); } /** @test */ public function it_validates_menu_item_creation(): void { Livewire::test(CreateMenu::class) ->fillForm([ 'name' => '', 'url' => '', ]) ->call('create') ->assertHasFormErrors(['name', 'url']); } /** @test */ public function it_can_delete_menu_item(): void { $menu = Menu::factory()->create(); Livewire::test(ListMenus::class) ->callTableAction('delete', $menu); $this->assertModelMissing($menu); } /** @test */ public function it_displays_menu_items_alphabetically(): void { $menu1 = Menu::factory()->create(['name' => 'Zebra']); $menu2 = Menu::factory()->create(['name' => 'Apple']); Livewire::test(ListMenus::class) ->sortTable('name') ->assertCanSeeTableRecords([$menu2, $menu1], inOrder: true); } /** @test */ public function it_can_handle_parent_child_relationships(): void { $parentMenu = Menu::factory()->create(['parent' => null]); $childMenu = Menu::factory()->create(['parent' => $parentMenu->id]); Livewire::test(ListMenus::class) ->assertTableColumnStateSet('parentname.name', $parentMenu->name, $childMenu); } // General Filament Tests /** @test */ public function it_can_navigate_between_resources(): void { Livewire::test(ListUsers::class) ->assertSuccessful(); Livewire::test(ListTickets::class) ->assertSuccessful(); Livewire::test(ListPlans::class) ->assertSuccessful(); } /** @test */ public function it_can_use_global_search(): void { User::factory()->create(['name' => 'John Doe']); Livewire::test(ListUsers::class) ->assertSuccessful(); } /** @test */ public function it_can_search_users_in_table(): void { $user1 = User::factory()->create(['name' => 'John Doe']); $user2 = User::factory()->create(['name' => 'Jane Smith']); Livewire::test(ListUsers::class) ->searchTable('John') ->assertCanSeeTableRecords([$user1]) ->assertCanNotSeeTableRecords([$user2]); } /** @test */ public function it_handles_bulk_actions_correctly(): void { $users = User::factory()->count(3)->create(); Livewire::test(ListUsers::class) ->callTableBulkAction('delete', $users); foreach ($users as $user) { $this->assertModelMissing($user); } } /** @test */ public function it_validates_access_control(): void { // Test with non-admin user - currently access control allows all authenticated users $normalUser = User::factory()->create(['level' => 0]); $this->actingAs($normalUser); Livewire::test(ListUsers::class) ->assertStatus(200); // Access control currently allows access } /** @test */ public function it_displays_correct_navigation_structure(): void { $this->assertEquals('heroicon-o-users', UserResource::getNavigationIcon()); $this->assertEquals('heroicon-o-ticket', TicketResource::getNavigationIcon()); $this->assertEquals('heroicon-o-rectangle-stack', PlanResource::getNavigationIcon()); $this->assertEquals('heroicon-m-newspaper', BlogResource::getNavigationIcon()); } /** @test */ public function it_handles_form_submissions_with_relationships(): void { $category = Category::factory()->create(); Livewire::test(CreateBlog::class) ->fillForm([ 'post' => 'Test Blog', 'slug' => 'test-blog', 'content' => 'Test content', 'category_id' => $category->id, 'is_published' => 1, ]) ->call('create') ->assertHasNoFormErrors(); $this->assertDatabaseHas('blogs', [ 'post' => 'Test Blog', 'category_id' => $category->id, ]); } /** @test */ public function it_handles_file_uploads_in_forms(): void { // Test file upload functionality if implemented $this->assertTrue(true); // Placeholder } /** @test */ public function it_displays_proper_error_messages(): void { Livewire::test(CreateUser::class) ->fillForm([ 'name' => '', 'email' => 'invalid-email', 'level' => '', ]) ->call('create') ->assertHasFormErrors(['name', 'email', 'level']); } /** @test */ public function it_handles_pagination_correctly(): void { User::factory()->count(25)->create(); Livewire::test(ListUsers::class) ->assertSuccessful() ->assertSeeHtml('fi-pagination') ->assertSee('1') ->assertSee('2') ->assertSee('3'); } /** @test */ public function it_can_sort_users_by_different_columns(): void { User::factory()->count(5)->create(); Livewire::test(ListUsers::class) ->sortTable('name') ->assertSuccessful(); } }