Added a couple of tests for WC_Notes_Run_Db_Update, a poorly testable class.

This commit is contained in:
Peter Fabian 2020-05-14 13:31:43 +02:00
parent 6b11451b88
commit 2c1625d3f9
1 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,191 @@
<?php
/**
* Class WC_Notes_Run_Db_Update file.
*
* @package WooCommerce\Tests\Admin\Notes
*/
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Note;
/**
* Tests for the WC_Notes_Run_Db_Update class.
*/
class WC_Tests_Notes_Run_Db_Update extends WC_Unit_Test_Case {
/**
* Load the necessary files, as they're not automatically loaded by WooCommerce.
*
*/
public static function setUpBeforeClass() {
include_once WC_Unit_Tests_Bootstrap::instance()->plugin_dir . '/includes/admin/notes/class-wc-notes-run-db-update.php';
}
/**
* Clean up before each test.
*/
public function setUp() {
self::remove_db_update_notes();
}
/**
* Returns a list of note ids with name 'wc-update-db-reminder' from the database.
*
* @return array(int) List of note ids with name 'wc-update-db-reminder'.
*/
private static function get_db_update_notes() {
$data_store = \WC_Data_Store::load( 'admin-note' );
$note_ids = $data_store->get_notes_with_name( WC_Notes_Run_Db_Update::NOTE_NAME );
return $note_ids;
}
/**
* Removes all the notes with name 'wc-update-db-reminder' from the database.
*/
private static function remove_db_update_notes() {
$data_store = \WC_Data_Store::load( 'admin-note' );
$note_ids = $data_store->get_notes_with_name( WC_Notes_Run_Db_Update::NOTE_NAME );
foreach ( $note_ids as $note_id ) {
$note = new WC_Admin_Note( $note_id );
$data_store->delete( $note );
}
}
/**
* Creates a sample note with name 'wc-update-db-reminder'.
*
* @return int Newly create note's id.
*/
private static function create_db_update_note() {
$update_url = html_entity_decode(
wp_nonce_url(
add_query_arg( 'do_update_woocommerce', 'true', admin_url( 'admin.php?page=wc-settings' ) ),
'wc_db_update',
'wc_db_update_nonce'
)
);
$note_actions = array(
array(
'name' => 'update-db_run',
'label' => __( 'Update WooCommerce Database', 'woocommerce' ),
'url' => $update_url,
'status' => 'unactioned',
'primary' => true,
),
array(
'name' => 'update-db_learn-more',
'label' => __( 'Learn more about updates', 'woocommerce' ),
'url' => 'https://docs.woocommerce.com/document/how-to-update-woocommerce/',
'status' => 'unactioned',
'primary' => false,
),
);
$note = new WC_Admin_Note();
$note->set_title( 'WooCommerce database update required' );
$note->set_content( 'To keep things running smoothly, we have to update your database to the newest version.' );
$note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_UPDATE );
$note->set_icon( 'info' );
$note->set_name( WC_Notes_Run_Db_Update::NOTE_NAME );
$note->set_content_data( (object) array() );
$note->set_source( 'woocommerce-core' );
$note->set_status( WC_Admin_Note::E_WC_ADMIN_NOTE_UNACTIONED );
// Set new actions.
$note->clear_actions();
foreach ( $note_actions as $note_action ) {
$note->add_action( ...array_values( $note_action ) );
}
return $note->save();
}
/**
* No note should be created/exist if db version is equal to WC code version.
*/
public function test_noop_db_update_note() {
update_option( 'woocommerce_db_version', WC()->version );
// No notes initially.
$this->assertEquals( 0, count( self::get_db_update_notes() ), 'There should be no db update notes initially.' );
WC_Notes_Run_Db_Update::show_reminder();
// No notice should be created.
$this->assertEquals( 0, count( self::get_db_update_notes() ), 'There should be no db update notes created if db is up to date.' );
}
/**
* Note should be created if there is none and WC is updated.
*/
public function test_create_db_update_note() {
// No notes initially.
$this->assertEquals( 0, count( self::get_db_update_notes() ), 'There should be no db update notes initially.' );
// Make it appear as if db version is lower than WC version, i.e. db update is required.
update_option( 'woocommerce_db_version', '3.9.0' );
WC_Notes_Run_Db_Update::show_reminder();
// A notice should be created.
$this->assertEquals( 1, count( self::get_db_update_notes() ), 'A db update note should be created if db is NOT up to date.' );
// Update the db option back.
update_option( 'woocommerce_db_version', WC()->version );
}
/**
* Note should be created if there is none and WC is updated.
*/
public function test_clean_up_multiple_db_update_notes() {
// No notes initially.
$this->assertEquals( 0, count( self::get_db_update_notes() ), 'There should be no db update notes initially.' );
$note_1 = self::create_db_update_note();
$note_2 = self::create_db_update_note();
$this->assertEquals( 2, count( self::get_db_update_notes() ), 'There should be 2 db update notes after I created 2.' );
WC_Notes_Run_Db_Update::show_reminder();
// Only one notice should remain, in case 2 were created under some weird circumstances.
$this->assertEquals( 1, count( self::get_db_update_notes() ), 'A db update note should be created if db is NOT up to date.' );
}
/**
* Test switch from db update needed to thanks note.
*/
public function test_db_update_note_to_thanks_note() {
// No notes initially.
$this->assertEquals( 0, count( self::get_db_update_notes() ), 'There should be no db update notes initially.' );
// Make it appear as if db version is lower than WC version, i.e. db update is required.
update_option( 'woocommerce_db_version', '3.9.0' );
// Magic 1: nothing to update-db note.
WC_Notes_Run_Db_Update::show_reminder();
$note_ids = self::get_db_update_notes();
// An 'update required' notice should be created.
$this->assertEquals( 1, count( $note_ids ), 'A db update note should be created if db is NOT up to date.' );
$note = new WC_Admin_Note( $note_ids[0] );
$actions = $note->get_actions();
$this->assertEquals( 'update-db_run', $actions[0]->name, 'A db update note to update the database should be displayed now.' );
// Simulate database update has been performed.
update_option( 'woocommerce_db_version', WC()->version );
// Magic 2: update-db note to thank you note.
WC_Notes_Run_Db_Update::show_reminder();
$note = new WC_Admin_Note( $note_ids[0] );
$actions = $note->get_actions();
$this->assertEquals( 'update-db_done', $actions[0]->name, 'A db update note--Thanks for the update--should be displayed now.' );
}
}