master_trainer = $this->factory->user->create( array( 'role' => 'hvac_master_trainer', 'user_login' => 'master_trainer', 'user_email' => 'master@example.com', ) ); $this->regular_trainer = $this->factory->user->create( array( 'role' => 'hvac_trainer', 'user_login' => 'regular_trainer', 'user_email' => 'trainer@example.com', ) ); // Add capabilities HVAC_Announcements_Permissions::add_capabilities(); // Get ajax handler instance $this->ajax_handler = HVAC_Announcements_Ajax::get_instance(); } /** * Teardown after each test */ public function tearDown() { parent::tearDown(); // Clean up test users wp_delete_user( $this->master_trainer ); wp_delete_user( $this->regular_trainer ); // Remove capabilities HVAC_Announcements_Permissions::remove_capabilities(); // Clear any transients delete_transient( 'hvac_ajax_rate_' . $this->master_trainer ); delete_transient( 'hvac_ajax_rate_' . $this->regular_trainer ); } /** * Test create announcement with all fields */ public function test_create_announcement_complete() { wp_set_current_user( $this->master_trainer ); // Prepare test data $_POST = array( 'nonce' => wp_create_nonce( 'hvac_announcements_nonce' ), 'title' => 'New Test Announcement', 'content' => '

This is the content with HTML.

', 'excerpt' => 'This is the excerpt', 'status' => 'publish', 'publish_date' => '2024-12-25 10:00:00', 'categories' => array( 1, 2, 3 ), 'tags' => 'tag1, tag2, tag3', 'featured_image_id' => 123, ); // Mock the AJAX response capture $this->expectOutputRegex( '/.*/' ); // Expect some output // Test would normally call create_announcement() but it uses wp_send_json_* // which exits, so we'll test the data preparation instead // Test title sanitization $sanitized_title = sanitize_text_field( $_POST['title'] ); $this->assertEquals( 'New Test Announcement', $sanitized_title ); // Test content sanitization $sanitized_content = wp_kses_post( $_POST['content'] ); $this->assertStringContainsString( 'content', $sanitized_content ); $this->assertStringNotContainsString( '