- Refactored fallback submission logic in `class-event-handler.php` to remove `wp_die`/`exit` calls and use redirects for error handling, enabling proper unit testing. - Implemented meta-data saving (dates, venue, organizer) in the fallback logic using `update_post_meta`. - Updated unit tests (`test-event-management.php`) to remove `markTestIncomplete` calls related to handler errors and uncommented meta assertions. Unit tests for fallback logic now pass. - Added Instructions section and Return to Dashboard button to the event form shortcode (`display_event_form_shortcode`). - Applied basic theme styling classes (`ast-container`, `notice`, `ast-button`) to the event form. - Updated `docs/implementation_plan.md` to reflect completion of tasks 4.1-4.5 and set focus to Task 5. Refs: Task 4.1, 4.2, 4.3, 4.4, 4.5
		
			
				
	
	
		
			407 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			407 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php # -*- coding: utf-8 -*-
 | |
| /*
 | |
|  * This file is part of the BrainMonkey package.
 | |
|  *
 | |
|  * (c) Giuseppe Mazzapica
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| // Ignore this. Just a safeguard in case of WordPress + Composer broken (really broken) setup.
 | |
| namespace {
 | |
| 
 | |
|     if (function_exists('Brain\Monkey\setUp')) {
 | |
|         return;
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace Brain\Monkey {
 | |
| 
 | |
|     /**
 | |
|      * Setup function to be called before _each_ unit test. This is not required to just mock
 | |
|      * PHP functions without using WP features.
 | |
|      */
 | |
|     function setUp()
 | |
