forked from woocommerce/woocommerce
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a couple of tests for WC_Notes_Run_Db_Update, a poorly testable…
… class.
- Loading branch information
1 parent
6b11451
commit 2c1625d
Showing
1 changed file
with
191 additions
and
0 deletions.
There are no files selected for viewing
191 changes: 191 additions & 0 deletions
191
tests/legacy/unit-tests/admin/notes/class-wc-tests-notes-run-db-update.php
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 |
---|---|---|
@@ -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.' ); | ||
} | ||
|
||
} |