-
Notifications
You must be signed in to change notification settings - Fork 3.2k
52988: Adds tests for get bookmark #1180
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
hellofromtonya
wants to merge
24
commits into
WordPress:master
from
hellofromtonya:add/52988/get_bookmark
Closed
Changes from 19 commits
Commits
Show all changes
24 commits
Select commit
Hold shift + click to select a range
102d602
Adds empty bookmark tests.
a93df37
Adds tests when given bookmark instance.
dab9e40
Refactored to reduce params init and formatting expected data.
ae4c802
Speed up the test setup/teardown.
19a6c5e
Split out the data provider for the groups of tests.
58013e7
Improves the init_func_params for overriding the bookmark.
080cc85
Change param to arg to better match PHP docs.
bb83aee
Adds unhappy path to empty bookmark tests.
1d3f012
Adds unhappy path test cases to bookmark instance tests.
f97b83a
Adds @covers.
90b7062
Adds else path when global link is set and its link_id matches given …
3d2851d
Adds Path 4 - test pulling from cache when existing link ID given.
e365e5d
Adds Path 5 tests - pulls existing record from db.
fd71f83
Adds Path 6 - requested link ID does not exist in db.
0710645
Improves documentation and consistency.
9a50500
Rearranges the else branch tests to follow logic flow.
87caec6
Combines path 2 tests for consistency.
a4a6ded
Create bookmark in setUp to avoid downstream conflicts.
c50aeb9
Removes is numeric assertion.
3111683
Removes deleting bookmark from cache during tearDown.
6b340f0
Fixes multiline comments and removes empty line in DocBlock.
829df40
Create and delete bookmark using wp static methods.
263f7cc
Use custom WP assertSameSets.
9fcb19b
Removes changes to package-lock.json from PR.
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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,384 @@ | ||
| <?php | ||
|
|
||
| /** | ||
| * @group bookmark | ||
| * @covers ::get_bookmark | ||
| */ | ||
| class Tests_Bookmark_GetBookmark extends WP_UnitTestCase { | ||
| /** | ||
| * Instance of the bookmark object. | ||
| * | ||
| * @var stdClass | ||
| */ | ||
| private $bookmark; | ||
|
|
||
| public function setUp() { | ||
| parent::setUp(); | ||
|
|
||
| $this->bookmark = self::factory()->bookmark->create_and_get(); | ||
| wp_cache_delete( $this->bookmark->link_id, 'bookmark' ); | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| public function tearDown() { | ||
| unset( $GLOBALS['link'] ); | ||
| if ( isset( $this->bookmark->link_id ) ) { | ||
| wp_cache_delete( $this->bookmark->link_id, 'bookmark' ); | ||
| } | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| parent::tearDown(); | ||
| } | ||
|
|
||
| /** | ||
| * Path 1A: Given empty bookmark and global link exists. | ||
| * | ||
| * @dataProvider data_when_empty_bookmark | ||
| */ | ||
| public function test_should_return_global_link_in_requested_output_format( $args ) { | ||
| $GLOBALS['link'] = $this->bookmark; | ||
| $args = $this->init_func_args( $args, 0 ); | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| $expected = $this->maybe_format_expected_data( $args, $GLOBALS['link'] ); | ||
|
|
||
| $this->assertArrayHasKey( 'link', $GLOBALS ); | ||
| $this->assertSame( $expected, $actual_bookmark ); | ||
| // Should bypass the cache. | ||
| $this->assertFalse( wp_cache_get( $this->bookmark->link_id, 'bookmark' ) ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 1B: Given empty bookmark and global link does not exist. | ||
| * | ||
| * @dataProvider data_when_empty_bookmark | ||
| */ | ||
| public function test_should_return_null( $args ) { | ||
| $args = $this->init_func_args( $args, 0 ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| $this->assertArrayNotHasKey( 'link', $GLOBALS ); | ||
| $this->assertNull( $actual_bookmark ); | ||
| $this->assertFalse( wp_cache_get( $this->bookmark->link_id, 'bookmark' ) ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 1 data provider, i.e. when given empty bookmark. | ||
| */ | ||
| public function data_when_empty_bookmark() { | ||
| return array( | ||
| // Unhappy path. | ||
| 'with bookmark type mismatch' => array( | ||
| array( | ||
| 'bookmark' => '', | ||
| ), | ||
| ), | ||
| 'with invalid output' => array( | ||
| array( | ||
| 'bookmark' => 0, | ||
| 'output' => 'invalid', | ||
| ), | ||
| ), | ||
| 'with bookmark type mismatch and invalid output' => array( | ||
| array( | ||
| 'bookmark' => null, | ||
| 'output' => 'invalid', | ||
| ), | ||
| ), | ||
| // Happy path. | ||
| 'with defaults' => array( | ||
| array( | ||
| 'bookmark' => 0, | ||
| ), | ||
| ), | ||
| 'with non-default output' => array( | ||
| array( | ||
| 'bookmark' => 0, | ||
| 'output' => ARRAY_A, | ||
| ), | ||
| ), | ||
| 'with non-default filter' => array( | ||
| array( | ||
| 'bookmark' => 0, | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| 'with non-default output and filter' => array( | ||
| array( | ||
| 'bookmark' => 0, | ||
| 'output' => ARRAY_N, | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 2: Bookmark instance is given. | ||
| * | ||
| * @dataProvider data_when_instance_bookmark | ||
| */ | ||
| public function test_should_cache_bookmark_when_given_instance( $args ) { | ||
| $args = $this->init_func_args( $args ); | ||
| $bookmark = $args[0]; | ||
| $expected = $this->maybe_format_expected_data( $args, $bookmark ); | ||
|
|
||
| // Check the cache does not exist before the test. | ||
| $this->assertFalse( wp_cache_get( $bookmark->link_id, 'bookmark' ) ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| $this->assertSame( $expected, $actual_bookmark ); | ||
|
|
||
| // Check the bookmark was cached. | ||
| $actual_cache = wp_cache_get( $bookmark->link_id, 'bookmark' ); | ||
| $this->assertEquals( $bookmark, $actual_cache ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 2 data provider, i.e. when bookmark instance is given. | ||
| */ | ||
| public function data_when_instance_bookmark() { | ||
| return array( | ||
| // Unhappy path. | ||
| 'with incomplete bookmark data' => array( | ||
| array( | ||
| 'bookmark' => (object) array( | ||
| 'link_id' => '100', | ||
| ), | ||
| ), | ||
| ), | ||
| 'with invalid output' => array( | ||
| array( | ||
| 'output' => 'invalid', | ||
| ), | ||
| ), | ||
| 'with invalid filter' => array( | ||
| array( | ||
| 'filter' => 'invalid', | ||
| ), | ||
| ), | ||
| // Happy path. | ||
| 'with defaults' => array( | ||
| array(), | ||
| ), | ||
| 'with non-default output' => array( | ||
| array( | ||
| 'output' => ARRAY_A, | ||
| ), | ||
| ), | ||
| 'with non-default filter' => array( | ||
| array( | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| 'with non-default output and filter' => array( | ||
| array( | ||
| 'output' => ARRAY_N, | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 3A: Uses the global link when exists and the given bookmark link ID matches the global link. | ||
| * | ||
| * @dataProvider data_when_else | ||
| * | ||
| * @param array $args Function argument list. | ||
| */ | ||
| public function test_should_return_global_when_else( $args ) { | ||
| $args = $this->init_func_args( $args, $this->bookmark->link_id ); | ||
| $GLOBALS['link'] = $this->bookmark; | ||
| $expected = $this->maybe_format_expected_data( $args, $GLOBALS['link'] ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| $this->assertSame( $expected, $actual_bookmark ); | ||
| $this->assertFalse( wp_cache_get( $this->bookmark->link_id, 'bookmark' ) ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 3B: Pulls from cache when given existing bookmark link ID. | ||
| * | ||
| * @dataProvider data_when_else | ||
| * | ||
| * @param array $args Function argument list. | ||
| */ | ||
| public function test_should_return_cached_bookmark_when_given_existing_link_id( $args ) { | ||
| // Cache the bookmark instance to setup the test. | ||
| wp_cache_add( $this->bookmark->link_id, $this->bookmark, 'bookmark' ); | ||
| $args = $this->init_func_args( $args, $this->bookmark->link_id ); | ||
| $expected = $this->maybe_format_expected_data( $args, $this->bookmark ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| // For non-array output type, use assetEquals. Why? The object pulled from cache will have the same | ||
| // property values but will be a different object than the expected object. | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if ( is_object( $expected ) ) { | ||
| $this->assertEquals( $expected, $actual_bookmark ); | ||
| } else { | ||
| $this->assertSame( $expected, $actual_bookmark ); | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| // Check the bookmark was cached. | ||
| $actual_cache = wp_cache_get( $this->bookmark->link_id, 'bookmark' ); | ||
| $this->assertEquals( $this->bookmark, $actual_cache ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 3C: Attempts to pull non-existent bookmark from database. | ||
| * | ||
| * @dataProvider data_when_else | ||
| * | ||
| * @param array $args Function argument list. | ||
| */ | ||
| public function test_should_return_null_when_bookmark_not_in_database( $args ) { | ||
| $bookmark_link_id = $this->bookmark->link_id * 100; | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| $args = $this->init_func_args( $args, $bookmark_link_id ); | ||
|
|
||
| // Validate it will run path 6. | ||
| $this->assertFalse( wp_cache_get( $bookmark_link_id, 'bookmark' ) ); | ||
| $this->assertArrayNotHasKey( 'link', $GLOBALS ); | ||
| global $wpdb; | ||
| $db_actual = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark_link_id ) ); | ||
| $this->assertNull( $db_actual ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| $this->assertNull( $actual_bookmark ); | ||
| $this->assertFalse( wp_cache_get( $bookmark_link_id, 'bookmark' ) ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 3D: Pulls existing bookmark from the database. | ||
| * | ||
| * @dataProvider data_when_else | ||
| * | ||
| * @param array $args Function argument list. | ||
| */ | ||
| public function test_should_return_existing_bookmark_from_database( $args ) { | ||
| $args = $this->init_func_args( $args, $this->bookmark->link_id ); | ||
| $expected = $this->maybe_format_expected_data( $args, $this->bookmark ); | ||
|
|
||
| // Validate it will run path 5. | ||
| $this->assertFalse( wp_cache_get( $this->bookmark->link_id, 'bookmark' ) ); | ||
| $this->assertArrayNotHasKey( 'link', $GLOBALS ); | ||
|
|
||
| // Run the function and test results. | ||
| $actual_bookmark = get_bookmark( ...$args ); | ||
|
|
||
| // For non-array output type, use assetEquals. Why? The object pulled from the database will have the same | ||
| // property values but will be a different object than the expected object. | ||
| if ( is_object( $expected ) ) { | ||
| $this->assertEquals( $expected, $actual_bookmark ); | ||
| } else { | ||
| $this->assertSame( $expected, $actual_bookmark ); | ||
| } | ||
|
|
||
| // Check the bookmark was cached. | ||
| $actual_cache = wp_cache_get( $this->bookmark->link_id, 'bookmark' ); | ||
| $this->assertEquals( $this->bookmark, $actual_cache ); | ||
| } | ||
|
|
||
| /** | ||
| * Path 3's data provider which covers the "else" branch, i.e. when the bookmark argument is not empty and | ||
| * not an object. | ||
| */ | ||
| public function data_when_else() { | ||
| return array( | ||
| // Unhappy path. | ||
| 'with invalid output' => array( | ||
| array( | ||
| 'output' => 'invalid', | ||
| ), | ||
| ), | ||
| 'with invalid filter' => array( | ||
| array( | ||
| 'filter' => 'invalid', | ||
| ), | ||
| ), | ||
| // Happy path. | ||
| 'with defaults' => array( | ||
| array(), | ||
| ), | ||
| 'with non-default output' => array( | ||
| array( | ||
| 'output' => ARRAY_A, | ||
| ), | ||
| ), | ||
| 'with non-default filter' => array( | ||
| array( | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| 'with non-default output and filter' => array( | ||
| array( | ||
| 'output' => ARRAY_N, | ||
| 'filter' => 'display', | ||
| ), | ||
| ), | ||
| ); | ||
| } | ||
|
|
||
| /** | ||
| * Initialize the get_bookmark's function arguments to match the order of the function's signature and | ||
| * reduce code in the tests. | ||
| * | ||
| * @param array $args Function argument list. | ||
| * @param int|stdClass $bookmark Optional. Bookmark's cache key or instance. | ||
| * | ||
| * @return array Ordered argument list. | ||
| */ | ||
| private function init_func_args( array $args, $bookmark = null ) { | ||
| // The defaults sets the order to match the function's arguments as well as setting the default values. | ||
| $defaults = array( | ||
| 'bookmark' => $this->bookmark, | ||
| 'output' => OBJECT, | ||
| 'filter' => 'raw', | ||
| ); | ||
| $args = array_merge( $defaults, $args ); | ||
|
|
||
| // When given a bookmark, use it. | ||
| if ( ! is_null( $bookmark ) ) { | ||
| $args['bookmark'] = $bookmark; | ||
| } | ||
|
|
||
| // Strip out the keys. Why? The splat operator (...) does not work with associative arrays, | ||
| // except for in PHP 8 where the keys are named arguments. | ||
| return array_values( $args ); | ||
| } | ||
|
|
||
| /** | ||
| * Maybe format the bookmark's expected data. | ||
| * | ||
| * @param array $args Function argument list. | ||
| * @param int|stdClass|null $bookmark Optional. Bookmark's cache key or instance. | ||
| * | ||
hellofromtonya marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| * @return array|stdClass bookmark's data. | ||
| */ | ||
| private function maybe_format_expected_data( array $args, $bookmark = null ) { | ||
| if ( is_null( $bookmark ) ) { | ||
| $bookmark = $this->bookmark; | ||
| } | ||
|
|
||
| switch ( $args[1] ) { | ||
| case ARRAY_A: | ||
| case ARRAY_N: | ||
| $expected = get_object_vars( $bookmark ); | ||
|
|
||
| if ( ARRAY_N === $args[1] ) { | ||
| $expected = array_values( $expected ); | ||
| } | ||
|
|
||
| return $expected; | ||
| default: | ||
| return $bookmark; | ||
| } | ||
| } | ||
| } | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.