diff --git a/src/WooCommerce/Method/OrderMethods.php b/src/WooCommerce/Method/OrderMethods.php index ef08e57..8a3fe3b 100644 --- a/src/WooCommerce/Method/OrderMethods.php +++ b/src/WooCommerce/Method/OrderMethods.php @@ -345,6 +345,30 @@ public function seeOrderInDatabase(array $criteria): void $this->wpDb()->seeInDatabase($tableName, $mappedCriteria); } + /** + * Verify that no order exists in the database with the given criteria. + * + * @example + * ```php + * $orderId = $I->haveOrderInDatabase(['status' => 'completed']); + * $I->dontSeeOrderInDatabase(['id' => $orderId, 'status' => 'cancelled']); + * $I->dontSeeOrderInDatabase(['id' => 999999]); + * ``` + * + * Accepts a `status` criterion with or without the `wc-` prefix (e.g. `cancelled` or + * `wc-cancelled`); it is normalized before matching against the stored value. + * + * @param array $criteria Database query criteria (e.g., ['id' => 123, 'status' => 'cancelled']). Supports storage-agnostic keys like 'id', 'status' + * + * @return void + */ + public function dontSeeOrderInDatabase(array $criteria): void + { + $tableName = $this->orderStorage()->getTableName(); + $mappedCriteria = $this->orderStorage()->mapCriteria($criteria); + $this->wpDb()->dontSeeInDatabase($tableName, $mappedCriteria); + } + /** * Verify that order meta exists in the database with the given criteria. * diff --git a/tests/acceptance/OrderCest.php b/tests/acceptance/OrderCest.php index 8a21a1d..8642f5d 100644 --- a/tests/acceptance/OrderCest.php +++ b/tests/acceptance/OrderCest.php @@ -5,6 +5,7 @@ namespace Aztec\WPBrowser\Tests\Acceptance; use Aztec\WPBrowser\Tests\Support\AcceptanceTester; +use PHPUnit\Framework\AssertionFailedError; class OrderCest { @@ -368,6 +369,35 @@ public function testSeeOrderInDatabaseNormalizesUnprefixedStatusCriterion(Accept ]); } + public function testDontSeeOrderInDatabaseNormalizesUnprefixedStatusCriterion(AcceptanceTester $I): void + { + $orderId = $I->haveOrderInDatabase([ + 'post_status' => 'wc-active', + ]); + + $I->dontSeeOrderInDatabase([ + 'id' => $orderId, + 'status' => 'cancelled', + ]); + + // If the unprefixed 'active' criterion were not normalized to 'wc-active', it would + // never match the stored row and dontSeeOrderInDatabase would (incorrectly) pass. + $I->expectThrowable( + AssertionFailedError::class, + function () use ($I, $orderId): void { + $I->dontSeeOrderInDatabase([ + 'id' => $orderId, + 'status' => 'active', + ]); + }, + ); + } + + public function testDontSeeOrderInDatabaseWithNonStatusCriteria(AcceptanceTester $I): void + { + $I->dontSeeOrderInDatabase(['id' => 999999]); + } + public function testSeeOrderMetaInDatabase(AcceptanceTester $I): void { $orderId = $I->haveOrderInDatabase(); diff --git a/tests/acceptance/OrderHPOSCest.php b/tests/acceptance/OrderHPOSCest.php index e31eed3..cd3e951 100644 --- a/tests/acceptance/OrderHPOSCest.php +++ b/tests/acceptance/OrderHPOSCest.php @@ -5,6 +5,7 @@ namespace Aztec\WPBrowser\Tests\Acceptance; use Aztec\WPBrowser\Tests\Support\AcceptanceTester; +use PHPUnit\Framework\AssertionFailedError; class OrderHPOSCest { @@ -354,6 +355,35 @@ public function testSeeOrderInDatabaseNormalizesUnprefixedStatusCriterion(Accept ]); } + public function testDontSeeOrderInDatabaseNormalizesUnprefixedStatusCriterion(AcceptanceTester $I): void + { + $orderId = $I->haveOrderInDatabase([ + 'status' => 'wc-active', + ]); + + $I->dontSeeOrderInDatabase([ + 'id' => $orderId, + 'status' => 'cancelled', + ]); + + // If the unprefixed 'active' criterion were not normalized to 'wc-active', it would + // never match the stored row and dontSeeOrderInDatabase would (incorrectly) pass. + $I->expectThrowable( + AssertionFailedError::class, + function () use ($I, $orderId): void { + $I->dontSeeOrderInDatabase([ + 'id' => $orderId, + 'status' => 'active', + ]); + }, + ); + } + + public function testDontSeeOrderInDatabaseWithNonStatusCriteria(AcceptanceTester $I): void + { + $I->dontSeeOrderInDatabase(['id' => 999999]); + } + public function testSeeOrderMetaInDatabase(AcceptanceTester $I): void { $orderId = $I->haveOrderInDatabase(); diff --git a/tests/acceptance/SubscriptionCest.php b/tests/acceptance/SubscriptionCest.php index fcc48aa..bfaa44f 100644 --- a/tests/acceptance/SubscriptionCest.php +++ b/tests/acceptance/SubscriptionCest.php @@ -5,6 +5,7 @@ namespace Aztec\WPBrowser\Tests\Acceptance; use Aztec\WPBrowser\Tests\Support\AcceptanceTester; +use PHPUnit\Framework\AssertionFailedError; class SubscriptionCest { @@ -285,6 +286,30 @@ public function testDontSeeSubscriptionInDatabase(AcceptanceTester $I): void ]); } + public function testDontSeeSubscriptionInDatabaseNormalizesUnprefixedStatusCriterion(AcceptanceTester $I): void + { + $subscriptionId = $I->haveSubscriptionInDatabase([ + 'post_status' => 'wc-active', + ]); + + $I->dontSeeSubscriptionInDatabase([ + 'id' => $subscriptionId, + 'status' => 'cancelled', + ]); + + // If the unprefixed 'active' criterion were not normalized to 'wc-active', it would + // never match the stored row and dontSeeSubscriptionInDatabase would (incorrectly) pass. + $I->expectThrowable( + AssertionFailedError::class, + function () use ($I, $subscriptionId): void { + $I->dontSeeSubscriptionInDatabase([ + 'id' => $subscriptionId, + 'status' => 'active', + ]); + }, + ); + } + public function testDontSeeSubscriptionMetaInDatabase(AcceptanceTester $I): void { $subscriptionId = $I->haveSubscriptionInDatabase();