-
Notifications
You must be signed in to change notification settings - Fork 46
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Run the WP Core cron tests from the source.
- Loading branch information
1 parent
95f88dd
commit 7e66913
Showing
1 changed file
with
7 additions
and
265 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,276 +1,18 @@ | ||
<?php | ||
// phpcs:ignoreFile | ||
namespace HM\Cavalcade\Tests; | ||
|
||
use WP_UnitTestCase; | ||
use Tests_Cron; | ||
|
||
/** | ||
* Duplicate the WordPress Core tests | ||
* Run the WordPress Core tests | ||
* | ||
* This ensures Cavalcade behaves in the same way | ||
* as WordPress Core. | ||
*/ | ||
class Tests_Core extends WP_UnitTestCase { | ||
function setUp() { | ||
parent::setUp(); | ||
// make sure the schedule is clear | ||
_set_cron_array(array()); | ||
} | ||
|
||
function tearDown() { | ||
// make sure the schedule is clear | ||
_set_cron_array(array()); | ||
parent::tearDown(); | ||
} | ||
|
||
function test_wp_get_schedule_empty() { | ||
// nothing scheduled | ||
$hook = __FUNCTION__; | ||
$this->assertFalse(wp_get_schedule($hook)); | ||
} | ||
|
||
function test_schedule_event_single() { | ||
// schedule an event and make sure it's returned by wp_next_scheduled | ||
$hook = __FUNCTION__; | ||
$timestamp = strtotime('+1 hour'); | ||
|
||
wp_schedule_single_event( $timestamp, $hook ); | ||
$this->assertEquals( $timestamp, wp_next_scheduled($hook) ); | ||
|
||
// it's a non recurring event | ||
$this->assertEquals( '', wp_get_schedule($hook) ); | ||
|
||
} | ||
|
||
function test_schedule_event_single_args() { | ||
// schedule an event with arguments and make sure it's returned by wp_next_scheduled | ||
$hook = 'event'; | ||
$timestamp = strtotime('+1 hour'); | ||
$args = array('foo'); | ||
|
||
wp_schedule_single_event( $timestamp, $hook, $args ); | ||
// this returns the timestamp only if we provide matching args | ||
$this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); | ||
// these don't match so return nothing | ||
$this->assertEquals( false, wp_next_scheduled($hook) ); | ||
$this->assertEquals( false, wp_next_scheduled($hook, array('bar')) ); | ||
|
||
// it's a non recurring event | ||
$this->assertEquals( '', wp_get_schedule($hook, $args) ); | ||
} | ||
|
||
function test_schedule_event() { | ||
// schedule an event and make sure it's returned by wp_next_scheduled | ||
$hook = __FUNCTION__; | ||
$recur = 'hourly'; | ||
$timestamp = strtotime('+1 hour'); | ||
|
||
wp_schedule_event( $timestamp, $recur, $hook ); | ||
// it's scheduled for the right time | ||
$this->assertEquals( $timestamp, wp_next_scheduled($hook) ); | ||
// it's a recurring event | ||
$this->assertEquals( $recur, wp_get_schedule($hook) ); | ||
} | ||
|
||
function test_schedule_event_args() { | ||
// schedule an event and make sure it's returned by wp_next_scheduled | ||
$hook = 'event'; | ||
$timestamp = strtotime('+1 hour'); | ||
$recur = 'hourly'; | ||
$args = array('foo'); | ||
|
||
wp_schedule_event( $timestamp, 'hourly', $hook, $args ); | ||
// this returns the timestamp only if we provide matching args | ||
$this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); | ||
// these don't match so return nothing | ||
$this->assertEquals( false, wp_next_scheduled($hook) ); | ||
$this->assertEquals( false, wp_next_scheduled($hook, array('bar')) ); | ||
|
||
$this->assertEquals( $recur, wp_get_schedule($hook, $args) ); | ||
|
||
} | ||
|
||
function test_unschedule_event() { | ||
// schedule an event and make sure it's returned by wp_next_scheduled | ||
$hook = __FUNCTION__; | ||
$timestamp = strtotime('+1 hour'); | ||
|
||
wp_schedule_single_event( $timestamp, $hook ); | ||
$this->assertEquals( $timestamp, wp_next_scheduled($hook) ); | ||
|
||
// now unschedule it and make sure it's gone | ||
wp_unschedule_event( $timestamp, $hook ); | ||
$this->assertEquals( false, wp_next_scheduled($hook) ); | ||
} | ||
|
||
function test_clear_schedule() { | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1' ); | ||
|
||
// schedule several events with and without arguments | ||
wp_schedule_single_event( strtotime('+1 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+2 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); | ||
wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); | ||
|
||
// make sure they're returned by wp_next_scheduled() | ||
$this->assertTrue( wp_next_scheduled($hook) > 0 ); | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the no args events and make sure it's gone | ||
wp_clear_scheduled_hook($hook); | ||
$this->assertFalse( wp_next_scheduled($hook) ); | ||
// the args events should still be there | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the args events and make sure they're gone too | ||
// note: wp_clear_scheduled_hook() expects args passed directly, rather than as an array | ||
wp_clear_scheduled_hook($hook, $args); | ||
$this->assertFalse( wp_next_scheduled($hook, $args) ); | ||
} | ||
|
||
function test_clear_schedule_multiple_args() { | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1', 'arg2' ); | ||
|
||
// schedule several events with and without arguments | ||
wp_schedule_single_event( strtotime('+1 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+2 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); | ||
wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); | ||
|
||
// make sure they're returned by wp_next_scheduled() | ||
$this->assertTrue( wp_next_scheduled($hook) > 0 ); | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the no args events and make sure it's gone | ||
wp_clear_scheduled_hook($hook); | ||
$this->assertFalse( wp_next_scheduled($hook) ); | ||
// the args events should still be there | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the args events and make sure they're gone too | ||
// note: wp_clear_scheduled_hook() used to expect args passed directly, rather than as an array pre WP 3.0 | ||
wp_clear_scheduled_hook($hook, $args); | ||
$this->assertFalse( wp_next_scheduled($hook, $args) ); | ||
} | ||
|
||
/** | ||
* @ticket WordPress Core 10468 | ||
class Tests_Core extends Tests_Cron { | ||
/* | ||
* This is intentionally an empty class to trigger | ||
* the WordPress core tests run. | ||
*/ | ||
function test_clear_schedule_new_args() { | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1' ); | ||
$multi_hook = __FUNCTION__ . '_multi'; | ||
$multi_args = array( 'arg2', 'arg3' ); | ||
|
||
// schedule several events with and without arguments | ||
wp_schedule_single_event( strtotime('+1 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+2 hour'), $hook ); | ||
wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); | ||
wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); | ||
wp_schedule_single_event( strtotime('+5 hour'), $multi_hook, $multi_args ); | ||
wp_schedule_single_event( strtotime('+6 hour'), $multi_hook, $multi_args ); | ||
|
||
// make sure they're returned by wp_next_scheduled() | ||
$this->assertTrue( wp_next_scheduled($hook) > 0 ); | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the no args events and make sure it's gone | ||
wp_clear_scheduled_hook($hook); | ||
$this->assertFalse( wp_next_scheduled($hook) ); | ||
// the args events should still be there | ||
$this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); | ||
|
||
// clear the schedule for the args events and make sure they're gone too | ||
// wp_clear_scheduled_hook() should take args as an array like the other functions. | ||
wp_clear_scheduled_hook($hook, $args); | ||
$this->assertFalse( wp_next_scheduled($hook, $args) ); | ||
|
||
// clear the schedule for the args events and make sure they're gone too | ||
// wp_clear_scheduled_hook() should take args as an array like the other functions and does from WP 3.0 | ||
wp_clear_scheduled_hook($multi_hook, $multi_args); | ||
$this->assertFalse( wp_next_scheduled($multi_hook, $multi_args) ); | ||
} | ||
|
||
/** | ||
* @ticket WordPress Core 18997 | ||
*/ | ||
function test_unschedule_hook() { | ||
$hook = __FUNCTION__; | ||
$args = array( rand_str() ); | ||
|
||
// schedule several events with and without arguments. | ||
wp_schedule_single_event( strtotime( '+1 hour' ), $hook ); | ||
wp_schedule_single_event( strtotime( '+2 hour' ), $hook ); | ||
wp_schedule_single_event( strtotime( '+3 hour' ), $hook, $args ); | ||
wp_schedule_single_event( strtotime( '+4 hour' ), $hook, $args ); | ||
|
||
// make sure they're returned by wp_next_scheduled(). | ||
$this->assertTrue( wp_next_scheduled( $hook ) > 0 ); | ||
$this->assertTrue( wp_next_scheduled( $hook, $args ) > 0 ); | ||
|
||
// clear the schedule and make sure it's gone. | ||
wp_unschedule_hook( $hook ); | ||
$this->assertFalse( wp_next_scheduled( $hook ) ); | ||
} | ||
|
||
/** | ||
* @ticket WordPress Core 6966 | ||
*/ | ||
function test_duplicate_event() { | ||
// duplicate events close together should be skipped | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1' ); | ||
$ts1 = strtotime('+5 minutes'); | ||
$ts2 = strtotime('+3 minutes'); | ||
|
||
// first one works | ||
wp_schedule_single_event( $ts1, $hook, $args ); | ||
// second one is ignored | ||
wp_schedule_single_event( $ts2, $hook, $args ); | ||
|
||
// the next event should be at +5 minutes, not +3 | ||
$this->assertEquals( $ts1, wp_next_scheduled($hook, $args) ); | ||
} | ||
|
||
/** | ||
* @ticket WordPress Core 6966 | ||
*/ | ||
function test_not_duplicate_event() { | ||
// duplicate events far apart should work normally | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1' ); | ||
$ts1 = strtotime( '+30 minutes' ); | ||
$ts2 = strtotime( '+3 minutes' ); | ||
|
||
// first one works | ||
wp_schedule_single_event( $ts1, $hook, $args ); | ||
// second works too | ||
wp_schedule_single_event( $ts2, $hook, $args ); | ||
|
||
// the next event should be at +3 minutes, even though that one was scheduled second | ||
$this->assertEquals( $ts2, wp_next_scheduled( $hook, $args ) ); | ||
wp_unschedule_event( $ts2, $hook, $args ); | ||
// following event at +30 minutes should be there too | ||
$this->assertEquals( $ts1, wp_next_scheduled( $hook, $args ) ); | ||
} | ||
|
||
function test_not_duplicate_event_reversed() { | ||
// duplicate events far apart should work normally regardless of order | ||
$hook = __FUNCTION__; | ||
$args = array( 'arg1' ); | ||
$ts1 = strtotime( '+3 minutes' ); | ||
$ts2 = strtotime( '+30 minutes' ); | ||
|
||
// first one works | ||
wp_schedule_single_event( $ts1, $hook, $args ); | ||
// second works too | ||
wp_schedule_single_event( $ts2, $hook, $args ); | ||
|
||
// the next event should be at +3 minutes | ||
$this->assertEquals( $ts1, wp_next_scheduled( $hook, $args ) ); | ||
wp_unschedule_event( $ts1, $hook, $args ); | ||
// following event should be there too | ||
$this->assertEquals( $ts2, wp_next_scheduled( $hook, $args ) ); | ||
} | ||
} |