Wordpress/tests/phpunit/tests/cron.php
Gary Pendergast 8f95800d52 Code is Poetry.
WordPress' code just... wasn't.
This is now dealt with.

Props jrf, pento, netweb, GaryJ, jdgrimes, westonruter, Greg Sherwood from PHPCS, and everyone who's ever contributed to WPCS and PHPCS.
Fixes #41057.



git-svn-id: https://develop.svn.wordpress.org/trunk@42343 602fd350-edb4-49c9-b593-d223f7449a82
2017-11-30 23:09:33 +00:00

273 lines
9.5 KiB
PHP

<?php
/**
* Test the cron scheduling functions
*
* @group cron
*/
class Tests_Cron 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 10468
*/
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 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 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 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 ) );
}
}