Squashed 'libraries/action-scheduler/' content from commit a95f351

git-subtree-dir: libraries/action-scheduler
git-subtree-split: a95f351058eada5e5281faa22e5a40865542e839
This commit is contained in:
2026-03-16 13:15:04 +01:00
commit d435f549fe
174 changed files with 32087 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
<?php
use Action_Scheduler\Migration\Scheduler;
use ActionScheduler_wpPostStore as PostStore;
/**
* Class Scheduler_Test
* @group migration
*/
class Scheduler_Test extends ActionScheduler_UnitTestCase {
public function setUp(): void {
parent::setUp();
if ( ! taxonomy_exists( PostStore::GROUP_TAXONOMY ) ) {
// register the post type and taxonomy necessary for the store to work.
$store = new PostStore();
$store->init();
}
}
public function test_migration_is_complete() {
ActionScheduler_DataController::mark_migration_complete();
$this->assertTrue( ActionScheduler_DataController::is_migration_complete() );
}
public function test_migration_is_not_complete() {
$this->assertFalse( ActionScheduler_DataController::is_migration_complete() );
update_option( ActionScheduler_DataController::STATUS_FLAG, 'something_random' );
$this->assertFalse( ActionScheduler_DataController::is_migration_complete() );
}
public function test_migration_is_scheduled() {
// Clear the any existing migration hooks that have already been setup.
as_unschedule_all_actions( Scheduler::HOOK );
$scheduler = new Scheduler();
$this->assertFalse(
$scheduler->is_migration_scheduled(),
'Migration is not automatically scheduled when a new ' . Scheduler::class . ' instance is created.'
);
$scheduler->schedule_migration();
$this->assertTrue(
$scheduler->is_migration_scheduled(),
'Migration is scheduled only after schedule_migration() has been called.'
);
}
public function test_scheduler_runs_migration() {
$source_store = new PostStore();
$destination_store = new ActionScheduler_DBStore();
$return_5 = function () {
return 5;
};
add_filter( 'action_scheduler/migration_batch_size', $return_5 );
// Make sure successive migration actions are delayed so all actions aren't migrated at once on separate hooks.
$return_60 = function () {
return 60;
};
add_filter( 'action_scheduler/migration_interval', $return_60 );
for ( $i = 0; $i < 10; $i++ ) {
$time = as_get_datetime_object( $i + 1 . ' minutes' );
$schedule = new ActionScheduler_SimpleSchedule( $time );
$action = new ActionScheduler_Action( ActionScheduler_Callbacks::HOOK_WITH_CALLBACK, array(), $schedule );
$future[] = $source_store->save_action( $action );
$time = as_get_datetime_object( $i + 1 . ' minutes ago' );
$schedule = new ActionScheduler_SimpleSchedule( $time );
$action = new ActionScheduler_Action( ActionScheduler_Callbacks::HOOK_WITH_CALLBACK, array(), $schedule );
$due[] = $source_store->save_action( $action );
}
$this->assertCount( 20, $source_store->query_actions( array( 'per_page' => 0 ) ) );
$scheduler = new Scheduler();
$scheduler->unschedule_migration();
$scheduler->schedule_migration( time() - 1 );
$queue_runner = ActionScheduler_Mocker::get_queue_runner( $destination_store );
$queue_runner->run();
// 5 actions should have moved from the source store when the queue runner triggered the migration action.
$args = array(
'per_page' => 0,
'hook' => ActionScheduler_Callbacks::HOOK_WITH_CALLBACK,
);
$this->assertCount( 15, $source_store->query_actions( $args ) );
remove_filter( 'action_scheduler/migration_batch_size', $return_5 );
remove_filter( 'action_scheduler/migration_interval', $return_60 );
}
public function test_scheduler_marks_itself_complete() {
$source_store = new PostStore();
$destination_store = new ActionScheduler_DBStore();
for ( $i = 0; $i < 5; $i ++ ) {
$time = as_get_datetime_object( $i + 1 . ' minutes ago' );
$schedule = new ActionScheduler_SimpleSchedule( $time );
$action = new ActionScheduler_Action( ActionScheduler_Callbacks::HOOK_WITH_CALLBACK, array(), $schedule );
$due[] = $source_store->save_action( $action );
}
$this->assertCount( 5, $source_store->query_actions( array( 'per_page' => 0 ) ) );
$scheduler = new Scheduler();
$scheduler->unschedule_migration();
$scheduler->schedule_migration( time() - 1 );
$queue_runner = ActionScheduler_Mocker::get_queue_runner( $destination_store );
$queue_runner->run();
// All actions should have moved from the source store when the queue runner triggered the migration action.
$args = array(
'per_page' => 0,
'hook' => ActionScheduler_Callbacks::HOOK_WITH_CALLBACK,
);
$this->assertCount( 0, $source_store->query_actions( $args ) );
// schedule another so we can get it to run immediately.
$scheduler->unschedule_migration();
$scheduler->schedule_migration( time() - 1 );
// run again so it knows that there's nothing left to process.
$queue_runner->run();
$scheduler->unhook();
// ensure the flag is set marking migration as complete.
$this->assertTrue( ActionScheduler_DataController::is_migration_complete() );
// ensure that another instance has not been scheduled.
$this->assertFalse( $scheduler->is_migration_scheduled() );
}
}