Compare commits

..

No commits in common. "custom_summary" and "main" have entirely different histories.

13 changed files with 36 additions and 559 deletions

View file

@ -75,12 +75,6 @@ jobs:
if: steps.cache-wordpress.outputs.cache-hit != 'false' if: steps.cache-wordpress.outputs.cache-hit != 'false'
run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wordpress-version }} false true true true run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wordpress-version }} false true true true
- name: Run General Tests
run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=activitypub_event_bridge
env:
PHP_VERSION: ${{ matrix.php-version }}
- name: Run Integration tests for The Events Calendar - name: Run Integration tests for The Events Calendar
run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=the_events_calendar run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=the_events_calendar
env: env:

View file

@ -3,7 +3,7 @@
* Plugin Name: ActivityPub Event Bridge * Plugin Name: ActivityPub Event Bridge
* Description: Integrating popular event plugins with the ActivityPub plugin. * Description: Integrating popular event plugins with the ActivityPub plugin.
* Plugin URI: https://event-federation.eu/ * Plugin URI: https://event-federation.eu/
* Version: 0.2.1.4 * Version: 0.2.1
* Author: André Menrath * Author: André Menrath
* Author URI: https://graz.social/@linos * Author URI: https://graz.social/@linos
* Text Domain: activitypub-event-bridge * Text Domain: activitypub-event-bridge
@ -27,8 +27,6 @@ define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_VERSION', current( get_file_data( __FILE__, array( 'Version' ), 'plugin' ) ) ); define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_VERSION', current( get_file_data( __FILE__, array( 'Version' ), 'plugin' ) ) );
define( 'ACTIVITYPUB_EVENT_BRIDGE_DOMAIN', 'activitypub-event-bridge' ); define( 'ACTIVITYPUB_EVENT_BRIDGE_DOMAIN', 'activitypub-event-bridge' );
define( 'ACTIVITYPUB_EVENT_BRIDGE_ACTIVITYPUB_PLUGIN_MIN_VERSION', '3.2.2' ); define( 'ACTIVITYPUB_EVENT_BRIDGE_ACTIVITYPUB_PLUGIN_MIN_VERSION', '3.2.2' );
define( 'ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY', "<ul>\n <li>[ap_start_time]</li>\n <li>[ap_end_time]</li>\n <li>[ap_location]</li>\n</ul>\n[ap_hashcats][ap_hashtags]" );
define( 'ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE', 'preset' );
// Include and register the autoloader class for automatic loading of plugin classes. // Include and register the autoloader class for automatic loading of plugin classes.
require_once ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_DIR . '/includes/class-autoloader.php'; require_once ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_DIR . '/includes/class-autoloader.php';

View file

@ -177,7 +177,3 @@ code.activitypub-event-bridge-settings-example-url {
overflow-x: auto; overflow-x: auto;
word-break: break-all; word-break: break-all;
} }
#activitypub_summary_type_custom-details {
display: none;
}

View file

@ -11,23 +11,4 @@ jQuery( function( $ ) {
$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false ); $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
} }
} ); } );
// Function to toggle visibility of custom details based on selected radio button.
function toggleCustomDetailsForSummary() {
if ($("#activitypub_summary_type_custom").is(':checked')) {
$("#activitypub_summary_type_custom-details").show();
} else {
$("#activitypub_summary_type_custom-details").hide();
}
}
// Run the toggle function on page load.
$(document).ready(function() {
toggleCustomDetailsForSummary(); // Set the correct state on load.
// Listen for changes on the radio buttons
$("input[name=activitypub_summary_type]").change(function() {
toggleCustomDetailsForSummary(); // Update visibility on change.
});
});
} ); } );

View file

