upskill-event-manager/wordpress-dev/tests/unit/test-event-summary-data.php
bengizmo d6211ee364 feat(testing): Implement HVAC_Test_User_Factory and update .gitignore
- Add HVAC_Test_User_Factory class with:
  * User creation with specific roles
  * Multiple role support
  * Persona management system
  * Account cleanup integration
- Create comprehensive test suite in HVAC_Test_User_Factory_Test.php
- Update testing improvement plan documentation
- Add implementation decisions to project memory bank
- Restructure .gitignore with:
  * Whitelist approach for better file management
  * Explicit backup exclusions
  * Specific bin directory inclusions

Part of the Account Management component from the testing framework improvement plan.
2025-04-14 17:41:36 -03:00

277 lines
No EOL
13 KiB
PHP

<?php
use Yoast\WPTestUtils\WPIntegration\TestCase;
/**
* Class Test_Event_Summary_Data
*
* Tests the data retrieval logic for the Event Summary page.
*/
class Test_Event_Summary_Data extends TestCase {
/**
* Set up the test environment.
*/
public function set_up(): void {
parent::set_up();
// Include necessary files or setup data factories if needed
// Use a more robust method to determine the plugin directory
$plugin_dir = dirname( dirname( __DIR__ ) ) . '/';
require_once $plugin_dir . 'includes/community/class-event-summary-data.php';
// Load test doubles for TEC functions if they don't exist
if (!function_exists('tribe_get_start_date')) {
require_once $plugin_dir . 'tests/test-doubles.php';
}
}
/**
* Tear down the test environment.
*/
public function tear_down(): void {
parent::tear_down();
}
/**
* Test fetching basic event details.
* @test
*/
public function test_get_event_details() {
// Ensure TEC post type exists
if ( ! post_type_exists( Tribe__Events__Main::POSTTYPE ) ) {
$this->markTestSkipped('The Events Calendar post type does not exist.');
}
$start_date = '2025-05-10 09:00:00';
$end_date = '2025-05-10 17:00:00';
$cost = '50.00';
$event_id = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::POSTTYPE,
'post_title' => 'Test Event Summary',
'post_content' => 'This is the event description.',
'post_excerpt' => 'Short description.',
'post_status' => 'publish',
] );
// Set TEC meta data
update_post_meta( $event_id, '_EventStartDate', $start_date );
update_post_meta( $event_id, '_EventEndDate', $end_date );
update_post_meta( $event_id, '_EventCost', $cost );
update_post_meta( $event_id, '_EventCurrencySymbol', '$' ); // Assuming USD
update_post_meta( $event_id, '_EventAllDay', 'no' );
update_post_meta( $event_id, '_EventShowMapLink', 'true' );
update_post_meta( $event_id, '_EventShowMap', 'true' );
// Add other meta as needed for tribe_ functions to work
$summary_data = new HVAC_Event_Summary_Data( $event_id );
$details = $summary_data->get_event_details();
$this->assertIsArray( $details );
$this->assertEquals( $event_id, $details['id'] );
$this->assertEquals( 'Test Event Summary', $details['title'] );
$this->assertEquals( '<p>This is the event description.</p>', trim( $details['description'] ) ); // WP adds <p> tags via filter
$this->assertEquals( 'Short description.', $details['excerpt'] );
$this->assertEquals( get_permalink( $event_id ), $details['permalink'] );
// Check TEC function results (if functions exist)
if ( function_exists( 'tribe_get_start_date' ) ) {
$this->assertEquals( $start_date, $details['start_date'] );
}
if ( function_exists( 'tribe_get_end_date' ) ) {
$this->assertEquals( $end_date, $details['end_date'] );
}
if ( function_exists( 'tribe_get_cost' ) ) {
// tribe_get_cost() returns formatted cost with currency symbol
$formatted_cost = tribe_get_cost( $event_id, true );
$this->assertEquals( $formatted_cost, $details['cost'] );
}
if ( function_exists( 'tribe_event_is_all_day' ) ) {
$this->assertFalse( $details['is_all_day'] );
}
if ( function_exists( 'tribe_is_recurring_event' ) ) {
$this->assertFalse( $details['is_recurring'] ); // Assuming not recurring by default
}
if ( function_exists( 'tribe_get_timezone' ) ) {
$this->assertNotEmpty( $details['timezone'] ); // Should default to WP timezone
}
}
/**
* Test fetching event venue details.
* @test
*/
public function test_get_event_venue_details() {
// Ensure TEC post types exist
if ( ! post_type_exists( Tribe__Events__Main::POSTTYPE ) || ! post_type_exists( Tribe__Events__Main::VENUE_POST_TYPE ) ) {
$this->markTestSkipped('The Events Calendar post types (event/venue) do not exist.');
}
// Ensure TEC functions exist for checking later
if ( ! function_exists( 'tribe_get_venue_id' ) || ! function_exists( 'tribe_get_venue' ) ) {
$this->markTestSkipped('Required TEC venue functions do not exist.');
}
// 1. Create Venue
$venue_data = [
'Venue' => 'Test Venue Name',
'Address' => '123 Test St',
'City' => 'Testville',
'State' => 'TS', // Use State for US, Province otherwise
'Province' => '',
'Zip' => '12345',
'Country' => 'United States',
'Phone' => '555-1234',
'URL' => 'http://example.com/venue'
];
$venue_id = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::VENUE_POST_TYPE,
'post_title' => $venue_data['Venue'],
'post_status' => 'publish',
] );
// Explicitly set known meta keys used by tribe_get_* functions
update_post_meta( $venue_id, '_VenueAddress', $venue_data['Address'] );
update_post_meta( $venue_id, '_VenueCity', $venue_data['City'] );
update_post_meta( $venue_id, '_VenueStateProvince', $venue_data['State'] ); // This is the key tribe_get_stateprovince uses
update_post_meta( $venue_id, '_VenueState', $venue_data['State'] ); // Also set _VenueState just in case
update_post_meta( $venue_id, '_VenueProvince', $venue_data['Province'] );
update_post_meta( $venue_id, '_VenueZip', $venue_data['Zip'] );
update_post_meta( $venue_id, '_VenueCountry', $venue_data['Country'] );
update_post_meta( $venue_id, '_VenuePhone', $venue_data['Phone'] );
update_post_meta( $venue_id, '_VenueURL', $venue_data['URL'] );
// 2. Create Event linked to Venue
$event_id_with_venue = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::POSTTYPE,
'post_title' => 'Event With Venue',
'post_status' => 'publish',
] );
update_post_meta( $event_id_with_venue, '_EventVenueID', $venue_id );
// 3. Test retrieval for event with venue
$summary_data_with_venue = new HVAC_Event_Summary_Data( $event_id_with_venue );
$details_with_venue = $summary_data_with_venue->get_event_venue_details();
$this->assertIsArray( $details_with_venue );
$this->assertEquals( $venue_id, $details_with_venue['id'] );
$this->assertEquals( $venue_data['Venue'], $details_with_venue['name'] );
$this->assertStringContainsString( $venue_data['Address'], $details_with_venue['address'] ); // tribe_get_full_address combines fields
$this->assertEquals( $venue_data['Address'], $details_with_venue['street'] );
$this->assertEquals( $venue_data['City'], $details_with_venue['city'] );
$this->assertEquals( $venue_data['State'], $details_with_venue['stateprovince'] );
$this->assertEquals( $venue_data['State'], $details_with_venue['state'] );
$this->assertEquals( $venue_data['Zip'], $details_with_venue['zip'] );
$this->assertEquals( $venue_data['Country'], $details_with_venue['country'] );
$this->assertEquals( $venue_data['Phone'], $details_with_venue['phone'] );
// tribe_get_venue_website_link() returns the full HTML link
$expected_venue_website_html = tribe_get_venue_website_link( $venue_id );
$this->assertEquals( $expected_venue_website_html, $details_with_venue['website'] );
$this->assertNotNull( $details_with_venue['map_link'] ); // Check if link is generated
// 4. Create Event without Venue
$event_id_no_venue = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::POSTTYPE,
'post_title' => 'Event Without Venue',
'post_status' => 'publish',
] );
update_post_meta( $event_id_no_venue, '_EventVenueID', 0 ); // Explicitly set to 0 or non-existent ID
// 5. Test retrieval for event without venue
$summary_data_no_venue = new HVAC_Event_Summary_Data( $event_id_no_venue );
$details_no_venue = $summary_data_no_venue->get_event_venue_details();
$this->assertNull( $details_no_venue );
}
/**
* Test fetching event organizer details.
* @test
*/
public function test_get_event_organizer_details() {
// Ensure TEC post types exist
if ( ! post_type_exists( Tribe__Events__Main::POSTTYPE ) || ! post_type_exists( Tribe__Events__Main::ORGANIZER_POST_TYPE ) ) {
$this->markTestSkipped('The Events Calendar post types (event/organizer) do not exist.');
}
// Ensure TEC functions exist for checking later
if ( ! function_exists( 'tribe_get_organizer_ids' ) || ! function_exists( 'tribe_get_organizer' ) ) {
$this->markTestSkipped('Required TEC organizer functions do not exist.');
}
// 1. Create Organizer
$organizer_data = [
'Organizer' => 'Test Organizer Inc.',
'Phone' => '555-5678',
'Website' => 'http://example.com/organizer',
'Email' => 'organizer@example.com',
];
$organizer_id = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::ORGANIZER_POST_TYPE,
'post_title' => $organizer_data['Organizer'],
'post_status' => 'publish',
] );
foreach ( $organizer_data as $key => $value ) {
update_post_meta( $organizer_id, '_Organizer' . $key, $value );
}
// 2. Create Event linked to Organizer
$event_id_with_organizer = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::POSTTYPE,
'post_title' => 'Event With Organizer',
'post_status' => 'publish',
] );
// Link using the meta key TEC uses
update_post_meta( $event_id_with_organizer, '_EventOrganizerID', $organizer_id );
// 3. Test retrieval for event with organizer
$summary_data_with_organizer = new HVAC_Event_Summary_Data( $event_id_with_organizer );
$details_with_organizer = $summary_data_with_organizer->get_event_organizer_details();
$this->assertIsArray( $details_with_organizer );
$this->assertEquals( $organizer_id, $details_with_organizer['id'] );
$this->assertEquals( $organizer_data['Organizer'], $details_with_organizer['name'] );
$this->assertEquals( $organizer_data['Phone'], $details_with_organizer['phone'] );
// tribe_get_organizer_website_link() returns the full HTML link
$expected_website_html = tribe_get_organizer_website_link( $organizer_id );
$this->assertEquals( $expected_website_html, $details_with_organizer['website'] );
// tribe_get_organizer_email() might encode entities
$this->assertEquals( $organizer_data['Email'], html_entity_decode( $details_with_organizer['email'] ) );
// get_permalink() in test environment might add encoded slash
$expected_permalink = get_permalink( $organizer_id );
// Handle potential trailing slash inconsistency
$this->assertEquals( rtrim($expected_permalink, '/'), rtrim(str_replace('%2F', '/', $details_with_organizer['permalink']), '/') );
// 4. Create Event without Organizer
$event_id_no_organizer = self::factory()->post->create( [
'post_type' => Tribe__Events__Main::POSTTYPE,
'post_title' => 'Event Without Organizer',
'post_status' => 'publish',
] );
// Ensure no organizer ID is set, or set to 0
delete_post_meta( $event_id_no_organizer, '_EventOrganizerID' );
// 5. Test retrieval for event without organizer
$summary_data_no_organizer = new HVAC_Event_Summary_Data( $event_id_no_organizer );
$details_no_organizer = $summary_data_no_organizer->get_event_organizer_details();
$this->assertNull( $details_no_organizer );
}
/**
* Test fetching data for an event that does not exist.
* @test
*/
public function test_get_data_for_nonexistent_event() {
$invalid_event_id = 999999; // An ID that is unlikely to exist
$summary_data = new HVAC_Event_Summary_Data( $invalid_event_id );
// Check constructor handled it
$this->assertFalse( $summary_data->is_valid_event() );
// Check data retrieval methods
$this->assertNull( $summary_data->get_event_details(), 'Details should be null for invalid event' );
$this->assertNull( $summary_data->get_event_venue_details(), 'Venue details should be null for invalid event' );
$this->assertNull( $summary_data->get_event_organizer_details(), 'Organizer details should be null for invalid event' );
$this->assertIsArray( $summary_data->get_event_transactions(), 'Transactions should be an empty array for invalid event' );
$this->assertEmpty( $summary_data->get_event_transactions(), 'Transactions should be an empty array for invalid event' );
}
}