|     {
 | |
|         require_once dirname(__DIR__).'/inc/patchwork-loader.php';
 | |
|         require_once dirname(__DIR__).'/inc/wp-hook-functions.php';
 | |
|         require_once dirname(__DIR__).'/inc/wp-helper-functions.php';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Setup function to be called after _each_ unit test. This is *always* required.
 | |
|      */
 | |
|     function tearDown()
 | |
|     {
 | |
|         Container::instance()->reset();
 | |
|         \Mockery::close();
 | |
|         \Patchwork\restoreAll();
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace Brain\Monkey\Functions {
 | |
| 
 | |
|     use Brain\Monkey\Container;
 | |
|     use Brain\Monkey\Expectation\EscapeHelper;
 | |
|     use Brain\Monkey\Expectation\FunctionStubFactory;
 | |
|     use Brain\Monkey\Name\FunctionName;
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for plain functions stub.
 | |
|      *
 | |
|      * Factory method: receives the name of the function to mock and returns an instance of
 | |
|      * FunctionStub.
 | |
|      *
 | |
|      * @param string $function_name the name of the function to mock
 | |
|      * @return \Brain\Monkey\Expectation\FunctionStub
 | |
|      */
 | |
|     function when($function_name)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->functionStubFactory()
 | |
|                         ->create(new FunctionName($function_name), FunctionStubFactory::SCOPE_STUB);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API method to fast & simple create multiple functions stubs.
 | |
|      *
 | |
|      * It does not allow to add expectations.
 | |
|      *
 | |
|      * The function name to create stub for can be passed as array key or as array value (with no
 | |
|      * key).
 | |
|      *
 | |
|      * When the function name is in the key, the value can be:
 | |
|      *   - a callable, in which case the function will be aliased to it
 | |
|      *   - anything else, in which case a stub returning given value will be created for the
 | |
|      *   function
 | |
|      *
 | |
|      * When the function name is in the value, and no key is set, the behavior will change based on
 | |
|      * the second param:
 | |
|      *   - when 2nd param is `null` (default) the created stub will return the 1st param it will
 | |
|      *   receive
 | |
|      *   - when 2nd param is anything else the created stub will return it
 | |
|      *
 | |
|      *
 | |
|      * @param array      $functions
 | |
|      * @param mixed|null $default_return
 | |
|      */
 | |
|     function stubs(array $functions, $default_return = null)
 | |
|     {
 | |
|         foreach ($functions as $key => $value) {
 | |
| 
 | |
|             list($function_name, $return_value) = is_numeric($key)
 | |
|                 ? [$value, $default_return]
 | |
|                 : [$key, $value];
 | |
| 
 | |
|             if (is_callable($return_value)) {
 | |
|                 when($function_name)->alias($return_value);
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $return_value === null
 | |
|                 ? when($function_name)->returnArg()
 | |
|                 : when($function_name)->justReturn($return_value);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for plain functions expectations.
 | |
|      *
 | |
|      * Returns a Mockery Expectation object, where is possible to set all the expectations, using
 | |
|      * Mockery methods.
 | |
|      *
 | |
|      * @param string $function_name
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expect($function_name)
 | |
|     {
 | |
|         $name = new FunctionName($function_name);
 | |
|         $expectation = Container::instance()
 | |
|                                 ->expectationFactory()
 | |
|                                 ->forFunctionExecuted($function_name);
 | |
| 
 | |
|         $factory = Container::instance()->functionStubFactory();
 | |
|         if ( ! $factory->has($name)) {
 | |
|             $factory->create($name, FunctionStubFactory::SCOPE_EXPECTATION)
 | |
|                     ->redefineUsingExpectation($expectation);
 | |
| 
 | |
|         }
 | |
| 
 | |
|         return $expectation;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Stub translation functions.
 | |
|      *
 | |
|      * @see EscapeHelper
 | |
|      */
 | |
|     function stubTranslationFunctions()
 | |
|     {
 | |
|         stubs(
 | |
|             [
 | |
|                 '__',
 | |
|                 '_x',
 | |
|                 'translate',
 | |
|                 '_n'         => static function($single, $plural, $number) {
 | |
|                     return ($number === 1) ? $single : $plural;
 | |
|                 },
 | |
|                 '_nx'        => static function($single, $plural, $number) {
 | |
|                     return ($number === 1) ? $single : $plural;
 | |
|                 },
 | |
|                 'esc_html__' => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_html_x' => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_attr__' => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_attr_x' => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_html_e' => [EscapeHelper::class, 'escAndEcho'],
 | |
|                 'esc_attr_e' => [EscapeHelper::class, 'escAndEcho'],
 | |
|                 '_n_noop'    => static function ($singular, $plural) {
 | |
|                     return compact('singular', 'plural');
 | |
|                 },
 | |
|                 '_nx_noop' => static function ($singular, $plural) {
 | |
|                     return compact('singular', 'plural');
 | |
|                 },
 | |
|                 'translate_nooped_plural' => static function($nooped_plural, $count) {
 | |
|                     return ($count === 1) ? $nooped_plural['singular'] : $nooped_plural['plural'];
 | |
|                 },
 | |
|             ]
 | |
|         );
 | |
| 
 | |
|         when('_e')->echoArg();
 | |
|         when('_ex')->echoArg();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Stub escape functions with default behavior.
 | |
|      *
 | |
|      * @see EscapeHelper
 | |
|      */
 | |
|     function stubEscapeFunctions()
 | |
|     {
 | |
|         stubs(
 | |
|             [
 | |
|                 'esc_js'       => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_sql'      => 'addslashes',
 | |
|                 'esc_attr'     => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_html'     => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_textarea' => [EscapeHelper::class, 'esc'],
 | |
|                 'esc_url'      => [EscapeHelper::class, 'escUrl'],
 | |
|                 'esc_url_raw'  => [EscapeHelper::class, 'escUrlRaw'],
 | |
|                 'esc_xml'      => [EscapeHelper::class, 'escXml'],
 | |
|             ]
 | |
|         );
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace Brain\Monkey\Actions {
 | |
| 
 | |
|     use Brain\Monkey\Container;
 | |
|     use Brain\Monkey\Hook;
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for added action expectations.
 | |
|      *
 | |
|      * Takes the action name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectAdded($action)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forActionAdded($action);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for fired action expectations.
 | |
|      *
 | |
|      * Takes the action name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectDone($action)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forActionDone($action);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if any or specific callback has been added to given action.
 | |
|      *
 | |
|      * Brain Monkey version of `has_action` will alias here.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @param null   $callback
 | |
|      * @return bool
 | |
|      */
 | |
|     function has($action, $callback = null)
 | |
|     {
 | |
|         $type = Hook\HookStorage::ACTIONS;
 | |
|         $hookStorage = Container::instance()->hookStorage();
 | |
| 
 | |
|         if ($callback === null) {
 | |
|             return $hookStorage->isHookAdded($type, $action);
 | |
|         }
 | |
| 
 | |
|         return $hookStorage->hookPriority($type, $action, $callback);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if given action has been done.
 | |
|      *
 | |
|      * Brain Monkey version of `did_action` will alias here.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @return int
 | |
|      */
 | |
|     function did($action)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->hookStorage()
 | |
|                         ->isHookDone(Hook\HookStorage::ACTIONS, $action);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if given action is currently being done.
 | |
|      *
 | |
|      * Brain Monkey version of `doing_action` will alias here.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @return bool
 | |
|      */
 | |
|     function doing($action)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->hookRunningStack()
 | |
|                         ->has($action);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for removed action expectations.
 | |
|      *
 | |
|      * Takes the action name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $action
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectRemoved($action)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forActionRemoved($action);
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace Brain\Monkey\Filters {
 | |
| 
 | |
|     use Brain\Monkey\Container;
 | |
|     use Brain\Monkey\Hook;
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for added filter expectations.
 | |
|      *
 | |
|      * Takes the filter name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectAdded($filter)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forFilterAdded($filter);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for applied filter expectations.
 | |
|      *
 | |
|      * Takes the filter name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectApplied($filter)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forFilterApplied($filter);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if any or specific callback has been added to given filter.
 | |
|      *
 | |
|      * Brain Monkey version of `has_filter` will alias here.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @param null   $callback
 | |
|      * @return bool|int If callback is omitted, returns boolean for whether the hook has anything registered.
 | |
|      *                  When checking a specific callback, the priority of that hook is returned,
 | |
|      *                  or false if the callback is not attached.
 | |
|      */
 | |
|     function has($filter, $callback = null)
 | |
|     {
 | |
|         $type = Hook\HookStorage::FILTERS;
 | |
|         $hookStorage = Container::instance()->hookStorage();
 | |
| 
 | |
|         if ($callback === null) {
 | |
|             return $hookStorage->isHookAdded($type, $filter);
 | |
|         }
 | |
| 
 | |
|         return $hookStorage->hookPriority($type, $filter, $callback);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if given filter as been applied.
 | |
|      *
 | |
|      * There's no WordPress function counter part for it.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return int
 | |
|      */
 | |
|     function applied($filter)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->hookStorage()
 | |
|                         ->isHookDone(Hook\HookStorage::FILTERS, $filter);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Utility method to check if given filter is currently being done.
 | |
|      *
 | |
|      * Brain Monkey version of `doing_filter` will alias here.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return bool
 | |
|      */
 | |
|     function doing($filter)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->hookRunningStack()
 | |
|                         ->has($filter);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * API entry-point for removed action expectations.
 | |
|      *
 | |
|      * Takes the action name and returns a Mockery Expectation object, where is possible to set all
 | |
|      * the expectations, using Mockery methods.
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return \Brain\Monkey\Expectation\Expectation
 | |
|      */
 | |
|     function expectRemoved($filter)
 | |
|     {
 | |
|         return Container::instance()
 | |
|                         ->expectationFactory()
 | |
|                         ->forFilterRemoved($filter);
 | |
|     }
 | |
| }
 | |
| 
 |