Skip to content

Commit

Permalink
Fix incorrect patch, + added unit test.
Browse files Browse the repository at this point in the history
  • Loading branch information
vedanshujain committed Sep 14, 2023
1 parent 11f3ba4 commit 57d08d7
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2803,7 +2803,7 @@ public function delete_meta( &$object, $meta ) {
$delete_meta = $this->data_store_meta->delete_meta( $object, $meta );
$changes_applied = $this->after_meta_change( $object, $meta );

if ( $object instanceof WC_Abstract_Order && $this->should_backfill_post_record() && isset( $meta->key ) ) {
if ( ! $changes_applied && $object instanceof WC_Abstract_Order && $this->should_backfill_post_record() && isset( $meta->key ) ) {
self::$backfilling_order_ids[] = $object->get_id();
delete_post_meta( $object->get_id(), $meta->key, $meta->value );
self::$backfilling_order_ids = array_diff( self::$backfilling_order_ids, array( $object->get_id() ) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2804,4 +2804,63 @@ private function reset_order_data_store_state( $sut ) {
$reset_state->call( $sut );
wp_cache_flush();
}

/**
* @testDox Test that duplicate key, value pairs are also synced properly.
*/
public function test_duplicate_meta_is_synced_properly() {
$this->toggle_cot_authoritative( true );
$this->enable_cot_sync();

$order = WC_Helper_Order::create_order();
// Force an earlier modified date to trigger the `should_save_after_meta_change` to be true later in the test.
$order->set_date_modified( gmdate( 'Y-m-d H:i:s', strtotime( '-2 day' ) ) );
$current_date_time = new \WC_DateTime( current_time( 'mysql', 1 ), new \DateTimeZone( 'GMT' ) );
assert( $order->get_date_modified() < $current_date_time ); // Meta check, to make sure our test stay effective if we run testsuite in a different timezone.
$order->save();

$order->add_meta_data( 'test_key', 'test_value' );
$order->save_meta_data();

$post_meta = get_post_meta( $order->get_id(), 'test_key' );
$this->assertCount( 1, $post_meta );
$this->assertEquals( 'test_value', $post_meta[0] );

$order->add_meta_data( 'test_key', 'test_value' );
$order->save_meta_data();

$post_meta = get_post_meta( $order->get_id(), 'test_key' );
$this->assertCount( 2, $post_meta );
$this->assertEquals( 'test_value', $post_meta[0] );
$this->assertEquals( 'test_value', $post_meta[1] );

$order->add_meta_data( 'test_key', 'test_value2' );
$order->save_meta_data();

$post_meta = get_post_meta( $order->get_id(), 'test_key' );
$this->assertCount( 3, $post_meta );
$this->assertTrue( in_array( 'test_value2', $post_meta, true ) );

$order->set_date_modified( gmdate( 'Y-m-d H:i:s', strtotime( '-1 hour' ) ) );
$order->save();
$order->update_meta_data( 'test_key', 'test_value3' );
$order->save_meta_data();

/**
* Note that WC_Data has a bug where if we update a duplicate key, it will delete rest of other keys. But since this bug has been there for 5 years as of writing this code, we will not assert whether postmeta is exactly the same as order_meta but only test that out value was saved.
*/
$post_meta = get_post_meta( $order->get_id(), 'test_key' );
$this->assertTrue( in_array( 'test_value3', $post_meta, true ) );

$order->set_date_modified( gmdate( 'Y-m-d H:i:s', strtotime( '-2 day' ) ) );
$order->save();

add_post_meta( $order->get_id(), 'test_key2', 'test_value5' );
$order->add_meta_data( 'test_key2', 'test_value4' );
$order->save();

$post_meta = get_post_meta( $order->get_id(), 'test_key2' );
$this->assertTrue( in_array( 'test_value4', $post_meta, true ) );
$this->assertFalse( in_array( 'test_value5', $post_meta, true ) );
}
}

0 comments on commit 57d08d7

Please sign in to comment.