@ -58,7 +58,7 @@
], ],
"test-debug": [ "test-debug": [
"@prepare-test", "@prepare-test",
"@test-activitypub-event-bridge-shortcodes" "@test-gatherpress"
], ],
"test-vs-event-list": "phpunit --filter=vs_event_list", "test-vs-event-list": "phpunit --filter=vs_event_list",
"test-the-events-calendar": "phpunit --filter=the_events_calendar", "test-the-events-calendar": "phpunit --filter=the_events_calendar",
@ -67,7 +67,6 @@
"test-wp-event-manager": "phpunit --filter=wp_event_manager", "test-wp-event-manager": "phpunit --filter=wp_event_manager",
"test-eventin": "phpunit --filter=eventin", "test-eventin": "phpunit --filter=eventin",
"test-modern-events-calendar-lite": "phpunit --filter=modern_events_calendar_lite", "test-modern-events-calendar-lite": "phpunit --filter=modern_events_calendar_lite",
"test-activitypub-event-bridge-shortcodes": "phpunit --filter=activitypub_event_bridge_shortcodes",
"test-all": "phpunit" "test-all": "phpunit"
} }
} }

View file

@ -13,9 +13,7 @@ defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore
use Activitypub\Activity\Extended_Object\Event as Event_Object; use Activitypub\Activity\Extended_Object\Event as Event_Object;
use Activitypub\Activity\Extended_Object\Place; use Activitypub\Activity\Extended_Object\Place;
use Activitypub\Shortcodes;
use Activitypub\Transformer\Post; use Activitypub\Transformer\Post;
use DateTime; use DateTime;
/** /**
@ -150,14 +148,14 @@ abstract class Event extends Post {
* *
* This is mandatory and must be implemented in the final event transformer class. * This is mandatory and must be implemented in the final event transformer class.
*/ */
abstract public function get_start_time(): string; abstract protected function get_start_time(): string;
/** /**
* Get the end time. * Get the end time.
* *
* This is not mandatory and therefore just return null by default. * This is not mandatory and therefore just return null by default.
*/ */
public function get_end_time(): ?string { protected function get_end_time(): ?string {
return null; return null;
} }
@ -166,14 +164,14 @@ abstract class Event extends Post {
* *
* This should be overridden in the actual event transformer. * This should be overridden in the actual event transformer.
*/ */
public function get_location(): ?Place { protected function get_location(): ?Place {
return null; return null;
} }
/** /**
* Default value for the event status. * Default value for the event status.
*/ */
public function get_status(): ?string { protected function get_status(): ?string {
return 'CONFIRMED'; return 'CONFIRMED';
} }
@ -196,7 +194,7 @@ abstract class Event extends Post {
* *
* @param ?string $time The time which needs to be formatted. * @param ?string $time The time which needs to be formatted.
*/ */
protected static function format_time( $time ) { private static function format_time( $time ) {
if ( is_null( $time ) ) { if ( is_null( $time ) ) {
return ''; return '';
} }
@ -207,161 +205,25 @@ abstract class Event extends Post {
} }
/** /**
* Generates output for the 'ap_start_time' shortcode. * Format a human readable address.
*
* @param ?array $atts The shortcode's attributes.
* @return string The formatted start date and time of the event.
*/ */
public function shortcode_start_time( $atts ) { protected function format_address(): string {
$start_timestamp = $this->get_start_time();
return $this->generate_time_output( $start_timestamp, $atts, '🗓️', __( 'Start', 'activitypub-event-bridge' ) );
}
/**
* Generates output for the 'ap_end_time' shortcode.
*
* @param ?array $atts The shortcode's attributes.
* @return string The formatted end date and time of the event.
*/
public function shortcode_end_time( $atts ) {
$end_timestamp = $this->get_end_time();
return $this->generate_time_output( $end_timestamp, $atts, '⏳', __( 'End', 'activitypub-event-bridge' ) );
}
/**
* Generates the formatted time output for a shortcode.
*
* @param int|null $timestamp The timestamp for the event time.
* @param array $atts The shortcode attributes.
* @param string $icon The icon to display.
* @param string $label The label to display (e.g., 'Start', 'End').
* @return string The formatted date and time, or an empty string if the timestamp is invalid.
*/
private function generate_time_output( $timestamp, $atts, $icon, $label ) {
if ( ! $timestamp ) {
return '';
}
$args = shortcode_atts(
array(
'icon' => 'true',
'label' => 'true',
),
$atts
);
$args['icon'] = filter_var( $args['icon'], FILTER_VALIDATE_BOOLEAN );
$args['label'] = filter_var( $args['label'], FILTER_VALIDATE_BOOLEAN );
$output = array();
if ( $args['icon'] ) {
$output[] = $icon;
}
if ( $args['label'] ) {
$output[] = $label . ':';
}
$output[] = self::format_time( $timestamp );
return implode( ' ', $output );
}
/**
* Generates output for the 'ap_location' shortcode.
*
* @param ?array $atts The shortcode's attributes.
* @return string The formatted location/address of the event.
*/
public function shortcode_location( $atts ) {
$args = shortcode_atts(
array(
'icon' => 'true',
'label' => 'true',
'country' => 'true',
'zip' => 'true',
'city' => 'true',
'street' => 'true',
'name' => 'true',
),
$atts,
'ap_location'
);
// Convert attributes to booleans.
$args = array_map(
function ( $value ) {
return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
},
$args
);
$location = $this->get_location(); $location = $this->get_location();
if ( ! $location ) { if ( is_null( $location ) ) {
return ''; return '';
} }
$address = $location->get_address();
$output = array(); if ( ! $address ) {
if ( $args['icon'] ) { return $location->get_name();
$output[] = '📍';
} }
if ( $args['label'] ) {
$output[] = esc_html__( 'Location', 'activitypub-event-bridge' ) . ':';
}
$output[] = self::format_address( $location->get_address(), $args );
// Join output array into a single string with spaces and return.
return implode( ' ', array_filter( $output ) );
}
/**
* Formats the address based on provided arguments.
*
* @param mixed $address The address data, either as a string or an array.
* @param array $args The arguments for which components to include.
* @return string The formatted address.
*/
protected static function format_address( $address, $args = null ) {
if ( is_string( $address ) ) { if ( is_string( $address ) ) {
return esc_html( $address ); return $address;
} }
if ( ! is_array( $address ) ) {
if ( is_null( $args ) ) {
$args = array(
'icon' => 'true',
'title' => 'true',
'country' => 'true',
'zip' => 'true',
'city' => 'true',
'street' => 'true',
'name' => 'true',
);
}
if ( is_array( $address ) ) {
$address_parts = array();
$components = array(
'name' => 'name',
'street' => 'streetAddress',
'zip' => 'postalCode',
'city' => 'addressLocality',
'country' => 'addressCountry',
);
foreach ( $components as $arg_key => $address_key ) {
if ( $args[ $arg_key ] && ! empty( $address[ $address_key ] ) ) {
$address_parts[] = esc_html( $address[ $address_key ] );
}
}
return implode( ', ', $address_parts );
}
return ''; return '';
} }
return isset( $address['locality'] ) ? $address['locality'] : '';
}
/** /**
* Format the category using the translation. * Format the category using the translation.
@ -393,68 +255,6 @@ abstract class Event extends Post {
return ''; return '';
} }
/**
* Register the shortcodes.
*/
public function register_shortcodes() {
foreach ( get_class_methods( self::class ) as $function ) {
if ( 'shortcode_' === substr( $function, 0, 10 ) ) {
add_shortcode( 'ap_' . substr( $function, 10, strlen( $function ) ), array( $this, $function ) );
}
}
}
/**
* Register the shortcodes.
*/
public function unregister_shortcodes() {
foreach ( get_class_methods( self::class ) as $function ) {
if ( 'shortcode_' === substr( $function, 0, 10 ) ) {
remove_shortcode( 'ap_' . substr( $function, 10, strlen( $function ) ), array( $this, $function ) );
}
}
}
/**
* Get the summary.
*/
public function get_summary(): ?string {
if ( 'preset' === get_option( 'activitypub_summary_type', 'preset' ) ) {
return $this->format_preset_summary();
}
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$post = $this->wp_object;
$summary = $this->get_event_summary_template();
// It seems that shortcodes are only applied to published posts.
if ( is_preview() ) {
$post->post_status = 'publish';
}
// Register our shortcodes just in time.
Shortcodes::register();
$this->register_shortcodes();
// Fill in the shortcodes.
\setup_postdata( $post );
$summary = \do_shortcode( $summary );
\wp_reset_postdata();
$summary = \wpautop( $summary );
$summary = \preg_replace( '/[\n\r\t]/', '', $summary );
$summary = \trim( $summary );
$summary = \apply_filters( 'activitypub_event_bridge_the_summary', $summary, $post );
// Unregister the shortcodes.
Shortcodes::unregister();
$this->unregister_shortcodes();
return $summary;
}
/** /**
* Create a custom summary. * Create a custom summary.
* *
@ -463,7 +263,7 @@ abstract class Event extends Post {
* *
* @return string $summary The custom event summary. * @return string $summary The custom event summary.
*/ */
public function format_preset_summary(): ?string { public function get_summary(): ?string {
add_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ), 2, 2 ); add_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ), 2, 2 );
$excerpt = $this->retrieve_excerpt(); $excerpt = $this->retrieve_excerpt();
// BeforeFirstRelease: decide whether this should be a admin setting. // BeforeFirstRelease: decide whether this should be a admin setting.
@ -474,13 +274,9 @@ abstract class Event extends Post {
remove_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ) ); remove_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ) );
$category = $this->format_categories(); $category = $this->format_categories();
$start_time = $this->get_start_time(); $start_time = $this->format_start_time();
$end_time = $this->get_end_time(); $end_time = $this->format_end_time();
$address = $this->format_address( $this->get_location() ); $address = $this->format_address();
$time_atts = array(
'icon' => true,
'label' => true,
);
$formatted_items = array(); $formatted_items = array();
if ( ! empty( $category ) ) { if ( ! empty( $category ) ) {
@ -488,11 +284,11 @@ abstract class Event extends Post {
} }
if ( ! empty( $start_time ) ) { if ( ! empty( $start_time ) ) {
$formatted_items[] = $this->generate_time_output( $start_time, $time_atts, '🗓️', __( 'Start', 'activitypub-event-bridge' ) ); $formatted_items[] = '🗓️ ' . __( 'Start', 'activitypub-event-bridge' ) . ': ' . $start_time;
} }
if ( ! empty( $end_time ) ) { if ( ! empty( $end_time ) ) {
$formatted_items[] = $this->generate_time_output( $end_time, $time_atts, '⏳', __( 'End', 'activitypub-event-bridge' ) ); $formatted_items[] = '⏳ ' . __( 'End', 'activitypub-event-bridge' ) . ': ' . $end_time;
} }
if ( ! empty( $address ) ) { if ( ! empty( $address ) ) {
@ -512,18 +308,6 @@ abstract class Event extends Post {
return $summary; return $summary;
} }
/**
* Gets the template to use to generate the summary of the ActivityStreams representation of an event post.
*
* @return string The Template.
*/
protected function get_event_summary_template() {
$summary = \get_option( 'activitypub_event_bridge_custom_summary', ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY );
$template = $summary ?? ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY;
return apply_filters( 'activitypub_event_bridge_summary_template', $template, $this->wp_object );
}
/** /**
* By default set the timezone of the WordPress site. * By default set the timezone of the WordPress site.
* *

View file

@ -73,14 +73,14 @@ final class GatherPress extends Event {
/** /**
* Get the end time from the event object. * Get the end time from the event object.
*/ */
public function get_end_time(): ?string { protected function get_end_time(): ?string {
return $this->gp_event->get_datetime_end( 'Y-m-d\TH:i:s\Z' ); return $this->gp_event->get_datetime_end( 'Y-m-d\TH:i:s\Z' );
} }
/** /**
* Get the end time from the event object. * Get the end time from the event object.
*/ */
public function get_start_time(): string { protected function get_start_time(): string {
return $this->gp_event->get_datetime_start( 'Y-m-d\TH:i:s\Z' ); return $this->gp_event->get_datetime_start( 'Y-m-d\TH:i:s\Z' );
} }

View file

@ -72,7 +72,7 @@ final class The_Events_Calendar extends Event {
/** /**
* Get the end time from the event object. * Get the end time from the event object.
*/ */
public function get_end_time(): ?string { protected function get_end_time(): ?string {
if ( empty( $this->tribe_event->end_date ) ) { if ( empty( $this->tribe_event->end_date ) ) {
return null; return null;
} }
@ -83,7 +83,7 @@ final class The_Events_Calendar extends Event {
/** /**
* Get the end time from the event object. * Get the end time from the event object.
*/ */
public function get_start_time(): string { protected function get_start_time(): string {
$date = date_create( $this->tribe_event->start_date, wp_timezone() ); $date = date_create( $this->tribe_event->start_date, wp_timezone() );
return \gmdate( 'Y-m-d\TH:i:s\Z', $date->getTimestamp() ); return \gmdate( 'Y-m-d\TH:i:s\Z', $date->getTimestamp() );
} }

View file

@ -44,7 +44,7 @@ final class VS_Event_List extends Event_Transformer {
/** /**
* Get the end time from the events metadata. * Get the end time from the events metadata.
*/ */
public function get_end_time(): ?string { protected function get_end_time(): ?string {
if ( 'yes' === get_post_meta( $this->wp_object->ID, 'event-hide-end-time', true ) ) { if ( 'yes' === get_post_meta( $this->wp_object->ID, 'event-hide-end-time', true ) ) {
return null; return null;
} }
@ -58,7 +58,7 @@ final class VS_Event_List extends Event_Transformer {
/** /**
* Get the end time from the events metadata. * Get the end time from the events metadata.
*/ */
public function get_start_time(): string { protected function get_start_time(): string {
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true ); $start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
return \gmdate( 'Y-m-d\TH:i:s\Z', $start_time ); return \gmdate( 'Y-m-d\TH:i:s\Z', $start_time );
} }

View file

@ -71,28 +71,6 @@ class Settings {
'default' => 1, 'default' => 1,
) )
); );
\register_setting(
'activitypub-event-bridge',
'activitypub_summary_type',
array(
'type' => 'string',
'description' => \__( 'Summary type to use for ActivityStreams', 'activitypub-event-bridge' ),
'show_in_rest' => true,
'default' => 'preset',
)
);
\register_setting(
'activitypub-event-bridge',
'activitypub_event_bridge_custom_summary',
array(
'type' => 'string',
'description' => \__( 'Define your own custom summary template for events', 'activitypub-event-bridge' ),
'show_in_rest' => true,
'default' => ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY,
)
);
} }
/** /**

View file

@ -42,52 +42,6 @@ $current_category_mapping = \get_option( 'activitypub_event_bridge_event_
<div class="activitypub-event-bridge-settings activitypub-event-bridge-settings-page hide-if-no-js"> <div class="activitypub-event-bridge-settings activitypub-event-bridge-settings-page hide-if-no-js">
<form method="post" action="options.php"> <form method="post" action="options.php">
<?php \settings_fields( 'activitypub-event-bridge' ); ?> <?php \settings_fields( 'activitypub-event-bridge' ); ?>
<div class="box">
<h2> <?php esc_html_e( 'Event Summary Text', 'activitypub-event-bridge' ); ?> </h2>
<p><?php esc_html_e( 'Many Fediverse applications (e.g., Mastodon) don\'t fully support events, instead they will show a summary text along with the events title and the URL to your Website.', 'activitypub-event-bridge' ); ?></p>
<p>
<label for="activitypub_summary_type_preset">
<input type="radio" name="activitypub_summary_type" id="activitypub_summary_type_preset" value="preset" <?php echo \checked( 'preset', \get_option( 'activitypub_summary_type', ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE ) ); ?> />
<?php \esc_html_e( 'Automatic (default)', 'activitypub' ); ?>
-
<span class="description">
<?php \esc_html_e( 'Let the plugin compose a summary for you. ', 'activitypub-event-bridge' ); ?>
</span>
</label>
</p>
<p>
<label for="activitypub_summary_type_custom">
<input type="radio" name="activitypub_summary_type" id="activitypub_summary_type_custom" value="custom" <?php echo \checked( 'custom', \get_option( 'activitypub_summary_type', ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE ) ); ?> />
<?php \esc_html_e( 'Custom', 'activitypub-event-bridge' ); ?>
-
<span class="description">
<?php \esc_html_e( 'For advanced users: compose your custom summary via shortcodes.', 'activitypub-event-bridge' ); ?>
</span>
</label>
</p>
<div id="activitypub_summary_type_custom-details">
<textarea name="activitypub_event_bridge_custom_summary" id="activitypub_event_bridge_custom_summary" rows="10" cols="50" class="large-text" placeholder="<?php echo wp_kses( ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY, 'post' ); ?>"><?php echo esc_textarea( wp_kses( \get_option( 'activitypub_event_bridge_custom_summary', ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY ), 'post' ) ); ?></textarea>
<details>
<summary><?php esc_html_e( 'See a list Template Tags available for the summary.', 'activitypub' ); ?></summary>
<div class="description">
<dl>
<dt><code>[ap_start_time]</code><dt>
<dd><?php \esc_html_e( 'The events title.', 'activitypub-event-bridge' ); ?></dd>
<dt><code>[ap_end_time]</code><dt>
<dd><?php \esc_html_e( 'The events content.', 'activitypub-event-bridge' ); ?></dd>
<dt><code>[ap_location]</code><dt>
<dd><?php \esc_html_e( 'The events location.', 'activitypub-event-bridge' ); ?></dd>
<dt><code>[ap_hashtags]</code><dt>
<dd><?php \esc_html_e( 'The events tags as hashtags.', 'activitypub-event-bridge' ); ?></dd>
<dt><code>[ap_excerpt]</code><dt>
<dd><?php \esc_html_e( 'The events excerpt (may be truncated).', 'activitypub-event-bridge' ); ?></dd>
<dt><code>[ap_content]</code><dt>
<dd><?php \esc_html_e( 'The events description.', 'activitypub-event-bridge' ); ?></dd>
</dl>
</div>
</details>
</div>
</div>
<div class="box"> <div class="box">
<h2> <?php esc_html_e( 'ActivityPub Event Category', 'activitypub-event-bridge' ); ?> </h2> <h2> <?php esc_html_e( 'ActivityPub Event Category', 'activitypub-event-bridge' ); ?> </h2>

View file

@ -25,21 +25,6 @@ if ( ! file_exists( "{$_tests_dir}/includes/functions.php" ) ) {
// Give access to tests_add_filter() function. // Give access to tests_add_filter() function.
require_once "{$_tests_dir}/includes/functions.php"; require_once "{$_tests_dir}/includes/functions.php";
/**
* Function to manually load an event plugin.
*
* @param string $plugin_file The main plugin file of the event plugin.
*/
function _manually_load_event_plugin( $plugin_file ) {
$plugin_dir = ABSPATH . '/wp-content/plugins/';
require_once $plugin_dir . $plugin_file;
update_option( 'purchase_history_table_structure_migration_done', true );
$current = get_option( 'active_plugins', array() );
$current[] = $plugin_file;
sort( $current );
update_option( 'active_plugins', $current );
}
/** /**
* Manually load the plugin being tested and its integrations. * Manually load the plugin being tested and its integrations.
*/ */
@ -89,12 +74,13 @@ function _manually_load_plugin() {
} }
if ( $plugin_file ) { if ( $plugin_file ) {
_manually_load_event_plugin( $plugin_file ); // Manually load the event plugin.
} else { require_once $plugin_dir . $plugin_file;
// For all other tests we mainly use the Events Calendar as a reference. update_option( 'purchase_history_table_structure_migration_done', true );
_manually_load_event_plugin( 'the-events-calendar/the-events-calendar.php' ); $current = get_option( 'active_plugins', array() );
_manually_load_event_plugin( 'very-simple-event-list/vsel.php' ); $current[] = $plugin_file;
sort( $current );
update_option( 'active_plugins', $current );
} }
// Hot fix that allows using Events Manager within unit tests, because the em_init() is later not run as admin. // Hot fix that allows using Events Manager within unit tests, because the em_init() is later not run as admin.

View file

@ -1,193 +0,0 @@
<?php
/**
* Test file for Activitypub Shortcodes.
*
* @package ActivityPub_Event_Bridge
* @license AGPL-3.0-or-later
*/
use Activitypub\Shortcodes;
/**
* Test class for Activitypub Shortcodes.
*
* @coversDefaultClass \Activitypub\Shortcodes
*/
class Test_Activitypub_Event_Bridge_Shortcodes extends WP_UnitTestCase {
/**
* Override the setup function, so that tests don't run if the Events Calendar is not active.
*/
public function set_up() {
parent::set_up();
if ( ! class_exists( '\Tribe__Events__Main' ) ) {
self::markTestSkipped( 'The Events Calendar plugin is needed to test Event Shortcodes' );
}
// Make sure that ActivityPub support is enabled for The Events Calendar.
$aec = \ActivityPub_Event_Bridge\Setup::get_instance();
$aec->activate_activitypub_support_for_active_event_plugins();
// Delete all posts afterwards.
_delete_all_posts();
}
/**
* Test the shortcode for rendering the events start time.
*/
public function test_start_time() {
// Create a The Events Calendar Event without content.
$wp_object = tribe_events()
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
->create();
// Call the transformer Factory.
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
return;
}
$transformer->register_shortcodes();
$summary = '[ap_start_time]';
$summary = do_shortcode( $summary );
$this->assertEquals( '🗓️ Start: December 1, 2024 3:00 pm', $summary );
$summary = '[ap_start_time icon="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'Start: December 1, 2024 3:00 pm', $summary );
$summary = '[ap_start_time icon="false" label="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'December 1, 2024 3:00 pm', $summary );
$transformer->unregister_shortcodes();
}
/**
* Test the shortcode for rendering the events end time.
*/
public function test_end_time() {
// Create a The Events Calendar Event without content.
$wp_object = tribe_events()
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
->create();
// Call the transformer Factory.
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
return;
}
$transformer->register_shortcodes();
$summary = '[ap_end_time]';
$summary = do_shortcode( $summary );
$this->assertEquals( '⏳ End: December 1, 2024 4:00 pm', $summary );
$summary = '[ap_end_time icon="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'End: December 1, 2024 4:00 pm', $summary );
$summary = '[ap_end_time icon="false" label="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'December 1, 2024 4:00 pm', $summary );
$transformer->unregister_shortcodes();
}
/**
* Test the shortcode for rendering the events location when no location is set.
*/
public function test_location_when_no_location_is_set() {
// Create a The Events Calendar Event without content.
$wp_object = tribe_events()
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
->create();
// Call the transformer Factory.
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
return;
}
$transformer->register_shortcodes();
$summary = '[ap_location]';
$summary = do_shortcode( $summary );
$this->assertEquals( '', $summary );
$transformer->unregister_shortcodes();
}
/**
* Test the shortcode for rendering the events location when location is set.
*/
public function test_location_when_location_is_set() {
// Create Venue.
$venue = tribe_venues()->set_args( Test_The_Events_Calendar::MOCKUP_VENUS['minimal_venue'] )->create();
// Create a The Events Calendar Event.
$wp_object = tribe_events()
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['complex_event'] )
->set( 'venue', $venue->ID )
->create();
// Call the transformer Factory.
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
return;
}
$transformer->register_shortcodes();
$summary = '[ap_location]';
$summary = do_shortcode( $summary );
$this->assertEquals( '📍 Location: Minimal Venue', $summary );
$summary = '[ap_location icon="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'Location: Minimal Venue', $summary );
$summary = '[ap_location icon="false" label="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( 'Minimal Venue', $summary );
$transformer->unregister_shortcodes();
}
/**
* Test the shortcode for rendering the events location when location with detailed address is set.
*/
public function test_location_when_detailed_location_is_set() {
// Create Venue.
$venue = tribe_venues()->set_args( Test_The_Events_Calendar::MOCKUP_VENUS['complex_venue'] )->create();
// Create a The Events Calendar Event.
$wp_object = tribe_events()
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['complex_event'] )
->set( 'venue', $venue->ID )
->create();
// Call the transformer Factory.
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
return;
}
$transformer->register_shortcodes();
$summary = '[ap_location]';
$summary = do_shortcode( $summary );
$this->assertEquals( '📍 Location: Complex Venue, Venue address, Venue zip, Venue city, Venue country', $summary );
$summary = '[ap_location country="false"]';
$summary = do_shortcode( $summary );
$this->assertEquals( '📍 Location: Complex Venue, Venue address, Venue zip, Venue city', $summary );
$transformer->unregister_shortcodes();
}
}