From edd25e1d0ee598cccb2a30efcf630c1f7a2bb97f Mon Sep 17 00:00:00 2001 From: tanseercena Date: Tue, 19 Mar 2024 12:45:43 +0500 Subject: [PATCH 01/10] Added 2.0 support for psr/http-message --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2f5c2463..40b03aa9 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ "guzzlehttp/guzzle": "^7.0", "guzzlehttp/psr7": "^2.0", "psr/http-client": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/log": "^1.1 || ^2.0 || ^3.0", "ramsey/uuid": "^4.1" }, From 48423135dd509997ee3107f2f2b736b9c44a501c Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 12:05:17 +0100 Subject: [PATCH 02/10] Log all API deprecation warnings This fixes #245 by no longer writing a timestamp to the filesystem. --- src/Clients/Http.php | 17 ++--------------- tests/Clients/HttpTest.php | 22 ++++++++-------------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/Clients/Http.php b/src/Clients/Http.php index ee443a0a..406b29f1 100644 --- a/src/Clients/Http.php +++ b/src/Clients/Http.php @@ -274,27 +274,14 @@ private function logApiDeprecation(string $url, string $reason): void */ private function shouldLogApiDeprecation(): bool { - $warningFilePath = $this->getApiDeprecationTimestampFilePath(); - - $lastWarning = null; - if (file_exists($warningFilePath)) { - $lastWarning = (int)(file_get_contents($warningFilePath)); - } - - if (time() - $lastWarning < self::DEPRECATION_ALERT_SECONDS) { - $result = false; - } else { - $result = true; - file_put_contents($warningFilePath, time()); - } - - return $result; + return true; } /** * Fetches the path to the file holding the timestamp of the last API deprecation warning we logged. * * @codeCoverageIgnore This is mocked in tests so we don't use real files + * @deprecated 5.3.1 This method is no longer used internally. */ public function getApiDeprecationTimestampFilePath(): string { diff --git a/tests/Clients/HttpTest.php b/tests/Clients/HttpTest.php index c4a9c4d7..c4509c99 100644 --- a/tests/Clients/HttpTest.php +++ b/tests/Clients/HttpTest.php @@ -442,16 +442,13 @@ public function testRetryStopsOnNonRetriableError() public function testDeprecatedRequestsAreLoggedWithinLimit() { - $vfsRoot = vfsStream::setup('test'); + $this->markTestSkipped('For now there is no back-off implemented'); /** @var MockObject|Http */ $mockedClient = $this->getMockBuilder(Http::class) ->setConstructorArgs([$this->domain]) - ->onlyMethods(['getApiDeprecationTimestampFilePath']) + ->onlyMethods([]) ->getMock(); - $mockedClient->expects($this->exactly(2)) - ->method('getApiDeprecationTimestampFilePath') - ->willReturn(vfsStream::url('test/timestamp_file')); $testLogger = new LogMock(); Context::$LOGGER = $testLogger; @@ -469,31 +466,28 @@ public function testDeprecatedRequestsAreLoggedWithinLimit() ) ]); - $this->assertFalse($vfsRoot->hasChild('timestamp_file')); + // TODO: assert that no flag/value exists for "last deprecation warning" $mockedClient->get('test/path'); - $this->assertTrue($vfsRoot->hasChild('timestamp_file')); + // TODO: assert that a flag/value exists for "last deprecation warning" $this->assertTrue($testLogger->hasWarningThatContains('API Deprecation notice')); $this->assertCount(1, $testLogger->recordsByLevel[LogLevel::WARNING]); $mockedClient->get('test/path'); - $this->assertTrue($vfsRoot->hasChild('timestamp_file')); + // TODO: assert that a flag/value exists for "last deprecation warning" $this->assertCount(1, $testLogger->recordsByLevel[LogLevel::WARNING]); } public function testDeprecationLogBackoffPeriod() { - vfsStream::setup('test'); + $this->markTestSkipped('For now there is no back-off implemented'); /** @var MockObject|Http */ $mockedClient = $this->getMockBuilder(Http::class) ->setConstructorArgs([$this->domain]) - ->onlyMethods(['getApiDeprecationTimestampFilePath']) + ->onlyMethods([]) ->getMock(); - $mockedClient->expects($this->exactly(3)) - ->method('getApiDeprecationTimestampFilePath') - ->willReturn(vfsStream::url('test/timestamp_file')); $testLogger = new LogMock(); Context::$LOGGER = $testLogger; @@ -525,7 +519,7 @@ public function testDeprecationLogBackoffPeriod() $this->assertCount(1, $testLogger->records); // We only log once every minute, so simulate more time than having elapsed - file_put_contents(vfsStream::url('test/timestamp_file'), time() - 70); + // TODO: reset the flag/value for "last deprecation warning" $mockedClient->get('test/path'); $this->assertCount(2, $testLogger->records); From ff9a221eea0a79b94097033284e51f875c02dd4c Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 12:37:52 +0100 Subject: [PATCH 03/10] Store "last API Deprecation" time in a property This restores some of the functionality lost in the previous commit, but messages can still be logged more often than defined if two different objects are used in quick succession. --- src/Clients/Http.php | 9 ++++++++ tests/Clients/HttpTest.php | 47 +++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/Clients/Http.php b/src/Clients/Http.php index 406b29f1..a3393d64 100644 --- a/src/Clients/Http.php +++ b/src/Clients/Http.php @@ -26,6 +26,8 @@ class Http /** @var string */ private $domain; + private int $lastApiDeprecationWarning = 0; + public function __construct(string $domain) { $this->domain = $domain; @@ -274,6 +276,13 @@ private function logApiDeprecation(string $url, string $reason): void */ private function shouldLogApiDeprecation(): bool { + $secondsSinceLastAlert = time() - $this->lastApiDeprecationWarning; + if ($secondsSinceLastAlert < self::DEPRECATION_ALERT_SECONDS) { + return false; + } + + $this->lastApiDeprecationWarning = time(); + return true; } diff --git a/tests/Clients/HttpTest.php b/tests/Clients/HttpTest.php index c4509c99..21d2df18 100644 --- a/tests/Clients/HttpTest.php +++ b/tests/Clients/HttpTest.php @@ -7,6 +7,7 @@ use org\bovigo\vfs\vfsStream; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LogLevel; +use ReflectionProperty; use Shopify\Clients\Http; use Shopify\Context; use ShopifyTest\BaseTestCase; @@ -442,8 +443,6 @@ public function testRetryStopsOnNonRetriableError() public function testDeprecatedRequestsAreLoggedWithinLimit() { - $this->markTestSkipped('For now there is no back-off implemented'); - /** @var MockObject|Http */ $mockedClient = $this->getMockBuilder(Http::class) ->setConstructorArgs([$this->domain]) @@ -466,23 +465,48 @@ public function testDeprecatedRequestsAreLoggedWithinLimit() ) ]); - // TODO: assert that no flag/value exists for "last deprecation warning" + $reflector = new ReflectionProperty(Http::class, 'lastApiDeprecationWarning'); + + $this->assertEquals( + 0, + $reflector->getValue($mockedClient), + 'Last API deprecation warning time starts out unset' + ); + $mockedClient->get('test/path'); - // TODO: assert that a flag/value exists for "last deprecation warning" - $this->assertTrue($testLogger->hasWarningThatContains('API Deprecation notice')); - $this->assertCount(1, $testLogger->recordsByLevel[LogLevel::WARNING]); + $this->assertTrue( + $testLogger->hasWarningThatContains('API Deprecation notice'), + 'Logger has API deprecation message' + ); + $this->assertCount( + 1, + $testLogger->recordsByLevel[LogLevel::WARNING], + 'Logger has exactly one warning' + ); + $this->assertGreaterThan( + 0, + $reflector->getValue($mockedClient), + 'Last API deprecation warning time is set' + ); + $lastApiDeprecationWarning = $reflector->getValue($mockedClient); $mockedClient->get('test/path'); - // TODO: assert that a flag/value exists for "last deprecation warning" - $this->assertCount(1, $testLogger->recordsByLevel[LogLevel::WARNING]); + $this->assertEquals( + $lastApiDeprecationWarning, + $reflector->getValue($mockedClient), + 'Last API deprecation warning time is unchanged' + ); + $this->assertCount( + 1, + $testLogger->recordsByLevel[LogLevel::WARNING], + 'Logger still has exactly one warning' + ); } public function testDeprecationLogBackoffPeriod() { - $this->markTestSkipped('For now there is no back-off implemented'); - /** @var MockObject|Http */ $mockedClient = $this->getMockBuilder(Http::class) ->setConstructorArgs([$this->domain]) @@ -519,7 +543,8 @@ public function testDeprecationLogBackoffPeriod() $this->assertCount(1, $testLogger->records); // We only log once every minute, so simulate more time than having elapsed - // TODO: reset the flag/value for "last deprecation warning" + $reflector = new ReflectionProperty(Http::class, 'lastApiDeprecationWarning'); + $reflector->setValue($mockedClient, time() - 7200); $mockedClient->get('test/path'); $this->assertCount(2, $testLogger->records); From 3c1216d74e1fb6c98c18bdc90175bd3748124de1 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 14:17:50 +0100 Subject: [PATCH 04/10] Use APCu to persist "last API Deprecation" time --- .github/workflows/ci.yml | 3 ++- composer-require-checker.json | 7 +++++++ composer.json | 4 ++++ composer.lock | 8 +++++--- src/Clients/Http.php | 14 ++++++++++++++ tests/Clients/HttpTest.php | 22 ++++++++++++++++++++++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 composer-require-checker.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c43dc12..89577775 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,7 @@ jobs: CI: runs-on: ubuntu-latest env: - PHP_INI_VALUES: assert.exception=1, zend.assertions=1 + PHP_INI_VALUES: assert.exception=1, zend.assertions=1, apc.enable_cli=1 strategy: fail-fast: false matrix: @@ -21,6 +21,7 @@ jobs: tools: composer:v2, phpcs coverage: xdebug ini-values: ${{ env.PHP_INI_VALUES }} + extensions: apcu - name: Install dependencies with composer run: composer update --no-ansi --no-interaction --no-progress diff --git a/composer-require-checker.json b/composer-require-checker.json new file mode 100644 index 00000000..0464a26e --- /dev/null +++ b/composer-require-checker.json @@ -0,0 +1,7 @@ +{ + "symbol-whitelist" : [ + "apcu_enabled", + "apcu_fetch", + "apcu_store" + ] +} diff --git a/composer.json b/composer.json index 2f5c2463..d3a5a4d5 100644 --- a/composer.json +++ b/composer.json @@ -36,12 +36,16 @@ "ramsey/uuid": "^4.1" }, "require-dev": { + "ext-apcu": "*", "ergebnis/composer-normalize": "^2.30", "maglnet/composer-require-checker": "^3.0 || ^4.0", "mikey179/vfsstream": "^1.6", "phpunit/phpunit": "^9", "squizlabs/php_codesniffer": "^3.6" }, + "suggest": { + "ext-apcu": "Log fewer API deprecation warnings" + }, "autoload": { "psr-4": { "Shopify\\": "src/" diff --git a/composer.lock b/composer.lock index ea56e6f4..7caea27b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "93ba78898d3f08b785fb96d120f43e95", + "content-hash": "b1f586d61b3a6c89e4f349f8dd90d343", "packages": [ { "name": "brick/math", @@ -4278,6 +4278,8 @@ "ext-json": "*", "ext-mbstring": "*" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": { + "ext-apcu": "*" + }, + "plugin-api-version": "2.6.0" } diff --git a/src/Clients/Http.php b/src/Clients/Http.php index a3393d64..e875ec8a 100644 --- a/src/Clients/Http.php +++ b/src/Clients/Http.php @@ -276,6 +276,16 @@ private function logApiDeprecation(string $url, string $reason): void */ private function shouldLogApiDeprecation(): bool { + if (function_exists('apcu_enabled') && apcu_enabled()) { + $apcuKey = 'shopify/shopify-api/last-api-deprecation-warning'; + } else { + $apcuKey = null; + } + + if ($this->lastApiDeprecationWarning === 0 && $apcuKey) { + $this->lastApiDeprecationWarning = (int) apcu_fetch($apcuKey); + } + $secondsSinceLastAlert = time() - $this->lastApiDeprecationWarning; if ($secondsSinceLastAlert < self::DEPRECATION_ALERT_SECONDS) { return false; @@ -283,6 +293,10 @@ private function shouldLogApiDeprecation(): bool $this->lastApiDeprecationWarning = time(); + if ($apcuKey) { + apcu_store($apcuKey, $this->lastApiDeprecationWarning, self::DEPRECATION_ALERT_SECONDS); + } + return true; } diff --git a/tests/Clients/HttpTest.php b/tests/Clients/HttpTest.php index 21d2df18..b802e4f0 100644 --- a/tests/Clients/HttpTest.php +++ b/tests/Clients/HttpTest.php @@ -452,6 +452,10 @@ public function testDeprecatedRequestsAreLoggedWithinLimit() $testLogger = new LogMock(); Context::$LOGGER = $testLogger; + if (function_exists('apcu_enabled') && apcu_enabled()) { + apcu_delete('shopify/shopify-api/last-api-deprecation-warning'); + } + $this->mockTransportRequests([ new MockRequest( $this->buildMockHttpResponse(200, null, ['X-Shopify-API-Deprecated-Reason' => 'Test reason']), @@ -516,6 +520,10 @@ public function testDeprecationLogBackoffPeriod() $testLogger = new LogMock(); Context::$LOGGER = $testLogger; + if (function_exists('apcu_enabled') && apcu_enabled()) { + apcu_delete('shopify/shopify-api/last-api-deprecation-warning'); + } + $this->mockTransportRequests([ new MockRequest( $this->buildMockHttpResponse(200, null, ['X-Shopify-API-Deprecated-Reason' => 'Test reason']), @@ -532,6 +540,11 @@ public function testDeprecationLogBackoffPeriod() "https://$this->domain/test/path", "GET", ), + new MockRequest( + $this->buildMockHttpResponse(200, null, ['X-Shopify-API-Deprecated-Reason' => 'Test reason']), + "https://$this->domain/test/path", + "GET", + ), ]); $this->assertCount(0, $testLogger->records); @@ -548,5 +561,14 @@ public function testDeprecationLogBackoffPeriod() $mockedClient->get('test/path'); $this->assertCount(2, $testLogger->records); + + if (!function_exists('apcu_enabled') || !apcu_enabled()) { + $this->markTestSkipped('APCu is not enabled and is required for the correct testing of this feature.'); + } + + // Set the internal value back to its initial state. The class should read the stored value from APCu. + $reflector->setValue($mockedClient, 0); + $mockedClient->get('test/path'); + $this->assertCount(2, $testLogger->records); } } From 3e5c45cdb2cd7b673de78a288dad5b4e145ee1f9 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 14:18:33 +0100 Subject: [PATCH 05/10] Log deprecations less frequently --- src/Clients/Http.php | 2 +- tests/Clients/HttpTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Clients/Http.php b/src/Clients/Http.php index e875ec8a..1416676f 100644 --- a/src/Clients/Http.php +++ b/src/Clients/Http.php @@ -21,7 +21,7 @@ class Http public const DATA_TYPE_GRAPHQL = 'application/graphql'; private const RETRIABLE_STATUS_CODES = [429, 500]; - private const DEPRECATION_ALERT_SECONDS = 60; + private const DEPRECATION_ALERT_SECONDS = 3600; /** @var string */ private $domain; diff --git a/tests/Clients/HttpTest.php b/tests/Clients/HttpTest.php index b802e4f0..f93d49f6 100644 --- a/tests/Clients/HttpTest.php +++ b/tests/Clients/HttpTest.php @@ -555,7 +555,7 @@ public function testDeprecationLogBackoffPeriod() $mockedClient->get('test/path'); $this->assertCount(1, $testLogger->records); - // We only log once every minute, so simulate more time than having elapsed + // We only log once every hour, so simulate more time than having elapsed $reflector = new ReflectionProperty(Http::class, 'lastApiDeprecationWarning'); $reflector->setValue($mockedClient, time() - 7200); From 9766970e74368c300e70a99034461d919fb2388b Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 14:25:47 +0100 Subject: [PATCH 06/10] Update change log --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df52c74..740d7b65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## Unreleased +- [Patch] Avoid writing to system temporary directory when an API deprecation is encountered + ## v5.3.0 - 2024-01-10 - [#318](https://github.com/Shopify/shopify-api-php/pull/318) [Minor] Adding support for 2024-01 API version From 07e4d99eaa8dc71091c27afc20d8eb0ae65227a3 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 5 Apr 2024 14:33:57 +0100 Subject: [PATCH 07/10] Add link to pull request in change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 740d7b65..b98d0689 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## Unreleased -- [Patch] Avoid writing to system temporary directory when an API deprecation is encountered +- [#332](https://github.com/Shopify/shopify-api-php/pull/332) [Patch] Avoid writing to system temporary directory when an API deprecation is encountered ## v5.3.0 - 2024-01-10 From 8635fb7727b3b6b61b656cf32e9fdeecea1bd3a3 Mon Sep 17 00:00:00 2001 From: Paulo Margarido <64600052+paulomarg@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:03:39 -0400 Subject: [PATCH 08/10] Add support for 2024-04 API version --- src/ApiVersion.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ApiVersion.php b/src/ApiVersion.php index e4d3a4eb..e508076d 100644 --- a/src/ApiVersion.php +++ b/src/ApiVersion.php @@ -25,7 +25,9 @@ class ApiVersion /** @var string */ public const JANUARY_2024 = "2024-01"; /** @var string */ - public const LATEST = self::JANUARY_2024; + public const APRIL_2024 = "2024-04"; + /** @var string */ + public const LATEST = self::APRIL_2024; private static $ALL_VERSIONS = [ self::UNSTABLE, @@ -37,6 +39,7 @@ class ApiVersion self::JULY_2023, self::OCTOBER_2023, self::JANUARY_2024, + self::APRIL_2024, ]; public static function isValid(string $version): bool From e02042d0706feabbbb321d4142764914b014c8ca Mon Sep 17 00:00:00 2001 From: Paulo Margarido <64600052+paulomarg@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:03:55 -0400 Subject: [PATCH 09/10] Add REST resources for API version 2024-04 --- CHANGELOG.md | 2 + src/Rest/Admin2024_04/AbandonedCheckout.php | 101 + src/Rest/Admin2024_04/AccessScope.php | 47 + src/Rest/Admin2024_04/ApplePayCertificate.php | 105 + src/Rest/Admin2024_04/ApplicationCharge.php | 83 + src/Rest/Admin2024_04/ApplicationCredit.php | 76 + src/Rest/Admin2024_04/Article.php | 217 ++ src/Rest/Admin2024_04/Asset.php | 86 + .../Admin2024_04/AssignedFulfillmentOrder.php | 66 + src/Rest/Admin2024_04/Balance.php | 45 + src/Rest/Admin2024_04/Blog.php | 139 ++ src/Rest/Admin2024_04/CancellationRequest.php | 76 + src/Rest/Admin2024_04/CarrierService.php | 103 + src/Rest/Admin2024_04/Checkout.php | 139 ++ src/Rest/Admin2024_04/Collect.php | 130 ++ src/Rest/Admin2024_04/Collection.php | 88 + src/Rest/Admin2024_04/CollectionListing.php | 135 ++ src/Rest/Admin2024_04/Comment.php | 247 ++ src/Rest/Admin2024_04/Country.php | 130 ++ src/Rest/Admin2024_04/Currency.php | 46 + src/Rest/Admin2024_04/CustomCollection.php | 151 ++ src/Rest/Admin2024_04/Customer.php | 269 +++ src/Rest/Admin2024_04/CustomerAddress.php | 187 ++ src/Rest/Admin2024_04/DeprecatedApiCall.php | 46 + src/Rest/Admin2024_04/DiscountCode.php | 212 ++ src/Rest/Admin2024_04/Dispute.php | 82 + src/Rest/Admin2024_04/DisputeEvidence.php | 70 + src/Rest/Admin2024_04/DisputeFileUpload.php | 61 + src/Rest/Admin2024_04/DraftOrder.php | 213 ++ src/Rest/Admin2024_04/Event.php | 116 + src/Rest/Admin2024_04/Fulfillment.php | 179 ++ src/Rest/Admin2024_04/FulfillmentEvent.php | 131 ++ src/Rest/Admin2024_04/FulfillmentOrder.php | 288 +++ src/Rest/Admin2024_04/FulfillmentRequest.php | 91 + src/Rest/Admin2024_04/FulfillmentService.php | 108 + src/Rest/Admin2024_04/GiftCard.php | 176 ++ src/Rest/Admin2024_04/GiftCardAdjustment.php | 92 + src/Rest/Admin2024_04/Image.php | 137 ++ src/Rest/Admin2024_04/InventoryItem.php | 81 + src/Rest/Admin2024_04/InventoryLevel.php | 160 ++ src/Rest/Admin2024_04/Location.php | 136 ++ src/Rest/Admin2024_04/LocationsForMove.php | 46 + src/Rest/Admin2024_04/MarketingEvent.php | 172 ++ src/Rest/Admin2024_04/Metafield.php | 258 +++ .../MobilePlatformApplication.php | 101 + src/Rest/Admin2024_04/Order.php | 307 +++ src/Rest/Admin2024_04/OrderRisk.php | 130 ++ src/Rest/Admin2024_04/Page.php | 155 ++ src/Rest/Admin2024_04/Payment.php | 140 ++ src/Rest/Admin2024_04/PaymentGateway.php | 112 + src/Rest/Admin2024_04/PaymentTransaction.php | 71 + src/Rest/Admin2024_04/Payout.php | 78 + src/Rest/Admin2024_04/Policy.php | 50 + src/Rest/Admin2024_04/PriceRule.php | 160 ++ src/Rest/Admin2024_04/Product.php | 168 ++ src/Rest/Admin2024_04/ProductListing.php | 167 ++ .../Admin2024_04/ProductResourceFeedback.php | 65 + src/Rest/Admin2024_04/Province.php | 108 + .../RecurringApplicationCharge.php | 140 ++ src/Rest/Admin2024_04/Redirect.php | 131 ++ src/Rest/Admin2024_04/Refund.php | 116 + src/Rest/Admin2024_04/ResourceFeedback.php | 52 + src/Rest/Admin2024_04/ScriptTag.php | 137 ++ src/Rest/Admin2024_04/ShippingZone.php | 57 + src/Rest/Admin2024_04/Shop.php | 100 + src/Rest/Admin2024_04/SmartCollection.php | 178 ++ .../Admin2024_04/StorefrontAccessToken.php | 76 + src/Rest/Admin2024_04/TenderTransaction.php | 60 + src/Rest/Admin2024_04/Theme.php | 106 + src/Rest/Admin2024_04/Transaction.php | 126 ++ src/Rest/Admin2024_04/UsageCharge.php | 81 + src/Rest/Admin2024_04/User.php | 108 + src/Rest/Admin2024_04/Variant.php | 156 ++ src/Rest/Admin2024_04/Webhook.php | 142 ++ .../AbandonedCheckout202404Test.php | 228 ++ .../Admin2024_04/AccessScope202404Test.php | 60 + .../ApplePayCertificate202404Test.php | 176 ++ .../ApplicationCharge202404Test.php | 176 ++ .../ApplicationCredit202404Test.php | 89 + tests/Rest/Admin2024_04/Article202404Test.php | 717 ++++++ tests/Rest/Admin2024_04/Asset202404Test.php | 232 ++ .../AssignedFulfillmentOrder202404Test.php | 60 + tests/Rest/Admin2024_04/Balance202404Test.php | 60 + tests/Rest/Admin2024_04/Blog202404Test.php | 358 +++ .../CancellationRequest202404Test.php | 120 + .../Admin2024_04/CarrierService202404Test.php | 176 ++ .../Rest/Admin2024_04/Checkout202404Test.php | 361 +++ tests/Rest/Admin2024_04/Collect202404Test.php | 286 +++ .../Admin2024_04/Collection202404Test.php | 90 + .../CollectionListing202404Test.php | 174 ++ tests/Rest/Admin2024_04/Comment202404Test.php | 460 ++++ tests/Rest/Admin2024_04/Country202404Test.php | 257 +++ .../Rest/Admin2024_04/Currency202404Test.php | 60 + .../CustomCollection202404Test.php | 665 ++++++ .../Rest/Admin2024_04/Customer202404Test.php | 934 ++++++++ .../CustomerAddress202404Test.php | 303 +++ .../DeprecatedApiCall202404Test.php | 60 + .../Admin2024_04/DiscountCode202404Test.php | 289 +++ tests/Rest/Admin2024_04/Dispute202404Test.php | 145 ++ .../DisputeEvidence202404Test.php | 140 ++ .../DisputeFileUpload202404Test.php | 92 + .../Admin2024_04/DraftOrder202404Test.php | 634 ++++++ tests/Rest/Admin2024_04/Event202404Test.php | 341 +++ .../Admin2024_04/Fulfillment202404Test.php | 441 ++++ .../FulfillmentEvent202404Test.php | 147 ++ .../FulfillmentOrder202404Test.php | 437 ++++ .../FulfillmentRequest202404Test.php | 158 ++ .../FulfillmentService202404Test.php | 208 ++ .../Rest/Admin2024_04/GiftCard202404Test.php | 374 ++++ .../GiftCardAdjustment202404Test.php | 206 ++ tests/Rest/Admin2024_04/Image202404Test.php | 458 ++++ .../Admin2024_04/InventoryItem202404Test.php | 145 ++ .../Admin2024_04/InventoryLevel202404Test.php | 234 ++ .../Rest/Admin2024_04/Location202404Test.php | 146 ++ .../LocationsForMove202404Test.php | 60 + .../Admin2024_04/MarketingEvent202404Test.php | 249 +++ .../Rest/Admin2024_04/Metafield202404Test.php | 1983 +++++++++++++++++ .../MobilePlatformApplication202404Test.php | 254 +++ tests/Rest/Admin2024_04/Order202404Test.php | 1176 ++++++++++ .../Rest/Admin2024_04/OrderRisk202404Test.php | 184 ++ tests/Rest/Admin2024_04/Page202404Test.php | 417 ++++ tests/Rest/Admin2024_04/Payment202404Test.php | 181 ++ .../Admin2024_04/PaymentGateway202404Test.php | 202 ++ .../PaymentTransaction202404Test.php | 60 + tests/Rest/Admin2024_04/Payout202404Test.php | 117 + tests/Rest/Admin2024_04/Policy202404Test.php | 60 + .../Rest/Admin2024_04/PriceRule202404Test.php | 356 +++ tests/Rest/Admin2024_04/Product202404Test.php | 1077 +++++++++ .../Admin2024_04/ProductListing202404Test.php | 201 ++ .../ProductResourceFeedback202404Test.php | 123 + .../Rest/Admin2024_04/Province202404Test.php | 174 ++ .../RecurringApplicationCharge202404Test.php | 294 +++ .../Rest/Admin2024_04/Redirect202404Test.php | 315 +++ tests/Rest/Admin2024_04/Refund202404Test.php | 267 +++ .../ResourceFeedback202404Test.php | 119 + .../Rest/Admin2024_04/ScriptTag202404Test.php | 258 +++ .../Admin2024_04/ShippingZone202404Test.php | 60 + tests/Rest/Admin2024_04/Shop202404Test.php | 88 + .../SmartCollection202404Test.php | 683 ++++++ .../StorefrontAccessToken202404Test.php | 116 + .../TenderTransaction202404Test.php | 200 ++ tests/Rest/Admin2024_04/Theme202404Test.php | 203 ++ .../Admin2024_04/Transaction202404Test.php | 268 +++ .../Admin2024_04/UsageCharge202404Test.php | 118 + tests/Rest/Admin2024_04/User202404Test.php | 117 + tests/Rest/Admin2024_04/Variant202404Test.php | 388 ++++ tests/Rest/Admin2024_04/Webhook202404Test.php | 321 +++ 147 files changed, 30487 insertions(+) create mode 100644 src/Rest/Admin2024_04/AbandonedCheckout.php create mode 100644 src/Rest/Admin2024_04/AccessScope.php create mode 100644 src/Rest/Admin2024_04/ApplePayCertificate.php create mode 100644 src/Rest/Admin2024_04/ApplicationCharge.php create mode 100644 src/Rest/Admin2024_04/ApplicationCredit.php create mode 100644 src/Rest/Admin2024_04/Article.php create mode 100644 src/Rest/Admin2024_04/Asset.php create mode 100644 src/Rest/Admin2024_04/AssignedFulfillmentOrder.php create mode 100644 src/Rest/Admin2024_04/Balance.php create mode 100644 src/Rest/Admin2024_04/Blog.php create mode 100644 src/Rest/Admin2024_04/CancellationRequest.php create mode 100644 src/Rest/Admin2024_04/CarrierService.php create mode 100644 src/Rest/Admin2024_04/Checkout.php create mode 100644 src/Rest/Admin2024_04/Collect.php create mode 100644 src/Rest/Admin2024_04/Collection.php create mode 100644 src/Rest/Admin2024_04/CollectionListing.php create mode 100644 src/Rest/Admin2024_04/Comment.php create mode 100644 src/Rest/Admin2024_04/Country.php create mode 100644 src/Rest/Admin2024_04/Currency.php create mode 100644 src/Rest/Admin2024_04/CustomCollection.php create mode 100644 src/Rest/Admin2024_04/Customer.php create mode 100644 src/Rest/Admin2024_04/CustomerAddress.php create mode 100644 src/Rest/Admin2024_04/DeprecatedApiCall.php create mode 100644 src/Rest/Admin2024_04/DiscountCode.php create mode 100644 src/Rest/Admin2024_04/Dispute.php create mode 100644 src/Rest/Admin2024_04/DisputeEvidence.php create mode 100644 src/Rest/Admin2024_04/DisputeFileUpload.php create mode 100644 src/Rest/Admin2024_04/DraftOrder.php create mode 100644 src/Rest/Admin2024_04/Event.php create mode 100644 src/Rest/Admin2024_04/Fulfillment.php create mode 100644 src/Rest/Admin2024_04/FulfillmentEvent.php create mode 100644 src/Rest/Admin2024_04/FulfillmentOrder.php create mode 100644 src/Rest/Admin2024_04/FulfillmentRequest.php create mode 100644 src/Rest/Admin2024_04/FulfillmentService.php create mode 100644 src/Rest/Admin2024_04/GiftCard.php create mode 100644 src/Rest/Admin2024_04/GiftCardAdjustment.php create mode 100644 src/Rest/Admin2024_04/Image.php create mode 100644 src/Rest/Admin2024_04/InventoryItem.php create mode 100644 src/Rest/Admin2024_04/InventoryLevel.php create mode 100644 src/Rest/Admin2024_04/Location.php create mode 100644 src/Rest/Admin2024_04/LocationsForMove.php create mode 100644 src/Rest/Admin2024_04/MarketingEvent.php create mode 100644 src/Rest/Admin2024_04/Metafield.php create mode 100644 src/Rest/Admin2024_04/MobilePlatformApplication.php create mode 100644 src/Rest/Admin2024_04/Order.php create mode 100644 src/Rest/Admin2024_04/OrderRisk.php create mode 100644 src/Rest/Admin2024_04/Page.php create mode 100644 src/Rest/Admin2024_04/Payment.php create mode 100644 src/Rest/Admin2024_04/PaymentGateway.php create mode 100644 src/Rest/Admin2024_04/PaymentTransaction.php create mode 100644 src/Rest/Admin2024_04/Payout.php create mode 100644 src/Rest/Admin2024_04/Policy.php create mode 100644 src/Rest/Admin2024_04/PriceRule.php create mode 100644 src/Rest/Admin2024_04/Product.php create mode 100644 src/Rest/Admin2024_04/ProductListing.php create mode 100644 src/Rest/Admin2024_04/ProductResourceFeedback.php create mode 100644 src/Rest/Admin2024_04/Province.php create mode 100644 src/Rest/Admin2024_04/RecurringApplicationCharge.php create mode 100644 src/Rest/Admin2024_04/Redirect.php create mode 100644 src/Rest/Admin2024_04/Refund.php create mode 100644 src/Rest/Admin2024_04/ResourceFeedback.php create mode 100644 src/Rest/Admin2024_04/ScriptTag.php create mode 100644 src/Rest/Admin2024_04/ShippingZone.php create mode 100644 src/Rest/Admin2024_04/Shop.php create mode 100644 src/Rest/Admin2024_04/SmartCollection.php create mode 100644 src/Rest/Admin2024_04/StorefrontAccessToken.php create mode 100644 src/Rest/Admin2024_04/TenderTransaction.php create mode 100644 src/Rest/Admin2024_04/Theme.php create mode 100644 src/Rest/Admin2024_04/Transaction.php create mode 100644 src/Rest/Admin2024_04/UsageCharge.php create mode 100644 src/Rest/Admin2024_04/User.php create mode 100644 src/Rest/Admin2024_04/Variant.php create mode 100644 src/Rest/Admin2024_04/Webhook.php create mode 100644 tests/Rest/Admin2024_04/AbandonedCheckout202404Test.php create mode 100644 tests/Rest/Admin2024_04/AccessScope202404Test.php create mode 100644 tests/Rest/Admin2024_04/ApplePayCertificate202404Test.php create mode 100644 tests/Rest/Admin2024_04/ApplicationCharge202404Test.php create mode 100644 tests/Rest/Admin2024_04/ApplicationCredit202404Test.php create mode 100644 tests/Rest/Admin2024_04/Article202404Test.php create mode 100644 tests/Rest/Admin2024_04/Asset202404Test.php create mode 100644 tests/Rest/Admin2024_04/AssignedFulfillmentOrder202404Test.php create mode 100644 tests/Rest/Admin2024_04/Balance202404Test.php create mode 100644 tests/Rest/Admin2024_04/Blog202404Test.php create mode 100644 tests/Rest/Admin2024_04/CancellationRequest202404Test.php create mode 100644 tests/Rest/Admin2024_04/CarrierService202404Test.php create mode 100644 tests/Rest/Admin2024_04/Checkout202404Test.php create mode 100644 tests/Rest/Admin2024_04/Collect202404Test.php create mode 100644 tests/Rest/Admin2024_04/Collection202404Test.php create mode 100644 tests/Rest/Admin2024_04/CollectionListing202404Test.php create mode 100644 tests/Rest/Admin2024_04/Comment202404Test.php create mode 100644 tests/Rest/Admin2024_04/Country202404Test.php create mode 100644 tests/Rest/Admin2024_04/Currency202404Test.php create mode 100644 tests/Rest/Admin2024_04/CustomCollection202404Test.php create mode 100644 tests/Rest/Admin2024_04/Customer202404Test.php create mode 100644 tests/Rest/Admin2024_04/CustomerAddress202404Test.php create mode 100644 tests/Rest/Admin2024_04/DeprecatedApiCall202404Test.php create mode 100644 tests/Rest/Admin2024_04/DiscountCode202404Test.php create mode 100644 tests/Rest/Admin2024_04/Dispute202404Test.php create mode 100644 tests/Rest/Admin2024_04/DisputeEvidence202404Test.php create mode 100644 tests/Rest/Admin2024_04/DisputeFileUpload202404Test.php create mode 100644 tests/Rest/Admin2024_04/DraftOrder202404Test.php create mode 100644 tests/Rest/Admin2024_04/Event202404Test.php create mode 100644 tests/Rest/Admin2024_04/Fulfillment202404Test.php create mode 100644 tests/Rest/Admin2024_04/FulfillmentEvent202404Test.php create mode 100644 tests/Rest/Admin2024_04/FulfillmentOrder202404Test.php create mode 100644 tests/Rest/Admin2024_04/FulfillmentRequest202404Test.php create mode 100644 tests/Rest/Admin2024_04/FulfillmentService202404Test.php create mode 100644 tests/Rest/Admin2024_04/GiftCard202404Test.php create mode 100644 tests/Rest/Admin2024_04/GiftCardAdjustment202404Test.php create mode 100644 tests/Rest/Admin2024_04/Image202404Test.php create mode 100644 tests/Rest/Admin2024_04/InventoryItem202404Test.php create mode 100644 tests/Rest/Admin2024_04/InventoryLevel202404Test.php create mode 100644 tests/Rest/Admin2024_04/Location202404Test.php create mode 100644 tests/Rest/Admin2024_04/LocationsForMove202404Test.php create mode 100644 tests/Rest/Admin2024_04/MarketingEvent202404Test.php create mode 100644 tests/Rest/Admin2024_04/Metafield202404Test.php create mode 100644 tests/Rest/Admin2024_04/MobilePlatformApplication202404Test.php create mode 100644 tests/Rest/Admin2024_04/Order202404Test.php create mode 100644 tests/Rest/Admin2024_04/OrderRisk202404Test.php create mode 100644 tests/Rest/Admin2024_04/Page202404Test.php create mode 100644 tests/Rest/Admin2024_04/Payment202404Test.php create mode 100644 tests/Rest/Admin2024_04/PaymentGateway202404Test.php create mode 100644 tests/Rest/Admin2024_04/PaymentTransaction202404Test.php create mode 100644 tests/Rest/Admin2024_04/Payout202404Test.php create mode 100644 tests/Rest/Admin2024_04/Policy202404Test.php create mode 100644 tests/Rest/Admin2024_04/PriceRule202404Test.php create mode 100644 tests/Rest/Admin2024_04/Product202404Test.php create mode 100644 tests/Rest/Admin2024_04/ProductListing202404Test.php create mode 100644 tests/Rest/Admin2024_04/ProductResourceFeedback202404Test.php create mode 100644 tests/Rest/Admin2024_04/Province202404Test.php create mode 100644 tests/Rest/Admin2024_04/RecurringApplicationCharge202404Test.php create mode 100644 tests/Rest/Admin2024_04/Redirect202404Test.php create mode 100644 tests/Rest/Admin2024_04/Refund202404Test.php create mode 100644 tests/Rest/Admin2024_04/ResourceFeedback202404Test.php create mode 100644 tests/Rest/Admin2024_04/ScriptTag202404Test.php create mode 100644 tests/Rest/Admin2024_04/ShippingZone202404Test.php create mode 100644 tests/Rest/Admin2024_04/Shop202404Test.php create mode 100644 tests/Rest/Admin2024_04/SmartCollection202404Test.php create mode 100644 tests/Rest/Admin2024_04/StorefrontAccessToken202404Test.php create mode 100644 tests/Rest/Admin2024_04/TenderTransaction202404Test.php create mode 100644 tests/Rest/Admin2024_04/Theme202404Test.php create mode 100644 tests/Rest/Admin2024_04/Transaction202404Test.php create mode 100644 tests/Rest/Admin2024_04/UsageCharge202404Test.php create mode 100644 tests/Rest/Admin2024_04/User202404Test.php create mode 100644 tests/Rest/Admin2024_04/Variant202404Test.php create mode 100644 tests/Rest/Admin2024_04/Webhook202404Test.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df52c74..d7f11ded 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## Unreleased +- [#333](https://github.com/Shopify/shopify-api-php/pull/333) [Minor] Adding support for 2024-04 API version + ## v5.3.0 - 2024-01-10 - [#318](https://github.com/Shopify/shopify-api-php/pull/318) [Minor] Adding support for 2024-01 API version diff --git a/src/Rest/Admin2024_04/AbandonedCheckout.php b/src/Rest/Admin2024_04/AbandonedCheckout.php new file mode 100644 index 00000000..aa777d2c --- /dev/null +++ b/src/Rest/Admin2024_04/AbandonedCheckout.php @@ -0,0 +1,101 @@ + Currency::class, + "customer" => Customer::class + ]; + protected static array $HAS_MANY = [ + "discount_codes" => DiscountCode::class + ]; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "checkouts", "ids" => [], "path" => "checkouts.json"], + ["http_method" => "get", "operation" => "checkouts", "ids" => [], "path" => "checkouts.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * status, + * limit + * + * @return array|null + */ + public static function checkouts( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "checkouts", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/AccessScope.php b/src/Rest/Admin2024_04/AccessScope.php new file mode 100644 index 00000000..f1c4aca8 --- /dev/null +++ b/src/Rest/Admin2024_04/AccessScope.php @@ -0,0 +1,47 @@ + "get", "operation" => "get", "ids" => [], "path" => "access_scopes.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return AccessScope[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/ApplePayCertificate.php b/src/Rest/Admin2024_04/ApplePayCertificate.php new file mode 100644 index 00000000..f3578aa5 --- /dev/null +++ b/src/Rest/Admin2024_04/ApplePayCertificate.php @@ -0,0 +1,105 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "apple_pay_certificates/.json"], + ["http_method" => "get", "operation" => "csr", "ids" => ["id"], "path" => "apple_pay_certificates//csr.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "apple_pay_certificates/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "apple_pay_certificates.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "apple_pay_certificates/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return ApplePayCertificate|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?ApplePayCertificate { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function csr( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "csr", + $session, + array_merge(["id" => $id], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/ApplicationCharge.php b/src/Rest/Admin2024_04/ApplicationCharge.php new file mode 100644 index 00000000..b9115e8d --- /dev/null +++ b/src/Rest/Admin2024_04/ApplicationCharge.php @@ -0,0 +1,83 @@ + Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "application_charges.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "application_charges/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "application_charges.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return ApplicationCharge|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?ApplicationCharge { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * fields + * + * @return ApplicationCharge[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/ApplicationCredit.php b/src/Rest/Admin2024_04/ApplicationCredit.php new file mode 100644 index 00000000..023c5581 --- /dev/null +++ b/src/Rest/Admin2024_04/ApplicationCredit.php @@ -0,0 +1,76 @@ + Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "application_credits.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "application_credits/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return ApplicationCredit|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?ApplicationCredit { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return ApplicationCredit[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Article.php b/src/Rest/Admin2024_04/Article.php new file mode 100644 index 00000000..2989ccf9 --- /dev/null +++ b/src/Rest/Admin2024_04/Article.php @@ -0,0 +1,217 @@ + Metafield::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["blog_id", "id"], "path" => "blogs//articles/.json"], + ["http_method" => "get", "operation" => "authors", "ids" => [], "path" => "articles/authors.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["blog_id"], "path" => "blogs//articles/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id"], "path" => "blogs//articles.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id", "id"], "path" => "blogs//articles/.json"], + ["http_method" => "get", "operation" => "tags", "ids" => [], "path" => "articles/tags.json"], + ["http_method" => "get", "operation" => "tags", "ids" => ["blog_id"], "path" => "blogs//articles/tags.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["blog_id"], "path" => "blogs//articles.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["blog_id", "id"], "path" => "blogs//articles/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * blog_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Article|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Article { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * blog_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * blog_id + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status, + * handle, + * tag, + * author, + * fields + * + * @return Article[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function authors( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "authors", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * blog_id + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * blog_id + * @param mixed[] $params Allowed indexes: + * limit, + * popular + * + * @return array|null + */ + public static function tags( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "tags", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Asset.php b/src/Rest/Admin2024_04/Asset.php new file mode 100644 index 00000000..6f7f2e26 --- /dev/null +++ b/src/Rest/Admin2024_04/Asset.php @@ -0,0 +1,86 @@ + "delete", "operation" => "delete", "ids" => ["theme_id"], "path" => "themes//assets.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["theme_id"], "path" => "themes//assets.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["theme_id"], "path" => "themes//assets.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["theme_id"], "path" => "themes//assets.json"] + ]; + protected static string $PRIMARY_KEY = "key"; + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * theme_id + * @param mixed[] $params Allowed indexes: + * asset + * + * @return array|null + */ + public static function delete( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + $urlIds, + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * theme_id + * @param mixed[] $params Allowed indexes: + * fields, + * asset + * + * @return Asset[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/AssignedFulfillmentOrder.php b/src/Rest/Admin2024_04/AssignedFulfillmentOrder.php new file mode 100644 index 00000000..589613d8 --- /dev/null +++ b/src/Rest/Admin2024_04/AssignedFulfillmentOrder.php @@ -0,0 +1,66 @@ + "get", "operation" => "get", "ids" => [], "path" => "assigned_fulfillment_orders.json"] + ]; + + /** + + * + * @return string[] + */ + protected static function getJsonResponseBodyNames(): array + { + return [ + "fulfillment_order" + ]; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * assignment_status, + * location_ids + * + * @return AssignedFulfillmentOrder[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Balance.php b/src/Rest/Admin2024_04/Balance.php new file mode 100644 index 00000000..26e3eb7a --- /dev/null +++ b/src/Rest/Admin2024_04/Balance.php @@ -0,0 +1,45 @@ + "get", "operation" => "get", "ids" => [], "path" => "shopify_payments/balance.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return Balance[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Blog.php b/src/Rest/Admin2024_04/Blog.php new file mode 100644 index 00000000..06e90ac7 --- /dev/null +++ b/src/Rest/Admin2024_04/Blog.php @@ -0,0 +1,139 @@ + Metafield::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "blogs/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "blogs/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "blogs.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "blogs/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "blogs.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "blogs/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Blog|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Blog { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * handle, + * fields + * + * @return Blog[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/CancellationRequest.php b/src/Rest/Admin2024_04/CancellationRequest.php new file mode 100644 index 00000000..91392eba --- /dev/null +++ b/src/Rest/Admin2024_04/CancellationRequest.php @@ -0,0 +1,76 @@ + "post", "operation" => "accept", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//cancellation_request/accept.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//cancellation_request.json"], + ["http_method" => "post", "operation" => "reject", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//cancellation_request/reject.json"] + ]; + + /** + * @param mixed[] $params Allowed indexes: + * message + * @param array|string $body + * + * @return array|null + */ + public function accept( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "accept", + $this->session, + ["fulfillment_order_id" => $this->fulfillment_order_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * message + * @param array|string $body + * + * @return array|null + */ + public function reject( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "reject", + $this->session, + ["fulfillment_order_id" => $this->fulfillment_order_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/CarrierService.php b/src/Rest/Admin2024_04/CarrierService.php new file mode 100644 index 00000000..6c2aaf28 --- /dev/null +++ b/src/Rest/Admin2024_04/CarrierService.php @@ -0,0 +1,103 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "carrier_services/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "carrier_services.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "carrier_services/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "carrier_services.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "carrier_services/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return CarrierService|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?CarrierService { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return CarrierService[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Checkout.php b/src/Rest/Admin2024_04/Checkout.php new file mode 100644 index 00000000..eff8b3b0 --- /dev/null +++ b/src/Rest/Admin2024_04/Checkout.php @@ -0,0 +1,139 @@ + DiscountCode::class, + "order" => Order::class + ]; + protected static array $HAS_MANY = [ + "gift_cards" => GiftCard::class + ]; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => ["token"], "path" => "checkouts/.json"], + ["http_method" => "get", "operation" => "shipping_rates", "ids" => ["token"], "path" => "checkouts//shipping_rates.json"], + ["http_method" => "post", "operation" => "complete", "ids" => ["token"], "path" => "checkouts//complete.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "checkouts.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["token"], "path" => "checkouts/.json"] + ]; + protected static string $PRIMARY_KEY = "token"; + + /** + * @param Session $session + * @param int|string $token + * @param array $urlIds + * @param mixed[] $params + * + * @return Checkout|null + */ + public static function find( + Session $session, + $token, + array $urlIds = [], + array $params = [] + ): ?Checkout { + $result = parent::baseFind( + $session, + array_merge(["token" => $token], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $token + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function shipping_rates( + Session $session, + $token, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "shipping_rates", + $session, + array_merge(["token" => $token], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function complete( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "complete", + $this->session, + ["token" => $this->token], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Collect.php b/src/Rest/Admin2024_04/Collect.php new file mode 100644 index 00000000..f4d8c8fc --- /dev/null +++ b/src/Rest/Admin2024_04/Collect.php @@ -0,0 +1,130 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "collects/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "collects/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "collects.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "collects/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "collects.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Collect|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Collect { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * fields + * + * @return Collect[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Collection.php b/src/Rest/Admin2024_04/Collection.php new file mode 100644 index 00000000..be8ba165 --- /dev/null +++ b/src/Rest/Admin2024_04/Collection.php @@ -0,0 +1,88 @@ + Image::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "collections/.json"], + ["http_method" => "get", "operation" => "products", "ids" => ["id"], "path" => "collections//products.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Collection|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Collection { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit + * + * @return array|null + */ + public static function products( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "products", + $session, + array_merge(["id" => $id], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/CollectionListing.php b/src/Rest/Admin2024_04/CollectionListing.php new file mode 100644 index 00000000..39df8726 --- /dev/null +++ b/src/Rest/Admin2024_04/CollectionListing.php @@ -0,0 +1,135 @@ + Image::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["collection_id"], "path" => "collection_listings/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "collection_listings.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["collection_id"], "path" => "collection_listings/.json"], + ["http_method" => "get", "operation" => "product_ids", "ids" => ["collection_id"], "path" => "collection_listings//product_ids.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["collection_id"], "path" => "collection_listings/.json"] + ]; + protected static string $PRIMARY_KEY = "collection_id"; + + /** + * @param Session $session + * @param int|string $collection_id + * @param array $urlIds + * @param mixed[] $params + * + * @return CollectionListing|null + */ + public static function find( + Session $session, + $collection_id, + array $urlIds = [], + array $params = [] + ): ?CollectionListing { + $result = parent::baseFind( + $session, + array_merge(["collection_id" => $collection_id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $collection_id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $collection_id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["collection_id" => $collection_id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit + * + * @return CollectionListing[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param int|string $collection_id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit + * + * @return array|null + */ + public static function product_ids( + Session $session, + $collection_id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "product_ids", + $session, + array_merge(["collection_id" => $collection_id], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Comment.php b/src/Rest/Admin2024_04/Comment.php new file mode 100644 index 00000000..16265de0 --- /dev/null +++ b/src/Rest/Admin2024_04/Comment.php @@ -0,0 +1,247 @@ + "get", "operation" => "count", "ids" => [], "path" => "comments/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "comments.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "comments/.json"], + ["http_method" => "post", "operation" => "approve", "ids" => ["id"], "path" => "comments//approve.json"], + ["http_method" => "post", "operation" => "not_spam", "ids" => ["id"], "path" => "comments//not_spam.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "comments.json"], + ["http_method" => "post", "operation" => "remove", "ids" => ["id"], "path" => "comments//remove.json"], + ["http_method" => "post", "operation" => "restore", "ids" => ["id"], "path" => "comments//restore.json"], + ["http_method" => "post", "operation" => "spam", "ids" => ["id"], "path" => "comments//spam.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "comments/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Comment|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Comment { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * fields, + * published_status, + * status + * + * @return Comment[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status, + * status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function approve( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "approve", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function not_spam( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "not_spam", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function remove( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "remove", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function restore( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "restore", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function spam( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "spam", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Country.php b/src/Rest/Admin2024_04/Country.php new file mode 100644 index 00000000..ef5b761f --- /dev/null +++ b/src/Rest/Admin2024_04/Country.php @@ -0,0 +1,130 @@ + Province::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "countries/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "countries/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "countries.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "countries/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "countries.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "countries/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Country|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Country { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * fields + * + * @return Country[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Currency.php b/src/Rest/Admin2024_04/Currency.php new file mode 100644 index 00000000..fe8e43a2 --- /dev/null +++ b/src/Rest/Admin2024_04/Currency.php @@ -0,0 +1,46 @@ + "get", "operation" => "get", "ids" => [], "path" => "currencies.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return Currency[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/CustomCollection.php b/src/Rest/Admin2024_04/CustomCollection.php new file mode 100644 index 00000000..7bf1a1bb --- /dev/null +++ b/src/Rest/Admin2024_04/CustomCollection.php @@ -0,0 +1,151 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "custom_collections/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "custom_collections/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "custom_collections.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "custom_collections/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "custom_collections.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "custom_collections/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return CustomCollection|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?CustomCollection { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * ids, + * since_id, + * title, + * product_id, + * handle, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status, + * fields + * + * @return CustomCollection[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * title, + * product_id, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Customer.php b/src/Rest/Admin2024_04/Customer.php new file mode 100644 index 00000000..9ae8e6d7 --- /dev/null +++ b/src/Rest/Admin2024_04/Customer.php @@ -0,0 +1,269 @@ + Metafield::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "customers/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "customers/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "customers.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "customers/.json"], + ["http_method" => "get", "operation" => "orders", "ids" => ["id"], "path" => "customers//orders.json"], + ["http_method" => "get", "operation" => "search", "ids" => [], "path" => "customers/search.json"], + ["http_method" => "post", "operation" => "account_activation_url", "ids" => ["id"], "path" => "customers//account_activation_url.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "customers.json"], + ["http_method" => "post", "operation" => "send_invite", "ids" => ["id"], "path" => "customers//send_invite.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "customers/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Customer|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Customer { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * ids, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * limit, + * fields + * + * @return Customer[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * status + * + * @return array|null + */ + public static function orders( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "orders", + $session, + array_merge(["id" => $id], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * order, + * query, + * limit, + * fields + * + * @return array|null + */ + public static function search( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "search", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function account_activation_url( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "account_activation_url", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function send_invite( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "send_invite", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/CustomerAddress.php b/src/Rest/Admin2024_04/CustomerAddress.php new file mode 100644 index 00000000..92950741 --- /dev/null +++ b/src/Rest/Admin2024_04/CustomerAddress.php @@ -0,0 +1,187 @@ + "delete", "operation" => "delete", "ids" => ["customer_id", "id"], "path" => "customers//addresses/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["customer_id"], "path" => "customers//addresses.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["customer_id", "id"], "path" => "customers//addresses/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["customer_id"], "path" => "customers//addresses.json"], + ["http_method" => "put", "operation" => "default", "ids" => ["customer_id", "id"], "path" => "customers//addresses//default.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["customer_id", "id"], "path" => "customers//addresses/.json"], + ["http_method" => "put", "operation" => "set", "ids" => ["customer_id"], "path" => "customers//addresses/set.json"] + ]; + + /** + + * + * @return string + */ + protected static function getJsonBodyName(): string + { + return "address"; + } + + /** + + * + * @return string[] + */ + protected static function getJsonResponseBodyNames(): array + { + return [ + "customer_address", + "address" + ]; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * customer_id + * @param mixed[] $params + * + * @return CustomerAddress|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?CustomerAddress { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * customer_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * customer_id + * @param mixed[] $params + * + * @return CustomerAddress[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function default( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "put", + "default", + $this->session, + ["customer_id" => $this->customer_id, "id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * address_ids, + * operation + * @param array|string $body + * + * @return array|null + */ + public function set( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "put", + "set", + $this->session, + ["customer_id" => $this->customer_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/DeprecatedApiCall.php b/src/Rest/Admin2024_04/DeprecatedApiCall.php new file mode 100644 index 00000000..ff5a8d01 --- /dev/null +++ b/src/Rest/Admin2024_04/DeprecatedApiCall.php @@ -0,0 +1,46 @@ + "get", "operation" => "get", "ids" => [], "path" => "deprecated_api_calls.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return DeprecatedApiCall[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/DiscountCode.php b/src/Rest/Admin2024_04/DiscountCode.php new file mode 100644 index 00000000..27f3d7ef --- /dev/null +++ b/src/Rest/Admin2024_04/DiscountCode.php @@ -0,0 +1,212 @@ + "delete", "operation" => "delete", "ids" => ["price_rule_id", "id"], "path" => "price_rules//discount_codes/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "discount_codes/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["price_rule_id", "batch_id"], "path" => "price_rules//batch//discount_codes.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["price_rule_id"], "path" => "price_rules//discount_codes.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["price_rule_id", "id"], "path" => "price_rules//discount_codes/.json"], + ["http_method" => "get", "operation" => "get_all", "ids" => ["price_rule_id", "batch_id"], "path" => "price_rules//batch/.json"], + ["http_method" => "get", "operation" => "lookup", "ids" => [], "path" => "discount_codes/lookup.json"], + ["http_method" => "post", "operation" => "batch", "ids" => ["price_rule_id"], "path" => "price_rules//batch.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["price_rule_id"], "path" => "price_rules//discount_codes.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["price_rule_id", "id"], "path" => "price_rules//discount_codes/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * price_rule_id + * @param mixed[] $params + * + * @return DiscountCode|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?DiscountCode { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * price_rule_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * price_rule_id + * batch_id + * @param mixed[] $params + * + * @return DiscountCode[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * times_used, + * times_used_min, + * times_used_max + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * price_rule_id + * batch_id + * @param mixed[] $params + * + * @return array|null + */ + public static function get_all( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "get_all", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * code + * + * @return array|null + */ + public static function lookup( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "lookup", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function batch( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "batch", + $this->session, + ["price_rule_id" => $this->price_rule_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Dispute.php b/src/Rest/Admin2024_04/Dispute.php new file mode 100644 index 00000000..5ccd3a44 --- /dev/null +++ b/src/Rest/Admin2024_04/Dispute.php @@ -0,0 +1,82 @@ + "get", "operation" => "get", "ids" => [], "path" => "shopify_payments/disputes.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "shopify_payments/disputes/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return Dispute|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Dispute { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * last_id, + * status, + * initiated_at + * + * @return Dispute[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/DisputeEvidence.php b/src/Rest/Admin2024_04/DisputeEvidence.php new file mode 100644 index 00000000..ca6e5df6 --- /dev/null +++ b/src/Rest/Admin2024_04/DisputeEvidence.php @@ -0,0 +1,70 @@ + Fulfillment::class + ]; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => ["dispute_id"], "path" => "shopify_payments/disputes//dispute_evidences.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["dispute_id"], "path" => "shopify_payments/disputes//dispute_evidences.json"] + ]; + protected static string $PRIMARY_KEY = "dispute_id"; + + /** + * @param Session $session + * @param int|string $dispute_id + * @param array $urlIds + * @param mixed[] $params + * + * @return DisputeEvidence|null + */ + public static function find( + Session $session, + $dispute_id, + array $urlIds = [], + array $params = [] + ): ?DisputeEvidence { + $result = parent::baseFind( + $session, + array_merge(["dispute_id" => $dispute_id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + +} diff --git a/src/Rest/Admin2024_04/DisputeFileUpload.php b/src/Rest/Admin2024_04/DisputeFileUpload.php new file mode 100644 index 00000000..707a2bea --- /dev/null +++ b/src/Rest/Admin2024_04/DisputeFileUpload.php @@ -0,0 +1,61 @@ + "delete", "operation" => "delete", "ids" => ["dispute_id", "id"], "path" => "shopify_payments/disputes//dispute_file_uploads/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["dispute_id"], "path" => "shopify_payments/disputes//dispute_file_uploads.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * dispute_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/DraftOrder.php b/src/Rest/Admin2024_04/DraftOrder.php new file mode 100644 index 00000000..2d5b4825 --- /dev/null +++ b/src/Rest/Admin2024_04/DraftOrder.php @@ -0,0 +1,213 @@ + Customer::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "draft_orders/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "draft_orders/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "draft_orders.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "draft_orders/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "draft_orders.json"], + ["http_method" => "post", "operation" => "send_invoice", "ids" => ["id"], "path" => "draft_orders//send_invoice.json"], + ["http_method" => "put", "operation" => "complete", "ids" => ["id"], "path" => "draft_orders//complete.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "draft_orders/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return DraftOrder|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?DraftOrder { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields, + * limit, + * since_id, + * updated_at_min, + * updated_at_max, + * ids, + * status + * + * @return DraftOrder[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * status, + * updated_at_max, + * updated_at_min + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function send_invoice( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "send_invoice", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * payment_gateway_id, + * payment_pending + * @param array|string $body + * + * @return array|null + */ + public function complete( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "put", + "complete", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Event.php b/src/Rest/Admin2024_04/Event.php new file mode 100644 index 00000000..a24870d9 --- /dev/null +++ b/src/Rest/Admin2024_04/Event.php @@ -0,0 +1,116 @@ + "get", "operation" => "count", "ids" => [], "path" => "events/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "events.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "events/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//events.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id"], "path" => "products//events.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Event|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Event { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * product_id + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * filter, + * verb, + * fields + * + * @return Event[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Fulfillment.php b/src/Rest/Admin2024_04/Fulfillment.php new file mode 100644 index 00000000..eecbe9ec --- /dev/null +++ b/src/Rest/Admin2024_04/Fulfillment.php @@ -0,0 +1,179 @@ + "get", "operation" => "count", "ids" => ["order_id"], "path" => "orders//fulfillments/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//fulfillments.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//fulfillments.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "id"], "path" => "orders//fulfillments/.json"], + ["http_method" => "post", "operation" => "cancel", "ids" => ["id"], "path" => "fulfillments//cancel.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "fulfillments.json"], + ["http_method" => "post", "operation" => "update_tracking", "ids" => ["id"], "path" => "fulfillments//update_tracking.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Fulfillment|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Fulfillment { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * fulfillment_order_id + * order_id + * @param mixed[] $params Allowed indexes: + * created_at_max, + * created_at_min, + * fields, + * limit, + * since_id, + * updated_at_max, + * updated_at_min + * + * @return Fulfillment[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function cancel( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "cancel", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * notify_customer, + * tracking_info + * @param array|string $body + * + * @return array|null + */ + public function update_tracking( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "update_tracking", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/FulfillmentEvent.php b/src/Rest/Admin2024_04/FulfillmentEvent.php new file mode 100644 index 00000000..3a91df61 --- /dev/null +++ b/src/Rest/Admin2024_04/FulfillmentEvent.php @@ -0,0 +1,131 @@ + Country::class, + "province" => Province::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["order_id", "fulfillment_id", "id"], "path" => "orders//fulfillments//events/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "fulfillment_id"], "path" => "orders//fulfillments//events.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "fulfillment_id", "id"], "path" => "orders//fulfillments//events/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["order_id", "fulfillment_id"], "path" => "orders//fulfillments//events.json"] + ]; + + /** + + * + * @return string + */ + protected static function getJsonBodyName(): string + { + return "event"; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * fulfillment_id + * @param mixed[] $params Allowed indexes: + * event_id + * + * @return FulfillmentEvent|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?FulfillmentEvent { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * fulfillment_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * fulfillment_id + * @param mixed[] $params + * + * @return FulfillmentEvent[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/FulfillmentOrder.php b/src/Rest/Admin2024_04/FulfillmentOrder.php new file mode 100644 index 00000000..e1177eca --- /dev/null +++ b/src/Rest/Admin2024_04/FulfillmentOrder.php @@ -0,0 +1,288 @@ + "get", "operation" => "get", "ids" => ["id"], "path" => "fulfillment_orders/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//fulfillment_orders.json"], + ["http_method" => "post", "operation" => "cancel", "ids" => ["id"], "path" => "fulfillment_orders//cancel.json"], + ["http_method" => "post", "operation" => "close", "ids" => ["id"], "path" => "fulfillment_orders//close.json"], + ["http_method" => "post", "operation" => "hold", "ids" => ["id"], "path" => "fulfillment_orders//hold.json"], + ["http_method" => "post", "operation" => "move", "ids" => ["id"], "path" => "fulfillment_orders//move.json"], + ["http_method" => "post", "operation" => "open", "ids" => ["id"], "path" => "fulfillment_orders//open.json"], + ["http_method" => "post", "operation" => "release_hold", "ids" => ["id"], "path" => "fulfillment_orders//release_hold.json"], + ["http_method" => "post", "operation" => "reschedule", "ids" => ["id"], "path" => "fulfillment_orders//reschedule.json"], + ["http_method" => "post", "operation" => "set_fulfillment_orders_deadline", "ids" => [], "path" => "fulfillment_orders/set_fulfillment_orders_deadline.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * include_financial_summaries, + * include_order_reference_fields + * + * @return FulfillmentOrder|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?FulfillmentOrder { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * include_financial_summaries, + * include_order_reference_fields + * + * @return FulfillmentOrder[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function cancel( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "cancel", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * message + * @param array|string $body + * + * @return array|null + */ + public function close( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "close", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * fulfillment_hold + * @param array|string $body + * + * @return array|null + */ + public function hold( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "hold", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * fulfillment_order + * @param array|string $body + * + * @return array|null + */ + public function move( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "move", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function open( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "open", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function release_hold( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "release_hold", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * new_fulfill_at + * @param array|string $body + * + * @return array|null + */ + public function reschedule( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "reschedule", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * fulfillment_order_ids, + * fulfillment_deadline + * @param array|string $body + * + * @return array|null + */ + public function set_fulfillment_orders_deadline( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "set_fulfillment_orders_deadline", + $this->session, + [], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/FulfillmentRequest.php b/src/Rest/Admin2024_04/FulfillmentRequest.php new file mode 100644 index 00000000..050bd751 --- /dev/null +++ b/src/Rest/Admin2024_04/FulfillmentRequest.php @@ -0,0 +1,91 @@ + "post", "operation" => "accept", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//fulfillment_request/accept.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//fulfillment_request.json"], + ["http_method" => "post", "operation" => "reject", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//fulfillment_request/reject.json"] + ]; + + /** + + * + * @return string[] + */ + protected static function getJsonResponseBodyNames(): array + { + return [ + "submitted_fulfillment_order", + "fulfillment_order" + ]; + } + + /** + * @param mixed[] $params Allowed indexes: + * message + * @param array|string $body + * + * @return array|null + */ + public function accept( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "accept", + $this->session, + ["fulfillment_order_id" => $this->fulfillment_order_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * message, + * reason, + * line_items + * @param array|string $body + * + * @return array|null + */ + public function reject( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "reject", + $this->session, + ["fulfillment_order_id" => $this->fulfillment_order_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/FulfillmentService.php b/src/Rest/Admin2024_04/FulfillmentService.php new file mode 100644 index 00000000..e60a3baa --- /dev/null +++ b/src/Rest/Admin2024_04/FulfillmentService.php @@ -0,0 +1,108 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "fulfillment_services/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "fulfillment_services.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "fulfillment_services/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "fulfillment_services.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "fulfillment_services/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return FulfillmentService|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?FulfillmentService { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * scope + * + * @return FulfillmentService[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/GiftCard.php b/src/Rest/Admin2024_04/GiftCard.php new file mode 100644 index 00000000..eac4d0ab --- /dev/null +++ b/src/Rest/Admin2024_04/GiftCard.php @@ -0,0 +1,176 @@ + Balance::class, + "currency" => Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "gift_cards/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "gift_cards.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "gift_cards/.json"], + ["http_method" => "get", "operation" => "search", "ids" => [], "path" => "gift_cards/search.json"], + ["http_method" => "post", "operation" => "disable", "ids" => ["id"], "path" => "gift_cards//disable.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "gift_cards.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "gift_cards/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return GiftCard|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?GiftCard { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * status, + * limit, + * since_id, + * fields + * + * @return GiftCard[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * order, + * query, + * limit, + * fields, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max + * + * @return array|null + */ + public static function search( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "search", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function disable( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "disable", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/GiftCardAdjustment.php b/src/Rest/Admin2024_04/GiftCardAdjustment.php new file mode 100644 index 00000000..5a26179d --- /dev/null +++ b/src/Rest/Admin2024_04/GiftCardAdjustment.php @@ -0,0 +1,92 @@ + "get", "operation" => "get", "ids" => ["gift_card_id"], "path" => "gift_cards//adjustments.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["gift_card_id", "id"], "path" => "gift_cards//adjustments/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["gift_card_id"], "path" => "gift_cards//adjustments.json"] + ]; + + /** + + * + * @return string + */ + protected static function getJsonBodyName(): string + { + return "adjustment"; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * gift_card_id + * @param mixed[] $params + * + * @return GiftCardAdjustment|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?GiftCardAdjustment { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * gift_card_id + * @param mixed[] $params + * + * @return GiftCardAdjustment[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Image.php b/src/Rest/Admin2024_04/Image.php new file mode 100644 index 00000000..ff9d3f9b --- /dev/null +++ b/src/Rest/Admin2024_04/Image.php @@ -0,0 +1,137 @@ + "delete", "operation" => "delete", "ids" => ["product_id", "id"], "path" => "products//images/.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["product_id"], "path" => "products//images/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id"], "path" => "products//images.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id", "id"], "path" => "products//images/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["product_id"], "path" => "products//images.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["product_id", "id"], "path" => "products//images/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Image|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Image { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params Allowed indexes: + * since_id, + * fields + * + * @return Image[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params Allowed indexes: + * since_id + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/InventoryItem.php b/src/Rest/Admin2024_04/InventoryItem.php new file mode 100644 index 00000000..746bb448 --- /dev/null +++ b/src/Rest/Admin2024_04/InventoryItem.php @@ -0,0 +1,81 @@ + "get", "operation" => "get", "ids" => [], "path" => "inventory_items.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "inventory_items/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "inventory_items/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return InventoryItem|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?InventoryItem { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * ids, + * limit + * + * @return InventoryItem[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/InventoryLevel.php b/src/Rest/Admin2024_04/InventoryLevel.php new file mode 100644 index 00000000..06406139 --- /dev/null +++ b/src/Rest/Admin2024_04/InventoryLevel.php @@ -0,0 +1,160 @@ + "delete", "operation" => "delete", "ids" => [], "path" => "inventory_levels.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "inventory_levels.json"], + ["http_method" => "post", "operation" => "adjust", "ids" => [], "path" => "inventory_levels/adjust.json"], + ["http_method" => "post", "operation" => "connect", "ids" => [], "path" => "inventory_levels/connect.json"], + ["http_method" => "post", "operation" => "set", "ids" => [], "path" => "inventory_levels/set.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * inventory_item_id, + * location_id + * + * @return array|null + */ + public static function delete( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + [], + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * inventory_item_ids, + * location_ids, + * limit, + * updated_at_min + * + * @return InventoryLevel[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param mixed[] $params Allowed indexes: + * inventory_item_id, + * location_id, + * available_adjustment + * @param array|string $body + * + * @return array|null + */ + public function adjust( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "adjust", + $this->session, + [], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * inventory_item_id, + * location_id, + * relocate_if_necessary + * @param array|string $body + * + * @return array|null + */ + public function connect( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "connect", + $this->session, + [], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * inventory_item_id, + * location_id, + * available, + * disconnect_if_necessary + * @param array|string $body + * + * @return array|null + */ + public function set( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "set", + $this->session, + [], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Location.php b/src/Rest/Admin2024_04/Location.php new file mode 100644 index 00000000..28362280 --- /dev/null +++ b/src/Rest/Admin2024_04/Location.php @@ -0,0 +1,136 @@ + "get", "operation" => "count", "ids" => [], "path" => "locations/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "locations.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "locations/.json"], + ["http_method" => "get", "operation" => "inventory_levels", "ids" => ["id"], "path" => "locations//inventory_levels.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return Location|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Location { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return Location[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function inventory_levels( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "inventory_levels", + $session, + array_merge(["id" => $id], $urlIds), + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/LocationsForMove.php b/src/Rest/Admin2024_04/LocationsForMove.php new file mode 100644 index 00000000..b6bb9512 --- /dev/null +++ b/src/Rest/Admin2024_04/LocationsForMove.php @@ -0,0 +1,46 @@ + "get", "operation" => "get", "ids" => ["fulfillment_order_id"], "path" => "fulfillment_orders//locations_for_move.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * fulfillment_order_id + * @param mixed[] $params + * + * @return LocationsForMove[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/MarketingEvent.php b/src/Rest/Admin2024_04/MarketingEvent.php new file mode 100644 index 00000000..18cbf60d --- /dev/null +++ b/src/Rest/Admin2024_04/MarketingEvent.php @@ -0,0 +1,172 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "marketing_events/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "marketing_events/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "marketing_events.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "marketing_events/.json"], + ["http_method" => "post", "operation" => "engagements", "ids" => ["id"], "path" => "marketing_events//engagements.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "marketing_events.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "marketing_events/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return MarketingEvent|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?MarketingEvent { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * offset + * + * @return MarketingEvent[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * occurred_on, + * impressions_count, + * views_count, + * clicks_count, + * shares_count, + * favorites_count, + * comments_count, + * ad_spend, + * is_cumulative + * @param array|string $body + * + * @return array|null + */ + public function engagements( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "engagements", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Metafield.php b/src/Rest/Admin2024_04/Metafield.php new file mode 100644 index 00000000..909b474c --- /dev/null +++ b/src/Rest/Admin2024_04/Metafield.php @@ -0,0 +1,258 @@ + "delete", "operation" => "delete", "ids" => ["article_id", "id"], "path" => "articles//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["collection_id", "id"], "path" => "collections//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["customer_id", "id"], "path" => "customers//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["draft_order_id", "id"], "path" => "draft_orders//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["order_id", "id"], "path" => "orders//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["page_id", "id"], "path" => "pages//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["product_image_id", "id"], "path" => "product_images//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["product_id", "id"], "path" => "products//metafields/.json"], + ["http_method" => "delete", "operation" => "delete", "ids" => ["variant_id", "id"], "path" => "variants//metafields/.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["article_id"], "path" => "articles//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["blog_id"], "path" => "blogs//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["blog_id"], "path" => "blogs//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["collection_id"], "path" => "collections//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["customer_id"], "path" => "customers//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["draft_order_id"], "path" => "draft_orders//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["order_id"], "path" => "orders//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["page_id"], "path" => "pages//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["product_image_id"], "path" => "product_images//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["product_id"], "path" => "products//metafields/count.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["variant_id"], "path" => "variants//metafields/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["article_id"], "path" => "articles//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["article_id", "id"], "path" => "articles//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id"], "path" => "blogs//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id"], "path" => "blogs//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["collection_id"], "path" => "collections//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["collection_id", "id"], "path" => "collections//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["customer_id"], "path" => "customers//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["customer_id", "id"], "path" => "customers//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["draft_order_id"], "path" => "draft_orders//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["draft_order_id", "id"], "path" => "draft_orders//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "id"], "path" => "orders//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["page_id"], "path" => "pages//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["page_id", "id"], "path" => "pages//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_image_id"], "path" => "product_images//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_image_id", "id"], "path" => "product_images//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id"], "path" => "products//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id", "id"], "path" => "products//metafields/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["variant_id"], "path" => "variants//metafields.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["variant_id", "id"], "path" => "variants//metafields/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["article_id"], "path" => "articles//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["blog_id"], "path" => "blogs//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["blog_id"], "path" => "blogs//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["collection_id"], "path" => "collections//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["customer_id"], "path" => "customers//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["draft_order_id"], "path" => "draft_orders//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["order_id"], "path" => "orders//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["page_id"], "path" => "pages//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["product_image_id"], "path" => "product_images//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["product_id"], "path" => "products//metafields.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["variant_id"], "path" => "variants//metafields.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["article_id", "id"], "path" => "articles//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["blog_id", "id"], "path" => "blogs//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["collection_id", "id"], "path" => "collections//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["customer_id", "id"], "path" => "customers//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["draft_order_id", "id"], "path" => "draft_orders//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["order_id", "id"], "path" => "orders//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["page_id", "id"], "path" => "pages//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["product_image_id", "id"], "path" => "product_images//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["product_id", "id"], "path" => "products//metafields/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["variant_id", "id"], "path" => "variants//metafields/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * article_id + * blog_id + * collection_id + * customer_id + * draft_order_id + * order_id + * page_id + * product_image_id + * product_id + * variant_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Metafield|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Metafield { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * article_id + * blog_id + * collection_id + * customer_id + * draft_order_id + * order_id + * page_id + * product_image_id + * product_id + * variant_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * article_id + * blog_id + * collection_id + * customer_id + * draft_order_id + * order_id + * page_id + * product_image_id + * product_id + * variant_id + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * namespace, + * key, + * type, + * fields, + * metafield + * + * @return Metafield[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * article_id + * blog_id + * collection_id + * customer_id + * draft_order_id + * order_id + * page_id + * product_image_id + * product_id + * variant_id + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/MobilePlatformApplication.php b/src/Rest/Admin2024_04/MobilePlatformApplication.php new file mode 100644 index 00000000..d8b06016 --- /dev/null +++ b/src/Rest/Admin2024_04/MobilePlatformApplication.php @@ -0,0 +1,101 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "mobile_platform_applications/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "mobile_platform_applications.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "mobile_platform_applications/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "mobile_platform_applications.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "mobile_platform_applications/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return MobilePlatformApplication|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?MobilePlatformApplication { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return MobilePlatformApplication[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Order.php b/src/Rest/Admin2024_04/Order.php new file mode 100644 index 00000000..cf005a29 --- /dev/null +++ b/src/Rest/Admin2024_04/Order.php @@ -0,0 +1,307 @@ + Customer::class + ]; + protected static array $HAS_MANY = [ + "discount_codes" => DiscountCode::class, + "fulfillments" => Fulfillment::class, + "refunds" => Refund::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "orders/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "orders/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "orders.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "orders/.json"], + ["http_method" => "post", "operation" => "cancel", "ids" => ["id"], "path" => "orders//cancel.json"], + ["http_method" => "post", "operation" => "close", "ids" => ["id"], "path" => "orders//close.json"], + ["http_method" => "post", "operation" => "open", "ids" => ["id"], "path" => "orders//open.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "orders.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "orders/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Order|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Order { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * ids, + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * processed_at_min, + * processed_at_max, + * attribution_app_id, + * status, + * financial_status, + * fulfillment_status, + * fields + * + * @return Order[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * status, + * financial_status, + * fulfillment_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * amount, + * currency, + * restock, + * reason, + * email, + * refund + * @param array|string $body + * + * @return array|null + */ + public function cancel( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "cancel", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function close( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "close", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function open( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "open", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/OrderRisk.php b/src/Rest/Admin2024_04/OrderRisk.php new file mode 100644 index 00000000..2113f156 --- /dev/null +++ b/src/Rest/Admin2024_04/OrderRisk.php @@ -0,0 +1,130 @@ + "delete", "operation" => "delete", "ids" => ["order_id", "id"], "path" => "orders//risks/.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//risks.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "id"], "path" => "orders//risks/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["order_id"], "path" => "orders//risks.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["order_id", "id"], "path" => "orders//risks/.json"] + ]; + + /** + + * + * @return string + */ + protected static function getJsonBodyName(): string + { + return "risk"; + } + + /** + + * + * @return string[] + */ + protected static function getJsonResponseBodyNames(): array + { + return [ + "risk" + ]; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params + * + * @return OrderRisk|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?OrderRisk { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params + * + * @return OrderRisk[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Page.php b/src/Rest/Admin2024_04/Page.php new file mode 100644 index 00000000..7b2114bb --- /dev/null +++ b/src/Rest/Admin2024_04/Page.php @@ -0,0 +1,155 @@ + Metafield::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "pages/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "pages/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "pages.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "pages/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "pages.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "pages/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Page|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Page { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * title, + * handle, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * fields, + * published_status + * + * @return Page[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * title, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Payment.php b/src/Rest/Admin2024_04/Payment.php new file mode 100644 index 00000000..974d7fb1 --- /dev/null +++ b/src/Rest/Admin2024_04/Payment.php @@ -0,0 +1,140 @@ + Transaction::class, + "checkout" => Checkout::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "count", "ids" => ["checkout_id"], "path" => "checkouts//payments/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["checkout_id"], "path" => "checkouts//payments.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["checkout_id", "id"], "path" => "checkouts//payments/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["checkout_id"], "path" => "checkouts//payments.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * checkout_id + * @param mixed[] $params + * + * @return Payment|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Payment { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * checkout_id + * @param mixed[] $params + * + * @return Payment[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * checkout_id + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param string $name + * + * @return mixed + */ + public function __get(string $name): mixed + { + if ($name == "token") { + return $this->checkout ? $this->checkout->token : null; + } + + return parent::__get($name); + } + + /** + * @param string $name + * @param mixed $value + * + * @return void + */ + public function __set( + string $name, + $value + ): void { + if ($name == "token") { + $this->checkout = $this->checkout ?: new Checkout($this->session); + $this->checkout->token = $value; + + return; + } + + parent::__set($name, $value); + } + +} diff --git a/src/Rest/Admin2024_04/PaymentGateway.php b/src/Rest/Admin2024_04/PaymentGateway.php new file mode 100644 index 00000000..c1abedf1 --- /dev/null +++ b/src/Rest/Admin2024_04/PaymentGateway.php @@ -0,0 +1,112 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "payment_gateways/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "payment_gateways.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "payment_gateways/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "payment_gateways.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "payment_gateways/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return PaymentGateway|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?PaymentGateway { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return PaymentGateway[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/PaymentTransaction.php b/src/Rest/Admin2024_04/PaymentTransaction.php new file mode 100644 index 00000000..3bb59bf2 --- /dev/null +++ b/src/Rest/Admin2024_04/PaymentTransaction.php @@ -0,0 +1,71 @@ + Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "transactions", "ids" => [], "path" => "shopify_payments/balance/transactions.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * last_id, + * test, + * payout_id, + * payout_status + * + * @return array|null + */ + public static function transactions( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "transactions", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Payout.php b/src/Rest/Admin2024_04/Payout.php new file mode 100644 index 00000000..b80328e7 --- /dev/null +++ b/src/Rest/Admin2024_04/Payout.php @@ -0,0 +1,78 @@ + "get", "operation" => "get", "ids" => [], "path" => "shopify_payments/payouts.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "shopify_payments/payouts/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return Payout|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Payout { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * last_id, + * date_min, + * date_max, + * date, + * status + * + * @return Payout[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Policy.php b/src/Rest/Admin2024_04/Policy.php new file mode 100644 index 00000000..46a81f1f --- /dev/null +++ b/src/Rest/Admin2024_04/Policy.php @@ -0,0 +1,50 @@ + "get", "operation" => "get", "ids" => [], "path" => "policies.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return Policy[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/PriceRule.php b/src/Rest/Admin2024_04/PriceRule.php new file mode 100644 index 00000000..329e7fd3 --- /dev/null +++ b/src/Rest/Admin2024_04/PriceRule.php @@ -0,0 +1,160 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "price_rules/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "price_rules/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "price_rules.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "price_rules/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "price_rules.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "price_rules/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return PriceRule|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?PriceRule { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * starts_at_min, + * starts_at_max, + * ends_at_min, + * ends_at_max, + * times_used + * + * @return PriceRule[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Product.php b/src/Rest/Admin2024_04/Product.php new file mode 100644 index 00000000..cc8cb101 --- /dev/null +++ b/src/Rest/Admin2024_04/Product.php @@ -0,0 +1,168 @@ + Image::class, + "variants" => Variant::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "products/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "products/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "products.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "products/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "products.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "products/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Product|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Product { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * ids, + * limit, + * since_id, + * title, + * vendor, + * handle, + * product_type, + * status, + * collection_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status, + * fields, + * presentment_currencies + * + * @return Product[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * vendor, + * product_type, + * collection_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/ProductListing.php b/src/Rest/Admin2024_04/ProductListing.php new file mode 100644 index 00000000..950c6255 --- /dev/null +++ b/src/Rest/Admin2024_04/ProductListing.php @@ -0,0 +1,167 @@ + Image::class, + "variants" => Variant::class + ]; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["product_id"], "path" => "product_listings/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "product_listings/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "product_listings.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id"], "path" => "product_listings/.json"], + ["http_method" => "get", "operation" => "product_ids", "ids" => [], "path" => "product_listings/product_ids.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["product_id"], "path" => "product_listings/.json"] + ]; + protected static string $PRIMARY_KEY = "product_id"; + + /** + * @param Session $session + * @param int|string $product_id + * @param array $urlIds + * @param mixed[] $params + * + * @return ProductListing|null + */ + public static function find( + Session $session, + $product_id, + array $urlIds = [], + array $params = [] + ): ?ProductListing { + $result = parent::baseFind( + $session, + array_merge(["product_id" => $product_id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $product_id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $product_id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["product_id" => $product_id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * product_ids, + * limit, + * collection_id, + * updated_at_min, + * handle + * + * @return ProductListing[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit + * + * @return array|null + */ + public static function product_ids( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "product_ids", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/ProductResourceFeedback.php b/src/Rest/Admin2024_04/ProductResourceFeedback.php new file mode 100644 index 00000000..8a7aec39 --- /dev/null +++ b/src/Rest/Admin2024_04/ProductResourceFeedback.php @@ -0,0 +1,65 @@ + "get", "operation" => "get", "ids" => ["product_id"], "path" => "products//resource_feedback.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["product_id"], "path" => "products//resource_feedback.json"] + ]; + + /** + + * + * @return string + */ + protected static function getJsonBodyName(): string + { + return "resource_feedback"; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params + * + * @return ProductResourceFeedback[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Province.php b/src/Rest/Admin2024_04/Province.php new file mode 100644 index 00000000..14926dfd --- /dev/null +++ b/src/Rest/Admin2024_04/Province.php @@ -0,0 +1,108 @@ + "get", "operation" => "count", "ids" => ["country_id"], "path" => "countries//provinces/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["country_id"], "path" => "countries//provinces.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["country_id", "id"], "path" => "countries//provinces/.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["country_id", "id"], "path" => "countries//provinces/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * country_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Province|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Province { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * country_id + * @param mixed[] $params Allowed indexes: + * since_id, + * fields + * + * @return Province[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * country_id + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/RecurringApplicationCharge.php b/src/Rest/Admin2024_04/RecurringApplicationCharge.php new file mode 100644 index 00000000..07f2309c --- /dev/null +++ b/src/Rest/Admin2024_04/RecurringApplicationCharge.php @@ -0,0 +1,140 @@ + Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "delete", "operation" => "delete", "ids" => ["id"], "path" => "recurring_application_charges/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "recurring_application_charges.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "recurring_application_charges/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "recurring_application_charges.json"], + ["http_method" => "put", "operation" => "customize", "ids" => ["id"], "path" => "recurring_application_charges//customize.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return RecurringApplicationCharge|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?RecurringApplicationCharge { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * since_id, + * fields + * + * @return RecurringApplicationCharge[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param mixed[] $params + * @param array|string $body + * + * @return array|null + */ + public function customize( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "put", + "customize", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Redirect.php b/src/Rest/Admin2024_04/Redirect.php new file mode 100644 index 00000000..c4d154e1 --- /dev/null +++ b/src/Rest/Admin2024_04/Redirect.php @@ -0,0 +1,131 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "redirects/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "redirects/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "redirects.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "redirects/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "redirects.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "redirects/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Redirect|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Redirect { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * path, + * target, + * fields + * + * @return Redirect[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * path, + * target + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Refund.php b/src/Rest/Admin2024_04/Refund.php new file mode 100644 index 00000000..265fcaad --- /dev/null +++ b/src/Rest/Admin2024_04/Refund.php @@ -0,0 +1,116 @@ + Transaction::class + ]; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//refunds.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "id"], "path" => "orders//refunds/.json"], + ["http_method" => "post", "operation" => "calculate", "ids" => ["order_id"], "path" => "orders//refunds/calculate.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["order_id"], "path" => "orders//refunds.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * fields, + * in_shop_currency + * + * @return Refund|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Refund { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * limit, + * fields, + * in_shop_currency + * + * @return Refund[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param mixed[] $params Allowed indexes: + * shipping, + * refund_line_items, + * currency + * @param array|string $body + * + * @return array|null + */ + public function calculate( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "post", + "calculate", + $this->session, + ["order_id" => $this->order_id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/ResourceFeedback.php b/src/Rest/Admin2024_04/ResourceFeedback.php new file mode 100644 index 00000000..4e4b6b99 --- /dev/null +++ b/src/Rest/Admin2024_04/ResourceFeedback.php @@ -0,0 +1,52 @@ + "get", "operation" => "get", "ids" => [], "path" => "resource_feedback.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "resource_feedback.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return ResourceFeedback[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/ScriptTag.php b/src/Rest/Admin2024_04/ScriptTag.php new file mode 100644 index 00000000..29f8f75d --- /dev/null +++ b/src/Rest/Admin2024_04/ScriptTag.php @@ -0,0 +1,137 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "script_tags/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "script_tags/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "script_tags.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "script_tags/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "script_tags.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "script_tags/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return ScriptTag|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?ScriptTag { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * created_at_min, + * created_at_max, + * updated_at_min, + * updated_at_max, + * src, + * fields + * + * @return ScriptTag[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * src + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/ShippingZone.php b/src/Rest/Admin2024_04/ShippingZone.php new file mode 100644 index 00000000..034cb435 --- /dev/null +++ b/src/Rest/Admin2024_04/ShippingZone.php @@ -0,0 +1,57 @@ + Country::class, + "provinces" => Province::class + ]; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "shipping_zones.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return ShippingZone[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Shop.php b/src/Rest/Admin2024_04/Shop.php new file mode 100644 index 00000000..4ad41c1b --- /dev/null +++ b/src/Rest/Admin2024_04/Shop.php @@ -0,0 +1,100 @@ + "get", "operation" => "get", "ids" => [], "path" => "shop.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Shop[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/SmartCollection.php b/src/Rest/Admin2024_04/SmartCollection.php new file mode 100644 index 00000000..efc404df --- /dev/null +++ b/src/Rest/Admin2024_04/SmartCollection.php @@ -0,0 +1,178 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "smart_collections/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "smart_collections/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "smart_collections.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "smart_collections/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "smart_collections.json"], + ["http_method" => "put", "operation" => "order", "ids" => ["id"], "path" => "smart_collections//order.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "smart_collections/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return SmartCollection|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?SmartCollection { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * ids, + * since_id, + * title, + * product_id, + * handle, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status, + * fields + * + * @return SmartCollection[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * title, + * product_id, + * updated_at_min, + * updated_at_max, + * published_at_min, + * published_at_max, + * published_status + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + + /** + * @param mixed[] $params Allowed indexes: + * products, + * sort_order + * @param array|string $body + * + * @return array|null + */ + public function order( + array $params = [], + $body = [] + ): ?array { + $response = parent::request( + "put", + "order", + $this->session, + ["id" => $this->id], + $params, + $body, + $this, + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/StorefrontAccessToken.php b/src/Rest/Admin2024_04/StorefrontAccessToken.php new file mode 100644 index 00000000..92b98c01 --- /dev/null +++ b/src/Rest/Admin2024_04/StorefrontAccessToken.php @@ -0,0 +1,76 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "storefront_access_tokens/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "storefront_access_tokens.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "storefront_access_tokens.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return StorefrontAccessToken[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/TenderTransaction.php b/src/Rest/Admin2024_04/TenderTransaction.php new file mode 100644 index 00000000..71d68e00 --- /dev/null +++ b/src/Rest/Admin2024_04/TenderTransaction.php @@ -0,0 +1,60 @@ + "get", "operation" => "get", "ids" => [], "path" => "tender_transactions.json"] + ]; + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * since_id, + * processed_at_min, + * processed_at_max, + * processed_at, + * order + * + * @return TenderTransaction[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Theme.php b/src/Rest/Admin2024_04/Theme.php new file mode 100644 index 00000000..a9032c2b --- /dev/null +++ b/src/Rest/Admin2024_04/Theme.php @@ -0,0 +1,106 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "themes/.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "themes.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "themes/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "themes.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "themes/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Theme|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Theme { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Theme[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/Transaction.php b/src/Rest/Admin2024_04/Transaction.php new file mode 100644 index 00000000..8d9d1249 --- /dev/null +++ b/src/Rest/Admin2024_04/Transaction.php @@ -0,0 +1,126 @@ + "get", "operation" => "count", "ids" => ["order_id"], "path" => "orders//transactions/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id"], "path" => "orders//transactions.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["order_id", "id"], "path" => "orders//transactions/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["order_id"], "path" => "orders//transactions.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * fields, + * in_shop_currency + * + * @return Transaction|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Transaction { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params Allowed indexes: + * since_id, + * fields, + * in_shop_currency + * + * @return Transaction[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * order_id + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/UsageCharge.php b/src/Rest/Admin2024_04/UsageCharge.php new file mode 100644 index 00000000..ee303e58 --- /dev/null +++ b/src/Rest/Admin2024_04/UsageCharge.php @@ -0,0 +1,81 @@ + Currency::class + ]; + protected static array $HAS_MANY = []; + protected static array $PATHS = [ + ["http_method" => "get", "operation" => "get", "ids" => ["recurring_application_charge_id"], "path" => "recurring_application_charges//usage_charges.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["recurring_application_charge_id", "id"], "path" => "recurring_application_charges//usage_charges/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["recurring_application_charge_id"], "path" => "recurring_application_charges//usage_charges.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * recurring_application_charge_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return UsageCharge|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?UsageCharge { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * recurring_application_charge_id + * @param mixed[] $params Allowed indexes: + * fields + * + * @return UsageCharge[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + +} diff --git a/src/Rest/Admin2024_04/User.php b/src/Rest/Admin2024_04/User.php new file mode 100644 index 00000000..de9dd3a6 --- /dev/null +++ b/src/Rest/Admin2024_04/User.php @@ -0,0 +1,108 @@ + "get", "operation" => "current", "ids" => [], "path" => "users/current.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "users.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "users/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return User|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?User { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * limit, + * page_info + * + * @return User[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function current( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "current", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Variant.php b/src/Rest/Admin2024_04/Variant.php new file mode 100644 index 00000000..febe83c1 --- /dev/null +++ b/src/Rest/Admin2024_04/Variant.php @@ -0,0 +1,156 @@ + "delete", "operation" => "delete", "ids" => ["product_id", "id"], "path" => "products//variants/.json"], + ["http_method" => "get", "operation" => "count", "ids" => ["product_id"], "path" => "products//variants/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["product_id"], "path" => "products//variants.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "variants/.json"], + ["http_method" => "post", "operation" => "post", "ids" => ["product_id"], "path" => "products//variants.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "variants/.json"] + ]; + protected static array $READ_ONLY_ATTRIBUTES = [ + "inventory_quantity" + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Variant|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Variant { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params Allowed indexes: + * limit, + * presentment_currencies, + * since_id, + * fields + * + * @return Variant[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + $urlIds, + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds Allowed indexes: + * product_id + * @param mixed[] $params + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + $urlIds, + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/src/Rest/Admin2024_04/Webhook.php b/src/Rest/Admin2024_04/Webhook.php new file mode 100644 index 00000000..63454395 --- /dev/null +++ b/src/Rest/Admin2024_04/Webhook.php @@ -0,0 +1,142 @@ + "delete", "operation" => "delete", "ids" => ["id"], "path" => "webhooks/.json"], + ["http_method" => "get", "operation" => "count", "ids" => [], "path" => "webhooks/count.json"], + ["http_method" => "get", "operation" => "get", "ids" => [], "path" => "webhooks.json"], + ["http_method" => "get", "operation" => "get", "ids" => ["id"], "path" => "webhooks/.json"], + ["http_method" => "post", "operation" => "post", "ids" => [], "path" => "webhooks.json"], + ["http_method" => "put", "operation" => "put", "ids" => ["id"], "path" => "webhooks/.json"] + ]; + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * fields + * + * @return Webhook|null + */ + public static function find( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?Webhook { + $result = parent::baseFind( + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + return !empty($result) ? $result[0] : null; + } + + /** + * @param Session $session + * @param int|string $id + * @param array $urlIds + * @param mixed[] $params + * + * @return array|null + */ + public static function delete( + Session $session, + $id, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "delete", + "delete", + $session, + array_merge(["id" => $id], $urlIds), + $params, + ); + + return $response->getDecodedBody(); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * address, + * created_at_max, + * created_at_min, + * fields, + * limit, + * since_id, + * topic, + * updated_at_min, + * updated_at_max + * + * @return Webhook[] + */ + public static function all( + Session $session, + array $urlIds = [], + array $params = [] + ): array { + return parent::baseFind( + $session, + [], + $params, + ); + } + + /** + * @param Session $session + * @param array $urlIds + * @param mixed[] $params Allowed indexes: + * address, + * topic + * + * @return array|null + */ + public static function count( + Session $session, + array $urlIds = [], + array $params = [] + ): ?array { + $response = parent::request( + "get", + "count", + $session, + [], + $params, + [], + ); + + return $response->getDecodedBody(); + } + +} diff --git a/tests/Rest/Admin2024_04/AbandonedCheckout202404Test.php b/tests/Rest/Admin2024_04/AbandonedCheckout202404Test.php new file mode 100644 index 00000000..cec6cb34 --- /dev/null +++ b/tests/Rest/Admin2024_04/AbandonedCheckout202404Test.php @@ -0,0 +1,228 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + ["created_at_max" => "2013-10-12T07:05:27-02:00"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json?status=closed", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + ["status" => "closed"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json?limit=1", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + ["limit" => "1"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + ["created_at_max" => "2013-10-12T07:05:27-02:00"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkouts" => [["id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => null, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => null, "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "referring_site" => null, "shipping_lines" => [["code" => "Free Shipping", "price" => "0.00", "original_shop_price" => null, "original_rate_price" => null, "original_shop_markup" => null, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => null, "phone" => null, "tax_lines" => null, "custom_tax_lines" => null, "validation_context" => null, "markup" => null, "delivery_category" => null, "carrier_identifier" => null, "carrier_service_id" => null, "api_client_id" => null, "requested_fulfillment_service_id" => null, "applied_discounts" => [], "delivery_option_group_type" => null, "delivery_expectation_range" => null, "delivery_expectation_type" => null, "estimated_delivery_time_range" => null, "id" => "5da41c1738454765"]], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => null, "closed_at" => null, "user_id" => null, "location_id" => null, "source_identifier" => null, "source_url" => null, "device_id" => null, "phone" => null, "customer_locale" => "en", "line_items" => [["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "ead1a659fc5e4010", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"], ["applied_discounts" => [], "discount_allocations" => [["id" => null, "amount" => "19.90", "description" => "TENOFF", "created_at" => null, "application_type" => "discount_code", "discount_class" => "ORDER"]], "key" => "6dbb5d36acbcb38a", "destination_location_id" => null, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => null, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => null, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => null, "vendor" => "Apple", "user_id" => null, "unit_price_measurement" => null, "rank" => null, "compare_at_price" => null, "line_price" => "199.00", "price" => "199.00"]], "name" => "#450789469", "source" => null, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [["code" => "TENOFF", "amount" => "39.80", "type" => "percentage"]], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => null]], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => null, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => null, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json?status=closed", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AbandonedCheckout::checkouts( + $this->test_session, + [], + ["status" => "closed"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/AccessScope202404Test.php b/tests/Rest/Admin2024_04/AccessScope202404Test.php new file mode 100644 index 00000000..4755b18c --- /dev/null +++ b/tests/Rest/Admin2024_04/AccessScope202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["access_scopes" => [["handle" => "read_products"], ["handle" => "write_orders"], ["handle" => "read_orders"]]] + )), + "https://test-shop.myshopify.io/admin/oauth/access_scopes.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AccessScope::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ApplePayCertificate202404Test.php b/tests/Rest/Admin2024_04/ApplePayCertificate202404Test.php new file mode 100644 index 00000000..5aca068f --- /dev/null +++ b/tests/Rest/Admin2024_04/ApplePayCertificate202404Test.php @@ -0,0 +1,176 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["apple_pay_certificate" => ["id" => 1068938278, "status" => "issuing", "merchant_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/apple_pay_certificates.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["apple_pay_certificate" => []]), + ), + ]); + + $apple_pay_certificate = new ApplePayCertificate($this->test_session); + + $apple_pay_certificate->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["apple_pay_certificate" => ["id" => 1068938274, "status" => "csr", "merchant_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/apple_pay_certificates/1068938274.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplePayCertificate::find( + $this->test_session, + 1068938274, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["apple_pay_certificate" => ["id" => 1068938276, "status" => "completed", "merchant_id" => "merchant.something"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/apple_pay_certificates/1068938276.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["apple_pay_certificate" => ["status" => "completed", "merchant_id" => "merchant.something", "encoded_signed_certificate" => "MIIEZzCCBA6gAwIBAgIIWGMideLkDJAwCgYIKoZIzj0EAwIwgYAxNDAyBgNV\nBAMMK0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENBIC0g\nRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMw\nEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0xNDEyMDgyMTMy\nMDBaFw0xNzAxMDYyMTMyMDBaMIGZMSowKAYKCZImiZPyLGQBAQwabWVyY2hh\nbnQuY29tLm5vcm1vcmUuamFzb24xMDAuBgNVBAMMJ01lcmNoYW50IElEOiBt\nZXJjaGFudC5jb20ubm9ybW9yZS5qYXNvbjETMBEGA1UECwwKNVVZMzJOTE5O\nOTEXMBUGA1UECgwOSm9zaHVhIFRlc3NpZXIxCzAJBgNVBAYTAkNBMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEAxDDCvzG6MnsZSJOtbr0hr3MRq+4HzTZ\nx8J4FD34E3kU5CallEnZLBmnzfqmjP8644SO28LLJxvWBnrg7lHFtaOCAlUw\nggJRMEcGCCsGAQUFBwEBBDswOTA3BggrBgEFBQcwAYYraHR0cDovL29jc3Au\nYXBwbGUuY29tL29jc3AwNC1hcHBsZXd3ZHJjYTIwMTAdBgNVHQ4EFgQUkPsO\nKEKvhL/takKomy5GWXtCd8wwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSE\ntoTMOoZichZZlOgao71I3zrfCzCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZI\nhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMg\nY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBv\nZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25k\naXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp\nY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRw\nOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wNgYDVR0f\nBC8wLTAroCmgJ4YlaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGV3d2RyY2Ey\nLmNybDAOBgNVHQ8BAf8EBAMCAygwTwYJKoZIhvdjZAYgBEIMQDM0NTBBMjhB\nOTlGRjIyRkI5OTdDRERFODU1REREOTI5NTE4RjVGMDdBQUM4NzdDMzRCQjM3\nODFCQTg2MzkyNjIwCgYIKoZIzj0EAwIDRwAwRAIgZ/oNx0gCc/PM4pYhOWL2\nCecFQrIgzHr/fZd8qcy3Be8CIEQCaAPpmvQrXEX0hFexoYMHtOHY9dgN2D8L\nNKpVyn3t\n"]]), + ), + ]); + + $apple_pay_certificate = new ApplePayCertificate($this->test_session); + $apple_pay_certificate->id = 1068938276; + $apple_pay_certificate->status = "completed"; + $apple_pay_certificate->merchant_id = "merchant.something"; + $apple_pay_certificate->encoded_signed_certificate = "MIIEZzCCBA6gAwIBAgIIWGMideLkDJAwCgYIKoZIzj0EAwIwgYAxNDAyBgNV\nBAMMK0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENBIC0g\nRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMw\nEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0xNDEyMDgyMTMy\nMDBaFw0xNzAxMDYyMTMyMDBaMIGZMSowKAYKCZImiZPyLGQBAQwabWVyY2hh\nbnQuY29tLm5vcm1vcmUuamFzb24xMDAuBgNVBAMMJ01lcmNoYW50IElEOiBt\nZXJjaGFudC5jb20ubm9ybW9yZS5qYXNvbjETMBEGA1UECwwKNVVZMzJOTE5O\nOTEXMBUGA1UECgwOSm9zaHVhIFRlc3NpZXIxCzAJBgNVBAYTAkNBMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEAxDDCvzG6MnsZSJOtbr0hr3MRq+4HzTZ\nx8J4FD34E3kU5CallEnZLBmnzfqmjP8644SO28LLJxvWBnrg7lHFtaOCAlUw\nggJRMEcGCCsGAQUFBwEBBDswOTA3BggrBgEFBQcwAYYraHR0cDovL29jc3Au\nYXBwbGUuY29tL29jc3AwNC1hcHBsZXd3ZHJjYTIwMTAdBgNVHQ4EFgQUkPsO\nKEKvhL/takKomy5GWXtCd8wwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSE\ntoTMOoZichZZlOgao71I3zrfCzCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZI\nhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMg\nY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBv\nZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25k\naXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp\nY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRw\nOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wNgYDVR0f\nBC8wLTAroCmgJ4YlaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGV3d2RyY2Ey\nLmNybDAOBgNVHQ8BAf8EBAMCAygwTwYJKoZIhvdjZAYgBEIMQDM0NTBBMjhB\nOTlGRjIyRkI5OTdDRERFODU1REREOTI5NTE4RjVGMDdBQUM4NzdDMzRCQjM3\nODFCQTg2MzkyNjIwCgYIKoZIzj0EAwIDRwAwRAIgZ/oNx0gCc/PM4pYhOWL2\nCecFQrIgzHr/fZd8qcy3Be8CIEQCaAPpmvQrXEX0hFexoYMHtOHY9dgN2D8L\nNKpVyn3t\n"; + $apple_pay_certificate->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/apple_pay_certificates/1068938275.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplePayCertificate::delete( + $this->test_session, + 1068938275, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["csr" => ["key" => "YXBwbGUtcGF5LWNzcg==\n"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/apple_pay_certificates/1068938277/csr.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplePayCertificate::csr( + $this->test_session, + 1068938277, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ApplicationCharge202404Test.php b/tests/Rest/Admin2024_04/ApplicationCharge202404Test.php new file mode 100644 index 00000000..1cd4f053 --- /dev/null +++ b/tests/Rest/Admin2024_04/ApplicationCharge202404Test.php @@ -0,0 +1,176 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_charge" => ["id" => 1017262349, "name" => "Super Duper Expensive action", "api_client_id" => 755357713, "price" => "100.00", "status" => "pending", "return_url" => "http://super-duper.shopifyapps.com/", "test" => true, "created_at" => "2024-01-02T09:01:11-05:00", "updated_at" => "2024-01-02T09:01:11-05:00", "currency" => "USD", "charge_type" => null, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1017262349", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1017262349/ApplicationCharge/confirm_application_charge?signature=BAh7BzoHaWRpBA0xojw6EmF1dG9fYWN0aXZhdGVU--baad61b6ba1e9fbbbc4aea9da6f25c2b49058185"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["application_charge" => ["name" => "Super Duper Expensive action", "price" => 100.0, "return_url" => "http://super-duper.shopifyapps.com", "test" => true]]), + ), + ]); + + $application_charge = new ApplicationCharge($this->test_session); + $application_charge->name = "Super Duper Expensive action"; + $application_charge->price = 100.0; + $application_charge->return_url = "http://super-duper.shopifyapps.com"; + $application_charge->test = true; + $application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_charge" => ["id" => 1017262350, "name" => "Super Duper Expensive action", "api_client_id" => 755357713, "price" => "100.00", "status" => "pending", "return_url" => "http://super-duper.shopifyapps.com/", "test" => null, "created_at" => "2024-01-02T09:01:12-05:00", "updated_at" => "2024-01-02T09:01:12-05:00", "currency" => "USD", "charge_type" => null, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1017262350", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1017262350/ApplicationCharge/confirm_application_charge?signature=BAh7BzoHaWRpBA4xojw6EmF1dG9fYWN0aXZhdGVU--dd1c1e6ab75e22d48ed7d8688b95d1240c8c6760"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["application_charge" => ["name" => "Super Duper Expensive action", "price" => 100.0, "return_url" => "http://super-duper.shopifyapps.com"]]), + ), + ]); + + $application_charge = new ApplicationCharge($this->test_session); + $application_charge->name = "Super Duper Expensive action"; + $application_charge->price = 100.0; + $application_charge->return_url = "http://super-duper.shopifyapps.com"; + $application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_charges" => [["id" => 556467234, "name" => "Green theme", "api_client_id" => 755357713, "price" => "120.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "external_id" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "theme", "decorated_return_url" => "http://google.com?charge_id=556467234"], ["id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => null, "decorated_return_url" => "http://google.com?charge_id=675931192"], ["id" => 1017262346, "name" => "Create me a logo", "api_client_id" => 755357713, "price" => "123.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "brokered_service", "decorated_return_url" => "http://google.com?charge_id=1017262346"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_charges.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplicationCharge::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_charges" => [["id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => null, "decorated_return_url" => "http://google.com?charge_id=675931192"], ["id" => 1017262346, "name" => "Create me a logo", "api_client_id" => 755357713, "price" => "123.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "brokered_service", "decorated_return_url" => "http://google.com?charge_id=1017262346"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_charges.json?since_id=556467234", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplicationCharge::all( + $this->test_session, + [], + ["since_id" => "556467234"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_charge" => ["id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "charge_type" => null, "decorated_return_url" => "http://google.com?charge_id=675931192"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_charges/675931192.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplicationCharge::find( + $this->test_session, + 675931192, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ApplicationCredit202404Test.php b/tests/Rest/Admin2024_04/ApplicationCredit202404Test.php new file mode 100644 index 00000000..e0cad74b --- /dev/null +++ b/tests/Rest/Admin2024_04/ApplicationCredit202404Test.php @@ -0,0 +1,89 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_credit" => ["id" => 140583599, "amount" => "5.00", "description" => "credit for application refund", "test" => null, "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_credits/140583599.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplicationCredit::find( + $this->test_session, + 140583599, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["application_credits" => [["id" => 140583599, "amount" => "5.00", "description" => "credit for application refund", "test" => null, "currency" => "USD"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/application_credits.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ApplicationCredit::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Article202404Test.php b/tests/Rest/Admin2024_04/Article202404Test.php new file mode 100644 index 00000000..56bd3247 --- /dev/null +++ b/tests/Rest/Admin2024_04/Article202404Test.php @@ -0,0 +1,717 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["articles" => [["id" => 1051293780, "title" => "Welcome to the world of tomorrow!", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "Good news, everybody!", "blog_id" => 241253187, "author" => "dennis", "user_id" => null, "published_at" => null, "updated_at" => "2024-01-02T08:59:11-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "welcome-to-the-world-of-tomorrow", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293780"], ["id" => 989034056, "title" => "Some crazy article I'm coming up with", "created_at" => "2008-12-31T19:00:00-05:00", "body_html" => "I have no idea what to write about, but it's going to rock!", "blog_id" => 241253187, "author" => "John", "user_id" => null, "published_at" => null, "updated_at" => "2009-01-31T19:00:00-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "some-crazy-article-im-coming-up-with", "tags" => "Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/989034056"], ["id" => 294160202, "title" => "Just us bots here", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "beep boop", "blog_id" => 241253187, "author" => "dennis", "user_id" => null, "published_at" => null, "updated_at" => "2024-01-02T08:59:11-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "just-us-bots-here", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/294160202"], ["id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "blog_id" => 241253187, "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => null, "template_suffix" => null, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::all( + $this->test_session, + ["blog_id" => "241253187"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["articles" => [["id" => 294160202, "title" => "Just us bots here", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "beep boop", "blog_id" => 241253187, "author" => "dennis", "user_id" => null, "published_at" => null, "updated_at" => "2024-01-02T08:59:11-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "just-us-bots-here", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/294160202"], ["id" => 989034056, "title" => "Some crazy article I'm coming up with", "created_at" => "2008-12-31T19:00:00-05:00", "body_html" => "I have no idea what to write about, but it's going to rock!", "blog_id" => 241253187, "author" => "John", "user_id" => null, "published_at" => null, "updated_at" => "2009-01-31T19:00:00-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "some-crazy-article-im-coming-up-with", "tags" => "Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/989034056"], ["id" => 1051293780, "title" => "Welcome to the world of tomorrow!", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "Good news, everybody!", "blog_id" => 241253187, "author" => "dennis", "user_id" => null, "published_at" => null, "updated_at" => "2024-01-02T08:59:11-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "welcome-to-the-world-of-tomorrow", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293780"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json?since_id=134645308", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::all( + $this->test_session, + ["blog_id" => "241253187"], + ["since_id" => "134645308"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 1051293781, "title" => "My new Article title", "created_at" => "2024-01-02T09:02:17-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-01-02T09:02:17-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293781"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011"]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->title = "My new Article title"; + $article->author = "John Smith"; + $article->tags = "This Post, Has Been Tagged"; + $article->body_html = "

I like articles

\n

Yea, I like posting them through REST.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 1051293786, "title" => "My new Article title", "created_at" => "2024-01-02T09:02:30-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-01-02T09:02:30-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293786", "image" => ["created_at" => "2024-01-02T09:02:30-05:00", "alt" => null, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204150"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => ["attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n"]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->title = "My new Article title"; + $article->author = "John Smith"; + $article->tags = "This Post, Has Been Tagged"; + $article->body_html = "

I like articles

\n

Yea, I like posting them through REST.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->image = [ + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n" + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 1051293783, "title" => "My new Article title", "created_at" => "2024-01-02T09:02:21-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-01-02T09:02:21-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293783"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->title = "My new Article title"; + $article->author = "John Smith"; + $article->tags = "This Post, Has Been Tagged"; + $article->body_html = "

I like articles

\n

Yea, I like posting them through REST.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 1051293784, "title" => "My new Article title", "created_at" => "2024-01-02T09:02:23-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-01-02T09:02:23-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293784", "image" => ["created_at" => "2024-01-02T09:02:23-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/rails_logo20240102-28582-kv3dal.gif?v=1704204143"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => ["src" => "http://example.com/rails_logo.gif", "alt" => "Rails logo"]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->title = "My new Article title"; + $article->author = "John Smith"; + $article->tags = "This Post, Has Been Tagged"; + $article->body_html = "

I like articles

\n

Yea, I like posting them through REST.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->image = [ + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails logo" + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 1051293792, "title" => "My new Article title", "created_at" => "2024-01-02T09:02:50-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => null, "updated_at" => "2024-01-02T09:02:50-05:00", "summary_html" => null, "template_suffix" => null, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293792"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published" => false]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->title = "My new Article title"; + $article->author = "John Smith"; + $article->tags = "This Post, Has Been Tagged"; + $article->body_html = "

I like articles

\n

Yea, I like posting them through REST.

"; + $article->published = false; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 4] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::count( + $this->test_session, + ["blog_id" => "241253187"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "blog_id" => 241253187, "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => null, "template_suffix" => null, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::find( + $this->test_session, + 134645308, + ["blog_id" => "241253187"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => null, "template_suffix" => null, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "published_at" => null, "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "updated_at" => "2024-01-02T09:02:24-05:00", "summary_html" => null, "template_suffix" => null, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["published" => false]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->published = false; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "published_at" => "2024-01-02T09:02:43-05:00", "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "updated_at" => "2024-01-02T09:02:43-05:00", "summary_html" => null, "template_suffix" => null, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["published" => true]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->published = true; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "updated_at" => "2024-01-02T09:02:37-05:00", "id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "summary_html" => null, "template_suffix" => null, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["image" => ""]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->image = ""; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "updated_at" => "2024-01-02T09:02:42-05:00", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => null, "summary_html" => null, "template_suffix" => null, "handle" => "get-on-the-train-now", "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T09:02:42-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704204162"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => ["attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->title = "My new Title"; + $article->author = "Your name"; + $article->tags = "Tags, Will Be, Updated"; + $article->body_html = "

Look, I can even update through a web service.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->image = [ + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "handle" => "get-on-the-train-now", "user_id" => null, "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2024-01-02T09:02:39-05:00", "summary_html" => null, "template_suffix" => null, "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011"]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->title = "My new Title"; + $article->author = "Your name"; + $article->tags = "Tags, Will Be, Updated"; + $article->body_html = "

Look, I can even update through a web service.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["article" => ["blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "handle" => "get-on-the-train-now", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => null, "updated_at" => "2024-01-02T09:02:31-05:00", "summary_html" => null, "template_suffix" => null, "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => ["created_at" => "2024-01-02T09:02:31-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/rails_logo20240102-28582-75k4rs.gif?v=1704204151"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["article" => ["title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => ["alt" => "Rails logo"]]]), + ), + ]); + + $article = new Article($this->test_session); + $article->blog_id = 241253187; + $article->id = 134645308; + $article->title = "My new Title"; + $article->author = "Your name"; + $article->tags = "Tags, Will Be, Updated"; + $article->body_html = "

Look, I can even update through a web service.

"; + $article->published_at = "Thu Mar 24 15:45:47 UTC 2011"; + $article->image = [ + "alt" => "Rails logo" + ]; + $article->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/134645308.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::delete( + $this->test_session, + 134645308, + ["blog_id" => "241253187"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["authors" => ["dennis", "John", "Rob", "Dennis"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/authors.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::authors( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tags" => ["Announcing", "Mystery"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/tags.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::tags( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tags" => ["Announcing"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/tags.json?limit=1&popular=1", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::tags( + $this->test_session, + [], + ["limit" => "1", "popular" => "1"], + ); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tags" => ["Announcing", "Mystery"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/tags.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::tags( + $this->test_session, + ["blog_id" => "241253187"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_22(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tags" => ["Announcing"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187/articles/tags.json?limit=1&popular=1", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Article::tags( + $this->test_session, + ["blog_id" => "241253187"], + ["limit" => "1", "popular" => "1"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Asset202404Test.php b/tests/Rest/Admin2024_04/Asset202404Test.php new file mode 100644 index 00000000..c088c650 --- /dev/null +++ b/tests/Rest/Admin2024_04/Asset202404Test.php @@ -0,0 +1,232 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["assets" => [["key" => "layout/theme.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 3252, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/sidebar-devider.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/sidebar-devider.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1016, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-body-pink.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-pink.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1562, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-content.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-content.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 134, "checksum" => null, "theme_id" => 828155753], ["key" => "sections/header_section.liquid", "public_url" => null, "created_at" => "2017-04-28T10:30:00-04:00", "updated_at" => "2017-04-28T10:30:00-04:00", "content_type" => "application/x-liquid", "size" => 998, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/shop.css.liquid", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.css.liquid?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 14675, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/shop.js", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.js?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/javascript", "size" => 348, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-main.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-main.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 297, "checksum" => null, "theme_id" => 828155753], ["key" => "sections/content_section.liquid", "public_url" => null, "created_at" => "2016-02-11T14:31:50-05:00", "updated_at" => "2016-02-11T14:31:50-05:00", "content_type" => "application/x-liquid", "size" => 997, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/page.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 147, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-body-green.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-green.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1542, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/shop.css", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.css?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "text/css", "size" => 14058, "checksum" => null, "theme_id" => 828155753], ["key" => "config/settings_schema.json", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/json", "size" => 4570, "checksum" => null, "theme_id" => 828155753], ["key" => "sections/product_section.liquid", "public_url" => null, "created_at" => "2016-02-14T16:31:41-05:00", "updated_at" => "2016-02-14T16:31:41-05:00", "content_type" => "application/x-liquid", "size" => 2440, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/blog.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 786, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/article.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2486, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/product.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2796, "checksum" => null, "theme_id" => 828155753], ["key" => "sections/footer_section.liquid", "public_url" => null, "created_at" => "2017-04-28T10:30:00-04:00", "updated_at" => "2017-04-28T10:30:00-04:00", "content_type" => "application/x-liquid", "size" => 999, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-footer.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-footer.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1434, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-sidebar.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-sidebar.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 124, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-body-orange.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-orange.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1548, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/collection.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 946, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/sidebar-menu.jpg", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/sidebar-menu.jpg?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/jpeg", "size" => 1609, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/cart.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2047, "checksum" => null, "theme_id" => 828155753], ["key" => "config/settings_data.json", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/json", "size" => 4570, "checksum" => null, "theme_id" => 828155753], ["key" => "templates/index.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 1068, "checksum" => null, "theme_id" => 828155753], ["key" => "assets/bg-body.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1571, "checksum" => null, "theme_id" => 828155753]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Asset::all( + $this->test_session, + ["theme_id" => "828155753"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["asset" => ["key" => "templates/index.liquid", "public_url" => null, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2024-01-02T09:03:26-05:00", "content_type" => "application/x-liquid", "size" => 110, "checksum" => "cd71db2e14df976c8aa44b44c8dae77b", "theme_id" => 828155753]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["asset" => ["key" => "templates/index.liquid", "value" => "

We are busy updating the store for you and will be back within the hour.

"]]), + ), + ]); + + $asset = new Asset($this->test_session); + $asset->theme_id = 828155753; + $asset->key = "templates/index.liquid"; + $asset->value = "

We are busy updating the store for you and will be back within the hour.

"; + $asset->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["asset" => ["key" => "assets/empty.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/empty.gif?v=1704204207", "created_at" => "2024-01-02T09:03:27-05:00", "updated_at" => "2024-01-02T09:03:27-05:00", "content_type" => "image/gif", "size" => 43, "checksum" => "45cf913e5d9d3c9b2058033056d3dd23", "theme_id" => 828155753]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["asset" => ["key" => "assets/empty.gif", "attachment" => "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n"]]), + ), + ]); + + $asset = new Asset($this->test_session); + $asset->theme_id = 828155753; + $asset->key = "assets/empty.gif"; + $asset->attachment = "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n"; + $asset->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["asset" => ["key" => "assets/bg-body.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body.gif?v=1704204204", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2024-01-02T09:03:24-05:00", "content_type" => "image/gif", "size" => 43, "checksum" => "45cf913e5d9d3c9b2058033056d3dd23", "theme_id" => 828155753]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["asset" => ["key" => "assets/bg-body.gif", "src" => "http://example.com/new_bg.gif"]]), + ), + ]); + + $asset = new Asset($this->test_session); + $asset->theme_id = 828155753; + $asset->key = "assets/bg-body.gif"; + $asset->src = "http://example.com/new_bg.gif"; + $asset->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["asset" => ["key" => "layout/alternate.liquid", "public_url" => null, "created_at" => "2024-01-02T09:03:21-05:00", "updated_at" => "2024-01-02T09:03:21-05:00", "content_type" => "application/x-liquid", "size" => 3049, "checksum" => "1879a06996941b2ff1ff485a1fe60a97", "theme_id" => 828155753]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["asset" => ["key" => "layout/alternate.liquid", "source_key" => "layout/theme.liquid"]]), + ), + ]); + + $asset = new Asset($this->test_session); + $asset->theme_id = 828155753; + $asset->key = "layout/alternate.liquid"; + $asset->source_key = "layout/theme.liquid"; + $asset->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["asset" => ["key" => "templates/index.liquid", "public_url" => null, "value" => "\n

Featured Products

\n\n {% tablerow product in collections.frontpage.products cols:3 %}\n {{ product.featured_image | product_img_url: 'small' | img_tag }}\n

{{product.title}}

\n
    \n
  • {{product.price_min | money}}
  • \n
\n {% endtablerow %}\n
\n\n\n{{ content_for_index }}\n\n
\n {% assign article = pages.frontpage %}\n
\n {% if article.content != \"\" %}\n

{{ article.title }}

\n
\n {{ article.content }}\n
\n {% else %}\n
\n In Admin > Blogs & Pages, create a page with the handle frontpage and it will show up here.\n
\n {{ \"Learn more about handles\" | link_to \"http://wiki.shopify.com/Handle\" }}\n
\n {% endif %}\n
\n
\n", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 1068, "checksum" => null, "theme_id" => 828155753]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json?asset%5Bkey%5D=templates%2Findex.liquid", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Asset::all( + $this->test_session, + ["theme_id" => "828155753"], + ["asset" => ["key" => "templates/index.liquid"]], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["message" => "assets/bg-body.gif was successfully deleted"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753/assets.json?asset%5Bkey%5D=assets%2Fbg-body.gif", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Asset::delete( + $this->test_session, + ["theme_id" => "828155753"], + ["asset" => ["key" => "assets/bg-body.gif"]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/AssignedFulfillmentOrder202404Test.php b/tests/Rest/Admin2024_04/AssignedFulfillmentOrder202404Test.php new file mode 100644 index 00000000..d61d841d --- /dev/null +++ b/tests/Rest/Admin2024_04/AssignedFulfillmentOrder202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_orders" => [["id" => 1046000811, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_requested", "status" => "in_progress", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000801, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737552, "shop_id" => 548380009, "fulfillment_order_id" => 1046000811, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/assigned_fulfillment_orders.json?assignment_status=cancellation_requested&location_ids%5B%5D=24826418", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + AssignedFulfillmentOrder::all( + $this->test_session, + [], + ["assignment_status" => "cancellation_requested", "location_ids" => ["24826418"]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Balance202404Test.php b/tests/Rest/Admin2024_04/Balance202404Test.php new file mode 100644 index 00000000..7459e1b2 --- /dev/null +++ b/tests/Rest/Admin2024_04/Balance202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["balance" => [["amount" => "53.99", "currency" => "USD"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/balance.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Balance::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Blog202404Test.php b/tests/Rest/Admin2024_04/Blog202404Test.php new file mode 100644 index 00000000..9b525574 --- /dev/null +++ b/tests/Rest/Admin2024_04/Blog202404Test.php @@ -0,0 +1,358 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blogs" => [["id" => 382285388, "handle" => "banana-blog", "title" => "A Gnu Blog", "updated_at" => "2006-02-02T19:00:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/382285388"], ["id" => 241253187, "handle" => "apple-blog", "title" => "Mah Blog", "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blogs" => [["id" => 382285388, "handle" => "banana-blog", "title" => "A Gnu Blog", "updated_at" => "2006-02-02T19:00:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/382285388"], ["id" => 1008414253, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-01-02T09:12:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T09:12:00-05:00", "template_suffix" => null, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414253"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs.json?since_id=241253187", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::all( + $this->test_session, + [], + ["since_id" => "241253187"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["id" => 1008414249, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-01-02T09:11:50-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T09:11:50-05:00", "template_suffix" => null, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414249"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["blog" => ["title" => "Apple main blog"]]), + ), + ]); + + $blog = new Blog($this->test_session); + $blog->title = "Apple main blog"; + $blog->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["id" => 1008414248, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-01-02T09:11:48-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T09:11:48-05:00", "template_suffix" => null, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414248"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["blog" => ["title" => "Apple main blog", "metafields" => [["key" => "sponsor", "value" => "Shopify", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $blog = new Blog($this->test_session); + $blog->title = "Apple main blog"; + $blog->metafields = [ + [ + "key" => "sponsor", + "value" => "Shopify", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $blog->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["id" => 241253187, "handle" => "apple-blog", "title" => "Mah Blog", "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::find( + $this->test_session, + 241253187, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["id" => 241253187, "title" => "Mah Blog"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json?fields=id%2Ctitle", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::find( + $this->test_session, + 241253187, + [], + ["fields" => "id,title"], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["title" => "Mah Blog", "handle" => "apple-blog", "id" => 241253187, "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["blog" => ["metafields" => [["key" => "sponsor", "value" => "Shopify", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $blog = new Blog($this->test_session); + $blog->id = 241253187; + $blog->metafields = [ + [ + "key" => "sponsor", + "value" => "Shopify", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $blog->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["title" => "IPod Updates", "handle" => "apple-blog", "id" => 241253187, "updated_at" => "2024-01-02T09:11:50-05:00", "commentable" => "no", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["blog" => ["title" => "IPod Updates"]]), + ), + ]); + + $blog = new Blog($this->test_session); + $blog->id = 241253187; + $blog->title = "IPod Updates"; + $blog->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["blog" => ["title" => "IPod Updates", "handle" => "ipod-updates", "commentable" => "moderate", "id" => 241253187, "updated_at" => "2024-01-02T09:12:01-05:00", "feedburner" => null, "feedburner_location" => null, "created_at" => "2024-01-02T08:59:11-05:00", "template_suffix" => null, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["blog" => ["title" => "IPod Updates", "handle" => "ipod-updates", "commentable" => "moderate"]]), + ), + ]); + + $blog = new Blog($this->test_session); + $blog->id = 241253187; + $blog->title = "IPod Updates"; + $blog->handle = "ipod-updates"; + $blog->commentable = "moderate"; + $blog->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/241253187.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Blog::delete( + $this->test_session, + 241253187, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/CancellationRequest202404Test.php b/tests/Rest/Admin2024_04/CancellationRequest202404Test.php new file mode 100644 index 00000000..38acac6d --- /dev/null +++ b/tests/Rest/Admin2024_04/CancellationRequest202404Test.php @@ -0,0 +1,120 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000839, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_requested", "status" => "in_progress", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000823, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737579, "shop_id" => 548380009, "fulfillment_order_id" => 1046000839, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000839/cancellation_request.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["cancellation_request" => ["message" => "The customer changed his mind."]]), + ), + ]); + + $cancellation_request = new CancellationRequest($this->test_session); + $cancellation_request->fulfillment_order_id = 1046000839; + $cancellation_request->message = "The customer changed his mind."; + $cancellation_request->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000840, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_accepted", "status" => "cancelled", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000824, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737580, "shop_id" => 548380009, "fulfillment_order_id" => 1046000840, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000840/cancellation_request/accept.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["cancellation_request" => ["message" => "We had not started any processing yet."]]), + ), + ]); + + $cancellation_request = new CancellationRequest($this->test_session); + $cancellation_request->fulfillment_order_id = 1046000840; + $cancellation_request->accept( + [], + ["cancellation_request" => ["message" => "We had not started any processing yet."]], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000838, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_rejected", "status" => "in_progress", "supported_actions" => [], "destination" => ["id" => 1046000822, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737578, "shop_id" => 548380009, "fulfillment_order_id" => 1046000838, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000838/cancellation_request/reject.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["cancellation_request" => ["message" => "We have already send the shipment out."]]), + ), + ]); + + $cancellation_request = new CancellationRequest($this->test_session); + $cancellation_request->fulfillment_order_id = 1046000838; + $cancellation_request->reject( + [], + ["cancellation_request" => ["message" => "We have already send the shipment out."]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/CarrierService202404Test.php b/tests/Rest/Admin2024_04/CarrierService202404Test.php new file mode 100644 index 00000000..8a74804f --- /dev/null +++ b/tests/Rest/Admin2024_04/CarrierService202404Test.php @@ -0,0 +1,176 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["carrier_service" => ["id" => 1036894960, "name" => "Shipping Rate Provider", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894960", "format" => "json", "callback_url" => "http://shipping.example.com/"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/carrier_services.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["carrier_service" => ["name" => "Shipping Rate Provider", "callback_url" => "http://shipping.example.com", "service_discovery" => true]]), + ), + ]); + + $carrier_service = new CarrierService($this->test_session); + $carrier_service->name = "Shipping Rate Provider"; + $carrier_service->callback_url = "http://shipping.example.com"; + $carrier_service->service_discovery = true; + $carrier_service->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["carrier_services" => [["id" => 1036894957, "name" => "Purolator", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894957", "format" => "json", "callback_url" => "http://example.com/"], ["id" => 260046840, "name" => "ups_shipping", "active" => true, "service_discovery" => true, "carrier_service_type" => "legacy", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/260046840"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/carrier_services.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CarrierService::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["carrier_service" => ["active" => false, "id" => 1036894958, "name" => "Some new name", "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894958", "format" => "json", "callback_url" => "http://example.com/"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/carrier_services/1036894958.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["carrier_service" => ["name" => "Some new name", "active" => false]]), + ), + ]); + + $carrier_service = new CarrierService($this->test_session); + $carrier_service->id = 1036894958; + $carrier_service->name = "Some new name"; + $carrier_service->active = false; + $carrier_service->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["carrier_service" => ["id" => 1036894954, "name" => "Purolator", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894954", "format" => "json", "callback_url" => "http://example.com/"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/carrier_services/1036894954.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CarrierService::find( + $this->test_session, + 1036894954, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/carrier_services/1036894955.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CarrierService::delete( + $this->test_session, + 1036894955, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Checkout202404Test.php b/tests/Rest/Admin2024_04/Checkout202404Test.php new file mode 100644 index 00000000..1e9717e5 --- /dev/null +++ b/tests/Rest/Admin2024_04/Checkout202404Test.php @@ -0,0 +1,361 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2024-01-02T08:56:42-05:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => null, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => null, "legal_notice_url" => null, "location_id" => null, "name" => "#1066348317", "note" => "", "note_attributes" => [], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "995.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "995.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "f6d029d9d85858636669c7c865ab9e0c", "total_price" => "995.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "995.00", "updated_at" => "2024-01-02T08:56:42-05:00", "user_id" => null, "web_url" => "https://jsmith.myshopify.com/548380009/checkouts/f6d029d9d85858636669c7c865ab9e0c", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "72dab3c1ccce1aec9f79e19dd4151bca", "key" => "72dab3c1ccce1aec9f79e19dd4151bca", "product_id" => 632910392, "variant_id" => 39072856, "sku" => "IPOD2008GREEN", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Green", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "995.00", "properties" => [], "quantity" => 5, "grams" => 567, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => null, "shipping_rate" => null, "shipping_address" => null, "credit_card" => null, "billing_address" => null, "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["checkout" => ["line_items" => [["variant_id" => 39072856, "quantity" => 5]]]]), + ), + ]); + + $checkout = new Checkout($this->test_session); + $checkout->line_items = [ + [ + "variant_id" => 39072856, + "quantity" => 5 + ] + ]; + $checkout->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2024-01-02T08:56:54-05:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 1073339456, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "me@example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#1066348318", "note" => "", "note_attributes" => [], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "0.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => false, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "0.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "9f1e4b3471a65b92e7cbc7664bea0294", "total_price" => "0.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "0.00", "updated_at" => "2024-01-02T08:56:54-05:00", "user_id" => null, "web_url" => "https://jsmith.myshopify.com/548380009/checkouts/9f1e4b3471a65b92e7cbc7664bea0294", "total_duties" => null, "total_additional_fees" => null, "line_items" => [], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => null, "shipping_rate" => null, "shipping_address" => null, "credit_card" => null, "billing_address" => null, "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["checkout" => ["email" => "me@example.com"]]), + ), + ]); + + $checkout = new Checkout($this->test_session); + $checkout->email = "me@example.com"; + $checkout->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#86568385", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "0.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => false, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "0.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "b490a9220cd14d7344024f4874f640a6", "total_price" => "0.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "0.00", "updated_at" => "2024-01-02T08:57:11-05:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/b490a9220cd14d7344024f4874f640a6", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => 49148385, "key" => 49148385, "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => false, "gift_card" => false, "price" => "0.00", "compare_at_price" => null, "line_price" => "0.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => null, "shipping_rate" => null, "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => null, "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/b490a9220cd14d7344024f4874f640a6/complete.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $checkout = new Checkout($this->test_session); + $checkout->token = "b490a9220cd14d7344024f4874f640a6"; + $checkout->complete( + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => "2005-07-31T11:57:11-04:00", "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#901414060", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => 450789469, "order_status_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c/thank_you", "order" => ["id" => 450789469, "name" => "#1001", "status_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c/thank_you"], "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => null, "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::find( + $this->test_session, + "bd5a8aa1ecd019dd3520ff791ee3a24c", + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#446514532", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "fraudulent" => false, "transaction" => ["amount" => "598.94", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => null, "status" => "success", "test" => false, "receipt" => ["testcase" => true, "authorization" => "123456"], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"]], "credit_card" => null]], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06]], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => null], "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::find( + $this->test_session, + "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#862052962", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06]], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => null, "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::find( + $this->test_session, + "exuw7apwoycchjuwtiqg8nytfhphr62a", + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#862052962", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-01-02T08:56:58-05:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => null, "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["checkout" => ["shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00"]]]), + ), + ]); + + $checkout = new Checkout($this->test_session); + $checkout->token = "exuw7apwoycchjuwtiqg8nytfhphr62a"; + $checkout->shipping_line = [ + "handle" => "shopify-Free%20Shipping-0.00" + ]; + $checkout->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 1073339457, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "john.smith@example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#862052962", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-01-02T08:57:03-05:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a?key=4a50784c4d35b6f40589ffb5011e1457", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => null, "shipping_rate" => null, "shipping_address" => ["id" => 550558813, "first_name" => "John", "last_name" => "Smith", "phone" => "(123)456-7890", "company" => null, "address1" => "126 York St.", "address2" => "", "city" => "Los Angeles", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "90002"], "credit_card" => null, "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["checkout" => ["email" => "john.smith@example.com", "shipping_address" => ["first_name" => "John", "last_name" => "Smith", "address1" => "126 York St.", "city" => "Los Angeles", "province_code" => "CA", "country_code" => "US", "phone" => "(123)456-7890", "zip" => "90002"]]]), + ), + ]); + + $checkout = new Checkout($this->test_session); + $checkout->token = "exuw7apwoycchjuwtiqg8nytfhphr62a"; + $checkout->email = "john.smith@example.com"; + $checkout->shipping_address = [ + "first_name" => "John", + "last_name" => "Smith", + "address1" => "126 York St.", + "city" => "Los Angeles", + "province_code" => "CA", + "country_code" => "US", + "phone" => "(123)456-7890", + "zip" => "90002" + ]; + $checkout->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shipping_rates" => [["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "checkout" => ["total_tax" => "0.00", "total_price" => "398.00", "subtotal_price" => "398.00"], "phone_required" => false, "delivery_range" => null, "estimated_time_in_transit" => null, "handle" => "shopify-Free%20Shipping-0.00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::shipping_rates( + $this->test_session, + "exuw7apwoycchjuwtiqg8nytfhphr62a", + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shipping_rates" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::shipping_rates( + $this->test_session, + "exuw7apwoycchjuwtiqg8nytfhphr62a", + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shipping_rates" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/zs9ru89kuqcdagk8bz4r9hnxt22wwd42/shipping_rates.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Checkout::shipping_rates( + $this->test_session, + "zs9ru89kuqcdagk8bz4r9hnxt22wwd42", + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Collect202404Test.php b/tests/Rest/Admin2024_04/Collect202404Test.php new file mode 100644 index 00000000..f47f70a5 --- /dev/null +++ b/tests/Rest/Admin2024_04/Collect202404Test.php @@ -0,0 +1,286 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collect" => ["id" => 1071559576, "collection_id" => 841564295, "product_id" => 921728736, "created_at" => "2024-01-02T08:58:05-05:00", "updated_at" => "2024-01-02T08:58:05-05:00", "position" => 2, "sort_value" => "0000000002"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["collect" => ["product_id" => 921728736, "collection_id" => 841564295]]), + ), + ]); + + $collect = new Collect($this->test_session); + $collect->product_id = 921728736; + $collect->collection_id = 841564295; + $collect->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collects" => [["id" => 358268117, "collection_id" => 482865238, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 773559378, "collection_id" => 395646240, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 800915878, "collection_id" => 482865238, "product_id" => 921728736, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collects" => [["id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 1071559575, "collection_id" => 841564295, "product_id" => 921728736, "created_at" => "2024-01-02T08:57:59-05:00", "updated_at" => "2024-01-02T08:57:59-05:00", "position" => 2, "sort_value" => "0000000002"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects.json?collection_id=841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::all( + $this->test_session, + [], + ["collection_id" => "841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collects" => [["id" => 358268117, "collection_id" => 482865238, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"], ["id" => 773559378, "collection_id" => 395646240, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::all( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects/455204334.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::delete( + $this->test_session, + 455204334, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collect" => ["id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => null, "updated_at" => null, "position" => 1, "sort_value" => "0000000001"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects/455204334.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::find( + $this->test_session, + 455204334, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects/count.json?collection_id=841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::count( + $this->test_session, + [], + ["collection_id" => "841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collects/count.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collect::count( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Collection202404Test.php b/tests/Rest/Admin2024_04/Collection202404Test.php new file mode 100644 index 00000000..ca8f2f54 --- /dev/null +++ b/tests/Rest/Admin2024_04/Collection202404Test.php @@ -0,0 +1,90 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collection" => ["id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "products_count" => 1, "collection_type" => "custom", "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/841564295.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collection::find( + $this->test_session, + 841564295, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/841564295/products.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Collection::products( + $this->test_session, + 841564295, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/CollectionListing202404Test.php b/tests/Rest/Admin2024_04/CollectionListing202404Test.php new file mode 100644 index 00000000..6f5429df --- /dev/null +++ b/tests/Rest/Admin2024_04/CollectionListing202404Test.php @@ -0,0 +1,174 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collection_listings" => [["collection_id" => 482865238, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => null, "handle" => "smart-ipods", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"], "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"], ["collection_id" => 841564295, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => null, "handle" => "ipods", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"], "title" => "IPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"], ["collection_id" => 395646240, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever. Again

", "default_product_image" => ["id" => 850703190, "created_at" => "2024-01-02T08:59:11-05:00", "position" => 1, "updated_at" => "2024-01-02T08:59:11-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "width" => 123, "height" => 456], "handle" => "ipods_two", "image" => null, "title" => "IPods Two", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"], ["collection_id" => 691652237, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

No ipods here

", "default_product_image" => null, "handle" => "non-ipods", "image" => null, "title" => "Non Ipods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collection_listings.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CollectionListing::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product_ids" => [632910392]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collection_listings/841564295/product_ids.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CollectionListing::product_ids( + $this->test_session, + 841564295, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collection_listing" => ["collection_id" => 482865238, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => null, "handle" => "smart-ipods", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"], "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collection_listings/482865238.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CollectionListing::find( + $this->test_session, + 482865238, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["collection_listing" => ["collection_id" => 482865238, "updated_at" => "2024-01-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => null, "handle" => "smart-ipods", "image" => ["created_at" => "2024-01-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"], "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collection_listings/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["collection_listing" => []]), + ), + ]); + + $collection_listing = new CollectionListing($this->test_session); + $collection_listing->collection_id = 482865238; + $collection_listing->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collection_listings/841564295.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CollectionListing::delete( + $this->test_session, + 841564295, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Comment202404Test.php b/tests/Rest/Admin2024_04/Comment202404Test.php new file mode 100644 index 00000000..984030a6 --- /dev/null +++ b/tests/Rest/Admin2024_04/Comment202404Test.php @@ -0,0 +1,460 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comments" => [["id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments.json?since_id=118373535", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::all( + $this->test_session, + [], + ["since_id" => "118373535"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comments" => [["id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null], ["id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments.json?article_id=134645308&blog_id=241253187", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::all( + $this->test_session, + [], + ["article_id" => "134645308", "blog_id" => "241253187"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comments" => [["id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null], ["id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments.json?blog_id=241253187", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::all( + $this->test_session, + [], + ["blog_id" => "241253187"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comments" => [["id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null], ["id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/count.json?article_id=134645308&blog_id=241253187", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::count( + $this->test_session, + [], + ["article_id" => "134645308", "blog_id" => "241253187"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/count.json?blog_id=241253187", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::count( + $this->test_session, + [], + ["blog_id" => "241253187"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comment" => ["id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/118373535.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Comment::find( + $this->test_session, + 118373535, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comment" => ["author" => "Your new name", "body" => "You can even update through a web service.", "email" => "your@updated-email.com", "published_at" => "2024-01-02T09:00:35-05:00", "id" => 118373535, "body_html" => "

You can even update through a web service.

", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:35-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/118373535.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["comment" => ["body" => "You can even update through a web service.", "author" => "Your new name", "email" => "your@updated-email.com", "published_at" => "2024-01-02T14:00:35.255Z"]]), + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 118373535; + $comment->body = "You can even update through a web service."; + $comment->author = "Your new name"; + $comment->email = "your@updated-email.com"; + $comment->published_at = "2024-01-02T14:00:35.255Z"; + $comment->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["comment" => ["id" => 757536352, "body" => "I like comments\nAnd I like posting them *RESTfully*.", "body_html" => "

I like comments
\nAnd I like posting them RESTfully.

", "author" => "Your name", "email" => "your@email.com", "status" => "pending", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T09:00:43-05:00", "updated_at" => "2024-01-02T09:00:43-05:00", "ip" => "107.20.160.121", "user_agent" => null, "published_at" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["comment" => ["body" => "I like comments\nAnd I like posting them *RESTfully*.", "author" => "Your name", "email" => "your@email.com", "ip" => "107.20.160.121", "blog_id" => 241253187, "article_id" => 134645308]]), + ), + ]); + + $comment = new Comment($this->test_session); + $comment->body = "I like comments\nAnd I like posting them *RESTfully*."; + $comment->author = "Your name"; + $comment->email = "your@email.com"; + $comment->ip = "107.20.160.121"; + $comment->blog_id = 241253187; + $comment->article_id = 134645308; + $comment->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["published_at" => null, "status" => "spam", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:42-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/653537639/spam.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 653537639; + $comment->spam( + [], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["published_at" => "2024-01-02T09:00:37-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:37-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/653537639/not_spam.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 653537639; + $comment->not_spam( + [], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["published_at" => "2024-01-02T09:00:45-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:45-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/653537639/approve.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 653537639; + $comment->approve( + [], + ); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["published_at" => null, "status" => "removed", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:46-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/653537639/remove.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 653537639; + $comment->remove( + [], + ); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["published_at" => "2024-01-02T09:00:33-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:33-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/comments/653537639/restore.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $comment = new Comment($this->test_session); + $comment->id = 653537639; + $comment->restore( + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Country202404Test.php b/tests/Rest/Admin2024_04/Country202404Test.php new file mode 100644 index 00000000..7dc2077d --- /dev/null +++ b/tests/Rest/Admin2024_04/Country202404Test.php @@ -0,0 +1,257 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["countries" => [["id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [["id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => null, "tax_type" => "harmonized", "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]], ["id" => 359115488, "name" => "Colombia", "code" => "CO", "tax_name" => "VAT", "tax" => 0.15, "provinces" => []], ["id" => 817138619, "name" => "United States", "code" => "US", "tax_name" => "Federal Tax", "tax" => 0.0, "provinces" => [["id" => 952629862, "country_id" => 817138619, "name" => "California", "code" => "CA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => 1039932365, "tax" => 0.05, "tax_percentage" => 5.0], ["id" => 222234158, "country_id" => 817138619, "name" => "Kentucky", "code" => "KY", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => 1039932365, "tax" => 0.06, "tax_percentage" => 6.0], ["id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.065, "tax_percentage" => 6.5], ["id" => 696485510, "country_id" => 817138619, "name" => "Minnesota", "code" => "MN", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.065, "tax_percentage" => 6.5], ["id" => 753050225, "country_id" => 817138619, "name" => "New Jersey", "code" => "NJ", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.06, "tax_percentage" => 6.0], ["id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.04, "tax_percentage" => 4.0], ["id" => 915134533, "country_id" => 817138619, "name" => "Pennsylvania", "code" => "PA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.05, "tax_percentage" => 5.0], ["id" => 591478044, "country_id" => 817138619, "name" => "Rhode Island", "code" => "RI", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Country::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["countries" => [["id" => 817138619, "name" => "United States", "code" => "US", "tax_name" => "Federal Tax", "tax" => 0.0, "provinces" => [["id" => 952629862, "country_id" => 817138619, "name" => "California", "code" => "CA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => 1039932365, "tax" => 0.05, "tax_percentage" => 5.0], ["id" => 222234158, "country_id" => 817138619, "name" => "Kentucky", "code" => "KY", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => 1039932365, "tax" => 0.06, "tax_percentage" => 6.0], ["id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.065, "tax_percentage" => 6.5], ["id" => 696485510, "country_id" => 817138619, "name" => "Minnesota", "code" => "MN", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.065, "tax_percentage" => 6.5], ["id" => 753050225, "country_id" => 817138619, "name" => "New Jersey", "code" => "NJ", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.06, "tax_percentage" => 6.0], ["id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.04, "tax_percentage" => 4.0], ["id" => 915134533, "country_id" => 817138619, "name" => "Pennsylvania", "code" => "PA", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.05, "tax_percentage" => 5.0], ["id" => 591478044, "country_id" => 817138619, "name" => "Rhode Island", "code" => "RI", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0]]], ["id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [["id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => null, "tax_type" => "harmonized", "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries.json?since_id=359115488", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Country::all( + $this->test_session, + [], + ["since_id" => "359115488"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["country" => ["id" => 1070231511, "name" => "France", "code" => "FR", "tax_name" => "TVA", "tax" => 0.2, "provinces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["country" => ["code" => "FR"]]), + ), + ]); + + $country = new Country($this->test_session); + $country->code = "FR"; + $country->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["country" => ["id" => 1070231512, "name" => "France", "code" => "FR", "tax_name" => "TVA", "tax" => 0.2, "provinces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["country" => ["code" => "FR", "tax" => 0.2]]), + ), + ]); + + $country = new Country($this->test_session); + $country->code = "FR"; + $country->tax = 0.2; + $country->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Country::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["country" => ["id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [["id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => null, "tax_type" => "harmonized", "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Country::find( + $this->test_session, + 879921427, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["country" => ["id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [["country_id" => 879921427, "tax_name" => "Tax", "id" => 205434194, "name" => "Alberta", "code" => "AB", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 170405627, "name" => "British Columbia", "code" => "BC", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 342345110, "name" => "Manitoba", "code" => "MB", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 92264567, "name" => "New Brunswick", "code" => "NB", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 243284171, "name" => "Newfoundland", "code" => "NL", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 439598329, "name" => "Northwest Territories", "code" => "NT", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 448070559, "name" => "Nova Scotia", "code" => "NS", "tax_type" => "harmonized", "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 670206421, "name" => "Nunavut", "code" => "NU", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 702530425, "name" => "Ontario", "code" => "ON", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 570891722, "name" => "Prince Edward Island", "code" => "PE", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 473391800, "name" => "Saskatchewan", "code" => "SK", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["country_id" => 879921427, "tax_name" => "Tax", "id" => 1005264686, "name" => "Yukon", "code" => "YT", "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["country" => ["tax" => 0.05]]), + ), + ]); + + $country = new Country($this->test_session); + $country->id = 879921427; + $country->tax = 0.05; + $country->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Country::delete( + $this->test_session, + 879921427, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Currency202404Test.php b/tests/Rest/Admin2024_04/Currency202404Test.php new file mode 100644 index 00000000..2b020025 --- /dev/null +++ b/tests/Rest/Admin2024_04/Currency202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["currencies" => [["currency" => "CAD", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true], ["currency" => "EUR", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true], ["currency" => "JPY", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/currencies.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Currency::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/CustomCollection202404Test.php b/tests/Rest/Admin2024_04/CustomCollection202404Test.php new file mode 100644 index 00000000..8b9fa433 --- /dev/null +++ b/tests/Rest/Admin2024_04/CustomCollection202404Test.php @@ -0,0 +1,665 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collections" => [["id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]], ["id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"], ["id" => 691652237, "handle" => "non-ipods", "title" => "Non Ipods", "updated_at" => "2013-02-01T19:00:00-05:00", "body_html" => "

No ipods here

", "published_at" => "2013-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/691652237"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json?ids=395646240%2C691652237%2C841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::all( + $this->test_session, + [], + ["ids" => "395646240,691652237,841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collections" => [["id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]], ["id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"], ["id" => 691652237, "handle" => "non-ipods", "title" => "Non Ipods", "updated_at" => "2013-02-01T19:00:00-05:00", "body_html" => "

No ipods here

", "published_at" => "2013-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/691652237"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collections" => [["id" => 1063001337, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:30:33-05:00", "body_html" => null, "published_at" => "2024-01-02T09:30:33-05:00", "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001337"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json?since_id=841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::all( + $this->test_session, + [], + ["since_id" => "841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collections" => [["id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]], ["id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::all( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/count.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::count( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "products_count" => 1, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::find( + $this->test_session, + 841564295, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "updated_at" => "2024-01-02T09:30:46-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["collects" => [["product_id" => 921728736, "position" => 1], ["id" => 455204334, "position" => 2]]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->collects = [ + [ + "product_id" => 921728736, + "position" => 1 + ], + [ + "id" => 455204334, + "position" => 2 + ] + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "updated_at" => "2008-02-01T19:00:00-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "published_at" => null, "updated_at" => "2024-01-02T09:30:36-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["published" => false]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->published = false; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "published_at" => "2024-01-02T09:30:25-05:00", "updated_at" => "2024-01-02T09:30:25-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["published" => true]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->published = true; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["body_html" => "

The best selling ipod ever

", "handle" => "ipods", "updated_at" => "2024-01-02T09:30:37-05:00", "id" => 841564295, "sort_order" => "manual", "title" => "IPods", "template_suffix" => null, "published_at" => "2008-02-01T19:00:00-05:00", "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["image" => "", "updated_at" => "2024-01-02T09:30:36-05:00", "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295"]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->image = ""; + $custom_collection->updated_at = "2024-01-02T09:30:36-05:00"; + $custom_collection->title = "IPods"; + $custom_collection->handle = "ipods"; + $custom_collection->body_html = "

The best selling ipod ever

"; + $custom_collection->published_at = "2008-02-01T19:00:00-05:00"; + $custom_collection->sort_order = "manual"; + $custom_collection->template_suffix = null; + $custom_collection->published_scope = "web"; + $custom_collection->admin_graphql_api_id = "gid://shopify/Collection/841564295"; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["updated_at" => "2024-01-02T09:30:21-05:00", "id" => 841564295, "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:30:21-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704205821"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["image" => ["attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "alt" => "Rails logo"]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->image = [ + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", + "alt" => "Rails logo" + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["updated_at" => "2024-01-02T09:30:17-05:00", "id" => 841564295, "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["alt" => "Rails logo", "created_at" => "2024-01-02T09:30:16-05:00", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20240102-28582-3dbsyd.gif?v=1704205817"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["image" => ["alt" => "Rails logo"]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->image = [ + "alt" => "Rails logo" + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["body_html" => "

5000 songs in your pocket

", "title" => "IPods", "handle" => "ipods", "id" => 841564295, "updated_at" => "2024-01-02T09:30:27-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["body_html" => "

5000 songs in your pocket

"]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->id = 841564295; + $custom_collection->body_html = "

5000 songs in your pocket

"; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections/841564295.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomCollection::delete( + $this->test_session, + 841564295, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 1063001330, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-01-02T09:30:23-05:00", "body_html" => null, "published_at" => "2024-01-02T09:30:23-05:00", "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001330"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["title" => "IPods", "collects" => [["product_id" => 921728736]]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->title = "IPods"; + $custom_collection->collects = [ + [ + "product_id" => 921728736 + ] + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 1063001335, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:30:31-05:00", "body_html" => null, "published_at" => "2024-01-02T09:30:31-05:00", "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001335"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["title" => "Macbooks"]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->title = "Macbooks"; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 1063001340, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:30:44-05:00", "body_html" => null, "published_at" => "2024-01-02T09:30:44-05:00", "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001340"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["title" => "Macbooks", "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->title = "Macbooks"; + $custom_collection->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 1063001338, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:30:34-05:00", "body_html" => null, "published_at" => "2024-01-02T09:30:34-05:00", "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001338", "image" => ["created_at" => "2024-01-02T09:30:34-05:00", "alt" => "Rails Logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20240102-28582-cm2doy.gif?v=1704205834"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["title" => "Macbooks", "image" => ["src" => "http://example.com/rails_logo.gif", "alt" => "Rails Logo"]]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->title = "Macbooks"; + $custom_collection->image = [ + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails Logo" + ]; + $custom_collection->save(); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["custom_collection" => ["id" => 1063001329, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:30:19-05:00", "body_html" => null, "published_at" => null, "sort_order" => "best-selling", "template_suffix" => null, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001329"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/custom_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["custom_collection" => ["title" => "Macbooks", "published" => false]]), + ), + ]); + + $custom_collection = new CustomCollection($this->test_session); + $custom_collection->title = "Macbooks"; + $custom_collection->published = false; + $custom_collection->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/Customer202404Test.php b/tests/Rest/Admin2024_04/Customer202404Test.php new file mode 100644 index 00000000..fc59b8ad --- /dev/null +++ b/tests/Rest/Admin2024_04/Customer202404Test.php @@ -0,0 +1,934 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 1073339482, "email" => "steve.lastnameson@example.com", "created_at" => "2024-01-02T09:24:09-05:00", "updated_at" => "2024-01-02T09:24:09-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317315, "customer_id" => 1073339482, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339482", "default_address" => ["id" => 1053317315, "customer_id" => 1073339482, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:23:53-05:00", "updated_at" => "2024-01-02T09:23:53-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:23:53-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json?ids=207119551%2C1073339482", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::all( + $this->test_session, + [], + ["ids" => "207119551,1073339482"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 1073339472, "email" => "steve.lastnameson@example.com", "created_at" => "2024-01-02T09:16:09-05:00", "updated_at" => "2024-01-02T09:16:09-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317305, "customer_id" => 1073339472, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339472", "default_address" => ["id" => 1053317305, "customer_id" => 1073339472, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json?since_id=207119551", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::all( + $this->test_session, + [], + ["since_id" => "207119551"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:26:59-05:00", "updated_at" => "2024-01-02T09:26:59-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:26:59-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json?updated_at_min=2024-01-01+14%3A27%3A15", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::all( + $this->test_session, + [], + ["updated_at_min" => "2024-01-01 14:27:15"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:17:48-05:00", "updated_at" => "2024-01-02T09:17:48-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:17:48-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "tags" => "L\u00E9on, No\u00EBl"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json?fields=id%2Cemail%2Ctags", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::all( + $this->test_session, + [], + ["fields" => "id,email,tags"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:21:37-05:00", "updated_at" => "2024-01-02T09:21:37-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:21:37-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?query=email%3Abob.norman%40mail.example.com", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["query" => "email:bob.norman@mail.example.com"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name&query=last_name%3ANorman", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["fields" => "id, email, first_name, last_name", "query" => "last_name:Norman"], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 1073339474, "email" => "isabella.garcia@example.com", "first_name" => "Isabella", "last_name" => "Garcia", "tags" => "New Customer"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+tags&query=customer_tag%3ANew+Customer", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["fields" => "id, email, first_name, last_name, tags", "query" => "customer_tag:New Customer"], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:13:58-05:00", "updated_at" => "2024-01-02T09:13:58-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:13:58-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?query=first_name%3ABob+country%3AUnited+States", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["query" => "first_name:Bob country:United States"], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:26:43-05:00", "updated_at" => "2024-01-02T09:26:43-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:26:43-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?query=email%3A%2A%40mail.example.com", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["query" => "email:*@mail.example.com"], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customers" => [["id" => 1073339479, "email" => "isabella.garcia@example.com", "first_name" => "Isabella", "last_name" => "Garcia", "verified_email" => true], ["id" => 207119551, "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "verified_email" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+verified_email&query=verified_email%3Atrue", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::search( + $this->test_session, + [], + ["fields" => "id, email, first_name, last_name, verified_email", "query" => "verified_email:true"], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:20:49-05:00", "updated_at" => "2024-01-02T09:20:49-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:20:49-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::find( + $this->test_session, + 207119551, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-01-02T09:24:29-05:00", "updated_at" => "2024-01-02T09:24:29-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "accepts_marketing_updated_at" => "2005-06-12T11:57:11-04:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:24:29-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "accepts_marketing" => true, "created_at" => "2024-01-02T09:13:11-05:00", "updated_at" => "2024-01-02T09:13:26-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "accepts_marketing_updated_at" => "2023-12-30T09:13:25-05:00", "marketing_opt_in_level" => "confirmed_opt_in", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "subscribed", "opt_in_level" => "confirmed_opt_in", "consent_updated_at" => "2023-12-30T09:13:25-05:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:13:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["accepts_marketing" => true, "accepts_marketing_updated_at" => "2023-12-30T09:13:25-05:00", "marketing_opt_in_level" => "confirmed_opt_in"]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->accepts_marketing = true; + $customer->accepts_marketing_updated_at = "2023-12-30T09:13:25-05:00"; + $customer->marketing_opt_in_level = "confirmed_opt_in"; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-01-02T09:25:37-05:00", "updated_at" => "2024-01-02T09:25:37-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "New Customer, Repeat Customer", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "accepts_marketing_updated_at" => "2005-06-12T11:57:11-04:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:25:37-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["tags" => "New Customer, Repeat Customer"]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->tags = "New Customer, Repeat Customer"; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["email" => "changed@example.com", "note" => "Customer is a great guy", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-01-02T09:27:53-05:00", "updated_at" => "2024-01-02T09:28:08-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "accepts_marketing_updated_at" => "2024-01-02T09:28:08-05:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:27:53-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["email" => "changed@example.com", "note" => "Customer is a great guy"]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->email = "changed@example.com"; + $customer->note = "Customer is a great guy"; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::delete( + $this->test_session, + 207119551, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 1073339470, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-01-02T09:12:20-05:00", "updated_at" => "2024-01-02T09:12:20-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "enabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317303, "customer_id" => 1073339470, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "accepts_marketing_updated_at" => "2024-01-02T09:12:20-05:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339470", "default_address" => ["id" => 1053317303, "customer_id" => 1073339470, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [["address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"]], "password" => "newpass", "password_confirmation" => "newpass", "send_email_welcome" => false]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->first_name = "Steve"; + $customer->last_name = "Lastnameson"; + $customer->email = "steve.lastnameson@example.com"; + $customer->phone = "+15142546011"; + $customer->verified_email = true; + $customer->addresses = [ + [ + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + ] + ]; + $customer->password = "newpass"; + $customer->password_confirmation = "newpass"; + $customer->send_email_welcome = false; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 1073339475, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-01-02T09:19:10-05:00", "updated_at" => "2024-01-02T09:19:10-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317308, "customer_id" => 1073339475, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "accepts_marketing_updated_at" => "2024-01-02T09:19:10-05:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339475", "default_address" => ["id" => 1053317308, "customer_id" => 1073339475, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [["address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"]], "send_email_invite" => true]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->first_name = "Steve"; + $customer->last_name = "Lastnameson"; + $customer->email = "steve.lastnameson@example.com"; + $customer->phone = "+15142546011"; + $customer->verified_email = true; + $customer->addresses = [ + [ + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + ] + ]; + $customer->send_email_invite = true; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 1073339484, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-01-02T09:26:43-05:00", "updated_at" => "2024-01-02T09:26:43-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317317, "customer_id" => 1073339484, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "accepts_marketing_updated_at" => "2024-01-02T09:26:43-05:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339484", "default_address" => ["id" => 1053317317, "customer_id" => 1073339484, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [["address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"]], "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->first_name = "Steve"; + $customer->last_name = "Lastnameson"; + $customer->email = "steve.lastnameson@example.com"; + $customer->phone = "+15142546011"; + $customer->verified_email = true; + $customer->addresses = [ + [ + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + ] + ]; + $customer->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer" => ["id" => 1073339476, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-01-02T09:20:33-05:00", "updated_at" => "2024-01-02T09:20:33-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => "+15142546011", "addresses" => [["id" => 1053317309, "customer_id" => 1073339476, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "accepts_marketing_updated_at" => "2024-01-02T09:20:33-05:00", "marketing_opt_in_level" => null, "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null, "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/1073339476", "default_address" => ["id" => 1053317309, "customer_id" => 1073339476, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => null, "address1" => "123 Oak St", "address2" => null, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer" => ["first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [["address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"]]]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->first_name = "Steve"; + $customer->last_name = "Lastnameson"; + $customer->email = "steve.lastnameson@example.com"; + $customer->phone = "+15142546011"; + $customer->verified_email = true; + $customer->addresses = [ + [ + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + ] + ]; + $customer->save(); + } + + /** + + * + * @return void + */ + public function test_22(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["account_activation_url" => "https://jsmith.myshopify.com/account/activate/207119551/56271022a23ff6168cad2270ccbf967d-1704205002"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/account_activation_url.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->account_activation_url( + [], + ); + } + + /** + + * + * @return void + */ + public function test_23(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_invite" => ["to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store", "bcc" => ["j.limited@example.com"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/send_invite.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer_invite" => ["to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "bcc" => ["j.limited@example.com"], "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store"]]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->send_invite( + [], + ["customer_invite" => ["to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "bcc" => ["j.limited@example.com"], "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store"]], + ); + } + + /** + + * + * @return void + */ + public function test_24(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_invite" => ["to" => "bob.norman@mail.example.com", "from" => "j.smith@example.com", "subject" => "Customer account activation", "custom_message" => "", "bcc" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/send_invite.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["customer_invite" => []]), + ), + ]); + + $customer = new Customer($this->test_session); + $customer->id = 207119551; + $customer->send_invite( + [], + ["customer_invite" => []], + ); + } + + /** + + * + * @return void + */ + public function test_25(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_26(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/count.json?updated_at_min=2024-01-01+14%3A20%3A49", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::count( + $this->test_session, + [], + ["updated_at_min" => "2024-01-01 14:20:49"], + ); + } + + /** + + * + * @return void + */ + public function test_27(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/count.json?created_at_min=2024-01-01+14%3A28%3A25", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::count( + $this->test_session, + [], + ["created_at_min" => "2024-01-01 14:28:25"], + ); + } + + /** + + * + * @return void + */ + public function test_28(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:24:45-05:00", "updated_at" => "2024-01-02T09:24:45-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:24:45-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T09:24:45-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T09:24:45-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T09:24:45-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T09:24:45-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/orders.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::orders( + $this->test_session, + 207119551, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_29(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:18:20-05:00", "updated_at" => "2024-01-02T09:18:20-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T09:18:20-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T09:18:20-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T09:18:20-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T09:18:20-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T09:18:20-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/orders.json?status=any", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Customer::orders( + $this->test_session, + 207119551, + [], + ["status" => "any"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/CustomerAddress202404Test.php b/tests/Rest/Admin2024_04/CustomerAddress202404Test.php new file mode 100644 index 00000000..10def8fe --- /dev/null +++ b/tests/Rest/Admin2024_04/CustomerAddress202404Test.php @@ -0,0 +1,303 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses.json?limit=1", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomerAddress::all( + $this->test_session, + ["customer_id" => "207119551"], + ["limit" => "1"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["addresses" => [["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomerAddress::all( + $this->test_session, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/207119551.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomerAddress::find( + $this->test_session, + 207119551, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_address" => ["customer_id" => 207119551, "zip" => "90210", "country" => "United States", "province" => "Kentucky", "city" => "Louisville", "address1" => "Chestnut Street 92", "address2" => "", "first_name" => null, "last_name" => null, "company" => null, "phone" => "555-625-1199", "id" => 207119551, "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["address" => ["zip" => "90210"]]), + ), + ]); + + $customer_address = new CustomerAddress($this->test_session); + $customer_address->customer_id = 207119551; + $customer_address->id = 207119551; + $customer_address->zip = "90210"; + $customer_address->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_address" => ["customer_id" => 207119551, "address1" => "Apartment 23", "address2" => "Chestnut Street 92", "country" => "United States", "province" => "Kentucky", "zip" => "40202", "city" => "Louisville", "first_name" => null, "last_name" => null, "company" => null, "phone" => "555-625-1199", "id" => 207119551, "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/207119551.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["address" => ["address1" => "Apartment 23", "address2" => "Chestnut Street 92"]]), + ), + ]); + + $customer_address = new CustomerAddress($this->test_session); + $customer_address->customer_id = 207119551; + $customer_address->id = 207119551; + $customer_address->address1 = "Apartment 23"; + $customer_address->address2 = "Chestnut Street 92"; + $customer_address->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/1053317322.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + CustomerAddress::delete( + $this->test_session, + 1053317322, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_address" => ["id" => 1053317323, "customer_id" => 207119551, "first_name" => "Samuel", "last_name" => "de Champlain", "company" => "Fancy Co.", "address1" => "1 Rue des Carrieres", "address2" => "Suite 1234", "city" => "Montreal", "province" => "Quebec", "country" => "Canada", "zip" => "G1R 4P5", "phone" => "819-555-5555", "name" => "Samuel de Champlain", "province_code" => "QC", "country_code" => "CA", "country_name" => "Canada", "default" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["address" => ["address1" => "1 Rue des Carrieres", "address2" => "Suite 1234", "city" => "Montreal", "company" => "Fancy Co.", "first_name" => "Samuel", "last_name" => "de Champlain", "phone" => "819-555-5555", "province" => "Quebec", "country" => "Canada", "zip" => "G1R 4P5", "name" => "Samuel de Champlain", "province_code" => "QC", "country_code" => "CA", "country_name" => "Canada"]]), + ), + ]); + + $customer_address = new CustomerAddress($this->test_session); + $customer_address->customer_id = 207119551; + $customer_address->address1 = "1 Rue des Carrieres"; + $customer_address->address2 = "Suite 1234"; + $customer_address->city = "Montreal"; + $customer_address->company = "Fancy Co."; + $customer_address->first_name = "Samuel"; + $customer_address->last_name = "de Champlain"; + $customer_address->phone = "819-555-5555"; + $customer_address->province = "Quebec"; + $customer_address->country = "Canada"; + $customer_address->zip = "G1R 4P5"; + $customer_address->name = "Samuel de Champlain"; + $customer_address->province_code = "QC"; + $customer_address->country_code = "CA"; + $customer_address->country_name = "Canada"; + $customer_address->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/set.json?address_ids%5B%5D=1053317321&operation=destroy", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $customer_address = new CustomerAddress($this->test_session); + $customer_address->customer_id = 207119551; + $customer_address->set( + ["address_ids" => ["1053317321"], "operation" => "destroy"], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["customer_address" => ["id" => 1053317320, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/addresses/1053317320/default.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $customer_address = new CustomerAddress($this->test_session); + $customer_address->customer_id = 207119551; + $customer_address->id = 1053317320; + $customer_address->default( + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/DeprecatedApiCall202404Test.php b/tests/Rest/Admin2024_04/DeprecatedApiCall202404Test.php new file mode 100644 index 00000000..a3fcb459 --- /dev/null +++ b/tests/Rest/Admin2024_04/DeprecatedApiCall202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["data_updated_at" => "2020-10-13T00:15:30Z", "deprecated_api_calls" => [["api_type" => "REST", "description" => "The page filter has been removed from multiple endpoints. Use cursor-based pagination instead.", "documentation_url" => "https://shopify.dev/api/usage/pagination-rest", "endpoint" => "Product", "last_call_at" => "2020-06-12T03:46:18Z", "migration_deadline" => "2020-07-02T13:00:00Z", "graphql_schema_name" => null, "version" => "2019-07"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/deprecated_api_calls.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DeprecatedApiCall::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/DiscountCode202404Test.php b/tests/Rest/Admin2024_04/DiscountCode202404Test.php new file mode 100644 index 00000000..031f1e57 --- /dev/null +++ b/tests/Rest/Admin2024_04/DiscountCode202404Test.php @@ -0,0 +1,289 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_code" => ["id" => 1054381139, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-01-02T08:58:18-05:00", "updated_at" => "2024-01-02T08:58:18-05:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/discount_codes.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["discount_code" => ["code" => "SUMMERSALE10OFF"]]), + ), + ]); + + $discount_code = new DiscountCode($this->test_session); + $discount_code->price_rule_id = 507328175; + $discount_code->code = "SUMMERSALE10OFF"; + $discount_code->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_codes" => [["id" => 507328175, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/discount_codes.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::all( + $this->test_session, + ["price_rule_id" => "507328175"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_code" => ["id" => 507328175, "price_rule_id" => 507328175, "code" => "WINTERSALE20OFF", "usage_count" => 0, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:58:12-05:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/discount_codes/507328175.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["discount_code" => ["code" => "WINTERSALE20OFF"]]), + ), + ]); + + $discount_code = new DiscountCode($this->test_session); + $discount_code->price_rule_id = 507328175; + $discount_code->id = 507328175; + $discount_code->code = "WINTERSALE20OFF"; + $discount_code->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_code" => ["id" => 507328175, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/discount_codes/507328175.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::find( + $this->test_session, + 507328175, + ["price_rule_id" => "507328175"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/discount_codes/507328175.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::delete( + $this->test_session, + 507328175, + ["price_rule_id" => "507328175"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/discount_codes/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_code_creation" => ["id" => 989355119, "price_rule_id" => 507328175, "started_at" => null, "completed_at" => null, "created_at" => "2024-01-02T08:58:20-05:00", "updated_at" => "2024-01-02T08:58:20-05:00", "status" => "queued", "codes_count" => 3, "imported_count" => 0, "failed_count" => 0, "logs" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/batch.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["discount_codes" => [["code" => "SUMMER1"], ["code" => "SUMMER2"], ["code" => "SUMMER3"]]]), + ), + ]); + + $discount_code = new DiscountCode($this->test_session); + $discount_code->price_rule_id = 507328175; + $discount_code->batch( + [], + ["discount_codes" => [["code" => "SUMMER1"], ["code" => "SUMMER2"], ["code" => "SUMMER3"]]], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_code_creation" => ["id" => 173232803, "price_rule_id" => 507328175, "started_at" => null, "completed_at" => null, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "status" => "queued", "codes_count" => 3, "imported_count" => 0, "failed_count" => 0, "logs" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/batch/173232803.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::get_all( + $this->test_session, + ["price_rule_id" => "507328175", "batch_id" => "173232803"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["discount_codes" => [["id" => null, "code" => "foo", "errors" => []], ["id" => null, "code" => "", "errors" => []], ["id" => null, "code" => "bar", "errors" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175/batch/173232803/discount_codes.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DiscountCode::all( + $this->test_session, + ["price_rule_id" => "507328175", "batch_id" => "173232803"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Dispute202404Test.php b/tests/Rest/Admin2024_04/Dispute202404Test.php new file mode 100644 index 00000000..339a787e --- /dev/null +++ b/tests/Rest/Admin2024_04/Dispute202404Test.php @@ -0,0 +1,145 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["disputes" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes.json?initiated_at=2013-05-03", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Dispute::all( + $this->test_session, + [], + ["initiated_at" => "2013-05-03"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["disputes" => [["id" => 1052608616, "order_id" => null, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 815713555, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "credit_not_processed", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 782360659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 670893524, "order_id" => 625362839, "type" => "inquiry", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => null, "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 598735659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 297752803, "order_id" => 625362839, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "lost", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 85190714, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "under_review", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => "2024-01-01T19:00:00-05:00", "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 46484353, "order_id" => 625362839, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "lost", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 35982383, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "subscription_canceled", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Dispute::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["disputes" => [["id" => 1052608616, "order_id" => null, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"], ["id" => 782360659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes.json?status=won", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Dispute::all( + $this->test_session, + [], + ["status" => "won"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["dispute" => ["id" => 598735659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-01-14T19:00:00-05:00", "evidence_sent_on" => null, "finalized_on" => null, "initiated_at" => "2013-05-03T20:00:00-04:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Dispute::find( + $this->test_session, + 598735659, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/DisputeEvidence202404Test.php b/tests/Rest/Admin2024_04/DisputeEvidence202404Test.php new file mode 100644 index 00000000..4549a0b9 --- /dev/null +++ b/tests/Rest/Admin2024_04/DisputeEvidence202404Test.php @@ -0,0 +1,140 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["dispute_evidence" => ["id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => null, "billing_address" => ["id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"], "cancellation_policy_disclosure" => null, "cancellation_rebuttal" => null, "customer_email_address" => "example@shopify.com", "customer_first_name" => "Kermit", "customer_last_name" => "the Frog", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: \$10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => null, "refund_refusal_explanation" => null, "shipping_address" => ["id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"], "uncategorized_text" => "Sample uncategorized text", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:24-04:00", "submitted_by_merchant_on" => null, "fulfillments" => [["shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"], ["shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"]], "dispute_evidence_files" => ["cancellation_policy_file_id" => null, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => null, "service_documentation_file_id" => null, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659/dispute_evidences.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DisputeEvidence::find( + $this->test_session, + 598735659, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["dispute_evidence" => ["id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => null, "billing_address" => ["id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"], "cancellation_policy_disclosure" => null, "cancellation_rebuttal" => null, "customer_email_address" => "example@shopify.com", "customer_first_name" => "Kermit", "customer_last_name" => "the Frog", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: \$10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => null, "refund_refusal_explanation" => null, "shipping_address" => ["id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"], "uncategorized_text" => "Sample uncategorized text", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:26-04:00", "submitted_by_merchant_on" => "2023-10-03T13:19:26-04:00", "fulfillments" => [["shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"], ["shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"]], "dispute_evidence_files" => ["cancellation_policy_file_id" => null, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => null, "service_documentation_file_id" => null, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659/dispute_evidences.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["dispute_evidence" => ["submit_evidence" => true]]), + ), + ]); + + $dispute_evidence = new DisputeEvidence($this->test_session); + $dispute_evidence->dispute_id = 598735659; + $dispute_evidence->submit_evidence = true; + $dispute_evidence->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["dispute_evidence" => ["id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => "https://example.com/access-activity-log", "billing_address" => ["id" => 867402159, "address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "95014"], "cancellation_policy_disclosure" => "https://example.com/cancellation-policy", "cancellation_rebuttal" => "https://example.com/cancellation-rebuttal", "customer_email_address" => "customer@example.com", "customer_first_name" => "John", "customer_last_name" => "Doe", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: \$10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => "https://example.com/refund-policy", "refund_refusal_explanation" => "Product must have receipt of proof of purchase", "shipping_address" => ["id" => 867402159, "address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "95014"], "uncategorized_text" => "Any additional notes", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:24-04:00", "submitted_by_merchant_on" => null, "fulfillments" => [["shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"], ["shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"], ["shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"]], "dispute_evidence_files" => ["cancellation_policy_file_id" => null, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => null, "service_documentation_file_id" => null, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659/dispute_evidences.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["dispute_evidence" => ["access_activity_log" => "https://example.com/access-activity-log", "cancellation_policy_disclosure" => "https://example.com/cancellation-policy", "cancellation_rebuttal" => "https://example.com/cancellation-rebuttal", "customer_email_address" => "customer@example.com", "customer_first_name" => "John", "customer_last_name" => "Doe", "refund_policy_disclosure" => "https://example.com/refund-policy", "refund_refusal_explanation" => "Product must have receipt of proof of purchase", "uncategorized_text" => "Any additional notes", "shipping_address_attributes" => ["address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "zip" => "95014", "country_code" => "US", "province_code" => "CA"], "fulfillments_attributes" => [["shipping_carrier" => "FedEx", "shipping_tracking_number" => 4321, "shipping_date" => "2017-01-02T13:00:00+00:00"]]]]), + ), + ]); + + $dispute_evidence = new DisputeEvidence($this->test_session); + $dispute_evidence->dispute_id = 598735659; + $dispute_evidence->access_activity_log = "https://example.com/access-activity-log"; + $dispute_evidence->cancellation_policy_disclosure = "https://example.com/cancellation-policy"; + $dispute_evidence->cancellation_rebuttal = "https://example.com/cancellation-rebuttal"; + $dispute_evidence->customer_email_address = "customer@example.com"; + $dispute_evidence->customer_first_name = "John"; + $dispute_evidence->customer_last_name = "Doe"; + $dispute_evidence->refund_policy_disclosure = "https://example.com/refund-policy"; + $dispute_evidence->refund_refusal_explanation = "Product must have receipt of proof of purchase"; + $dispute_evidence->uncategorized_text = "Any additional notes"; + $dispute_evidence->shipping_address_attributes = [ + "address1" => "1 Infinite Loop", + "address2" => "Muppet Studio", + "city" => "Cupertino", + "zip" => "95014", + "country_code" => "US", + "province_code" => "CA" + ]; + $dispute_evidence->fulfillments_attributes = [ + [ + "shipping_carrier" => "FedEx", + "shipping_tracking_number" => 4321, + "shipping_date" => "2017-01-02T13:00:00+00:00" + ] + ]; + $dispute_evidence->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/DisputeFileUpload202404Test.php b/tests/Rest/Admin2024_04/DisputeFileUpload202404Test.php new file mode 100644 index 00000000..bd1f15ab --- /dev/null +++ b/tests/Rest/Admin2024_04/DisputeFileUpload202404Test.php @@ -0,0 +1,92 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["dispute_file_upload" => ["id" => 1047018778, "shop_id" => 220006451, "file_size" => 34509, "file_type" => "application/pdf", "original_filename" => "test.pdf", "filename" => "e93db761-74c1-4d3a-9a31-1c98510fee6e.pdf", "created_at" => "2024-01-05T08:50:34-05:00", "updated_at" => "2024-01-05T08:50:34-05:00", "dispute_evidence_id" => 819974671, "dispute_evidence_type" => "uncategorized_file", "url" => "https://unittest.storage.googleapis.com/s/files/1/0002/2000/6451/payments_file_uploads/e93db761-74c1-4d3a-9a31-1c98510fee6e.pdf?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=shopify-core-gcs-test%40shopify-tiers.iam.gserviceaccount.com%2F20200912%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2024-01-05T13:50:34Z&X-Goog-Expires=604800&X-Goog-SignedHeaders=host&response-content-disposition=&X-Goog-Signature=87811646776a232917997f6a4595871d9123629da45d35b2b915e7210eececff55a58147e79ac636861617cc21b5a2f\n 6e5ea6547d9a20e9503e64caca84c9043ecccbf27d20142118017c60d2418edb7896c53eb466335fca\n 9153d8d73c15645962eace819a3588301d55bcbc5b4ecf2225561de914b104e2069daa400e741a59a\n 306d094f7b147c0ae2215f8203e4ce20a907c983a2e4be074c584725bd1c9e399f633499531160dac25\n b34054527795ef5ea48a4ac1d392585d4bc0976d62cab57e18d33547c9110599f39368983e4c88275790\n 0bac1eddcb41b87d4d26269bfe01b0161ef0a81088a0e4d6596380f4d3d37e4e72a8c5fefc6bc07551efb59"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659/dispute_file_uploads.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["dispute_file_upload" => ["document_type" => "uncategorized_file", "filename" => "test.pdf", "mimetype" => "application/pdf", "data" => "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ZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iagoxNTk1MgplbmRvYmoKMjIgMCBvYmoKKExvcmVtIElwc3VtKQplbmRvYmoKMjMgMCBvYmoKKE1hYyBPUyBYIDEwLjEwIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMjQgMCBvYmoKKFNob3BpZnkgSW5jKQplbmRvYmoKMjUgMCBvYmoKKCkKZW5kb2JqCjI2IDAgb2JqCihXb3JkKQplbmRvYmoKMjcgMCBvYmoKKEQ6MjAxNDExMjUyMTM4NDlaMDAnMDAnKQplbmRvYmoKMjggMCBvYmoKKCkKZW5kb2JqCjI5IDAgb2JqClsgKCkgXQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgMjIgMCBSIC9BdXRob3IgMjQgMCBSIC9TdWJqZWN0IDI1IDAgUiAvUHJvZHVjZXIgMjMgMCBSIC9DcmVhdG9yCjI2IDAgUiAvQ3JlYXRpb25EYXRlIDI3IDAgUiAvTW9kRGF0ZSAyNyAwIFIgL0tleXdvcmRzIDI4IDAgUiAvQUFQTDpLZXl3b3JkcwoyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMzM1NzYgMDAwMDAgbiAKMDAwMDAwNjg4NSAwMDAwMCBuIAowMDAwMDA5ODcwIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNjg2NSAwMDAwMCBuIAowMDAwMDA2OTg5IDAwMDAwIG4gCjAwMDAwMDk4MzQgMDAwMDAgbiAKMDAwMDAxNjU4NyAwMDAwMCBuIAowMDAwMDAwMDAwIDAwMDAwIG4gCjAwMDAwMTAwMDMgMDAwMDAgbiAKMDAwMDAwNzA5OCAwMDAwMCBuIAowMDAwMDA5ODEzIDAwMDAwIG4gCjAwMDAwMDk5NTMgMDAwMDAgbiAKMDAwMDAxMDQ5NSAwMDAwMCBuIAowMDAwMDEwMTY2IDAwMDAwIG4gCjAwMDAwMTA0NzUgMDAwMDAgbiAKMDAwMDAxMDczMyAwMDAwMCBuIAowMDAwMDE2NTY2IDAwMDAwIG4gCjAwMDAwMTcwMTQgMDAwMDAgbiAKMDAwMDAxNzI3NCAwMDAwMCBuIAowMDAwMDMzMzE3IDAwMDAwIG4gCjAwMDAwMzMzMzkgMDAwMDAgbiAKMDAwMDAzMzM2OSAwMDAwMCBuIAowMDAwMDMzNDIwIDAwMDAwIG4gCjAwMDAwMzM0NTAgMDAwMDAgbiAKMDAwMDAzMzQ2OSAwMDAwMCBuIAowMDAwMDMzNDkyIDAwMDAwIG4gCjAwMDAwMzM1MzQgMDAwMDAgbiAKMDAwMDAzMzU1MyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDEzIDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8YWFkYjdhZjU5ZjIxNWE0Y2U4Y2QzZWIwYzFiNmNjNTc+CjxhYWRiN2FmNTlmMjE1YTRjZThjZDNlYjBjMWI2Y2M1Nz4gXSA+PgpzdGFydHhyZWYKMzM3NTEKJSVFT0YK"]]), + ), + ]); + + $dispute_file_upload = new DisputeFileUpload($this->test_session); + $dispute_file_upload->dispute_id = 598735659; + $dispute_file_upload->document_type = "uncategorized_file"; + $dispute_file_upload->filename = "test.pdf"; + $dispute_file_upload->mimetype = "application/pdf"; + $dispute_file_upload->data = "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ZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iagoxNTk1MgplbmRvYmoKMjIgMCBvYmoKKExvcmVtIElwc3VtKQplbmRvYmoKMjMgMCBvYmoKKE1hYyBPUyBYIDEwLjEwIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMjQgMCBvYmoKKFNob3BpZnkgSW5jKQplbmRvYmoKMjUgMCBvYmoKKCkKZW5kb2JqCjI2IDAgb2JqCihXb3JkKQplbmRvYmoKMjcgMCBvYmoKKEQ6MjAxNDExMjUyMTM4NDlaMDAnMDAnKQplbmRvYmoKMjggMCBvYmoKKCkKZW5kb2JqCjI5IDAgb2JqClsgKCkgXQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgMjIgMCBSIC9BdXRob3IgMjQgMCBSIC9TdWJqZWN0IDI1IDAgUiAvUHJvZHVjZXIgMjMgMCBSIC9DcmVhdG9yCjI2IDAgUiAvQ3JlYXRpb25EYXRlIDI3IDAgUiAvTW9kRGF0ZSAyNyAwIFIgL0tleXdvcmRzIDI4IDAgUiAvQUFQTDpLZXl3b3JkcwoyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMzM1NzYgMDAwMDAgbiAKMDAwMDAwNjg4NSAwMDAwMCBuIAowMDAwMDA5ODcwIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNjg2NSAwMDAwMCBuIAowMDAwMDA2OTg5IDAwMDAwIG4gCjAwMDAwMDk4MzQgMDAwMDAgbiAKMDAwMDAxNjU4NyAwMDAwMCBuIAowMDAwMDAwMDAwIDAwMDAwIG4gCjAwMDAwMTAwMDMgMDAwMDAgbiAKMDAwMDAwNzA5OCAwMDAwMCBuIAowMDAwMDA5ODEzIDAwMDAwIG4gCjAwMDAwMDk5NTMgMDAwMDAgbiAKMDAwMDAxMDQ5NSAwMDAwMCBuIAowMDAwMDEwMTY2IDAwMDAwIG4gCjAwMDAwMTA0NzUgMDAwMDAgbiAKMDAwMDAxMDczMyAwMDAwMCBuIAowMDAwMDE2NTY2IDAwMDAwIG4gCjAwMDAwMTcwMTQgMDAwMDAgbiAKMDAwMDAxNzI3NCAwMDAwMCBuIAowMDAwMDMzMzE3IDAwMDAwIG4gCjAwMDAwMzMzMzkgMDAwMDAgbiAKMDAwMDAzMzM2OSAwMDAwMCBuIAowMDAwMDMzNDIwIDAwMDAwIG4gCjAwMDAwMzM0NTAgMDAwMDAgbiAKMDAwMDAzMzQ2OSAwMDAwMCBuIAowMDAwMDMzNDkyIDAwMDAwIG4gCjAwMDAwMzM1MzQgMDAwMDAgbiAKMDAwMDAzMzU1MyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDEzIDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8YWFkYjdhZjU5ZjIxNWE0Y2U4Y2QzZWIwYzFiNmNjNTc+CjxhYWRiN2FmNTlmMjE1YTRjZThjZDNlYjBjMWI2Y2M1Nz4gXSA+PgpzdGFydHhyZWYKMzM3NTEKJSVFT0YK"; + $dispute_file_upload->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/disputes/598735659/dispute_file_uploads/799719586.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DisputeFileUpload::delete( + $this->test_session, + 799719586, + ["dispute_id" => "598735659"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/DraftOrder202404Test.php b/tests/Rest/Admin2024_04/DraftOrder202404Test.php new file mode 100644 index 00000000..235d0a47 --- /dev/null +++ b/tests/Rest/Admin2024_04/DraftOrder202404Test.php @@ -0,0 +1,634 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920477, "note" => null, "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:48-05:00", "updated_at" => "2024-01-02T09:10:48-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630382, "variant_id" => null, "product_id" => null, "title" => "Custom Tee", "variant_title" => null, "sku" => null, "vendor" => null, "quantity" => 2, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => null, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630382"]], "shipping_address" => ["first_name" => null, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => null, "address2" => "", "company" => null, "latitude" => null, "longitude" => null, "name" => "", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => null, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => null, "address2" => "", "company" => null, "latitude" => null, "longitude" => null, "name" => "", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/71a3b2c9278fdea9bedb7e0b95656ccc", "applied_discount" => ["description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "10.00", "value_type" => "fixed_amount"], "order_id" => null, "shipping_line" => null, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "30.00", "subtotal_price" => "30.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "40.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "40.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "30.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "30.00", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "30.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "30.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920477", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["title" => "Custom Tee", "price" => "20.00", "quantity" => 2]], "applied_discount" => ["description" => "Custom discount", "value_type" => "fixed_amount", "value" => "10.0", "amount" => "10.00", "title" => "Custom"], "customer" => ["id" => 207119551], "use_customer_default_address" => true]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 2 + ] + ]; + $draft_order->applied_discount = [ + "description" => "Custom discount", + "value_type" => "fixed_amount", + "value" => "10.0", + "amount" => "10.00", + "title" => "Custom" + ]; + $draft_order->customer = [ + "id" => 207119551 + ]; + $draft_order->use_customer_default_address = true; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920479, "note" => null, "email" => null, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:50-05:00", "updated_at" => "2024-01-02T09:10:50-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630384, "variant_id" => null, "product_id" => null, "title" => "Custom Tee", "variant_title" => null, "sku" => null, "vendor" => null, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "0.90"], ["rate" => 0.08, "title" => "Tax", "price" => "1.44"]], "applied_discount" => ["description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "2.00", "value_type" => "percentage"], "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630384"]], "shipping_address" => null, "billing_address" => null, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/e94febf78f1a10336ee6d9324631578c", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "0.90"], ["rate" => 0.08, "title" => "Tax", "price" => "1.44"]], "tags" => "", "note_attributes" => [], "total_price" => "20.34", "subtotal_price" => "18.00", "total_tax" => "2.34", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "20.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "20.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "20.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "20.34", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "18.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "18.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "2.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "2.34", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "2.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "2.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920479"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["title" => "Custom Tee", "price" => "20.00", "quantity" => 1, "applied_discount" => ["description" => "Custom discount", "value_type" => "percentage", "value" => "10.0", "amount" => "2.0", "title" => "Custom"]]]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 1, + "applied_discount" => [ + "description" => "Custom discount", + "value_type" => "percentage", + "value" => "10.0", + "amount" => "2.0", + "title" => "Custom" + ] + ] + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920475, "note" => null, "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:43-05:00", "updated_at" => "2024-01-02T09:10:43-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630380, "variant_id" => null, "product_id" => null, "title" => "Custom Tee", "variant_title" => null, "sku" => null, "vendor" => null, "quantity" => 2, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => null, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630380"]], "shipping_address" => ["first_name" => null, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => null, "address2" => "", "company" => null, "latitude" => null, "longitude" => null, "name" => "", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => null, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => null, "address2" => "", "company" => null, "latitude" => null, "longitude" => null, "name" => "", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/4428445c4fe9ad579aba5483d01bc543", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "40.00", "subtotal_price" => "40.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "40.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "40.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "40.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "40.00", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "40.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "40.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920475", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["title" => "Custom Tee", "price" => "20.00", "quantity" => 2]], "customer" => ["id" => 207119551], "use_customer_default_address" => true]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 2 + ] + ]; + $draft_order->customer = [ + "id" => 207119551 + ]; + $draft_order->use_customer_default_address = true; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920480, "note" => null, "email" => null, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:52-05:00", "updated_at" => "2024-01-02T09:10:52-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630386, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "applied_discount" => null, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630386"]], "shipping_address" => null, "billing_address" => ["first_name" => "Bob", "address1" => "123 Main St", "phone" => "555-555-5555", "city" => "Anytown", "zip" => "A1B2C3", "province" => "Ontario", "country" => "Canada", "last_name" => "Norman", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "Bob Norman", "country_code" => "CA", "province_code" => "ON"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/97f6f75a03ba21b525d331e6ab39471d", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "224.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "224.87", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "25.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "25.87", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920480", "customer" => ["id" => 1073339469, "email" => null, "created_at" => "2024-01-02T09:10:52-05:00", "updated_at" => "2024-01-02T09:10:52-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => null, "tax_exemptions" => [], "email_marketing_consent" => null, "sms_marketing_consent" => null, "admin_graphql_api_id" => "gid://shopify/Customer/1073339469", "default_address" => ["id" => 1053317302, "customer_id" => 1073339469, "first_name" => "Bob", "last_name" => "Norman", "company" => null, "address1" => "123 Main St", "address2" => null, "city" => "Anytown", "province" => null, "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555", "name" => "Bob Norman", "province_code" => null, "country_code" => "CA", "country_name" => "Canada", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]], "billing_address" => ["first_name" => "Bob", "last_name" => "Norman", "address1" => "123 Main St", "city" => "Anytown", "province" => "ON", "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555"]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $draft_order->billing_address = [ + "first_name" => "Bob", + "last_name" => "Norman", + "address1" => "123 Main St", + "city" => "Anytown", + "province" => "ON", + "country" => "Canada", + "zip" => "A1B2C3", + "phone" => "555-555-5555" + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920478, "note" => null, "email" => null, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:49-05:00", "updated_at" => "2024-01-02T09:10:49-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630383, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "applied_discount" => null, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630383"]], "shipping_address" => ["first_name" => "Bob", "address1" => "123 Main St", "phone" => "555-555-5555", "city" => "Anytown", "zip" => "A1B2C3", "province" => "Ontario", "country" => "Canada", "last_name" => "Norman", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "Bob Norman", "country_code" => "CA", "province_code" => "ON"], "billing_address" => null, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/042547bc7babd96e87b1a54f888c263c", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "224.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "224.87", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "25.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "25.87", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920478", "customer" => ["id" => 1073339468, "email" => null, "created_at" => "2024-01-02T09:10:48-05:00", "updated_at" => "2024-01-02T09:10:48-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => null, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "", "last_order_name" => null, "currency" => "USD", "phone" => null, "tax_exemptions" => [], "email_marketing_consent" => null, "sms_marketing_consent" => null, "admin_graphql_api_id" => "gid://shopify/Customer/1073339468", "default_address" => ["id" => 1053317301, "customer_id" => 1073339468, "first_name" => "Bob", "last_name" => "Norman", "company" => null, "address1" => "123 Main St", "address2" => null, "city" => "Anytown", "province" => null, "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555", "name" => "Bob Norman", "province_code" => null, "country_code" => "CA", "country_name" => "Canada", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]], "shipping_address" => ["first_name" => "Bob", "last_name" => "Norman", "address1" => "123 Main St", "city" => "Anytown", "province" => "ON", "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555"]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $draft_order->shipping_address = [ + "first_name" => "Bob", + "last_name" => "Norman", + "address1" => "123 Main St", + "city" => "Anytown", + "province" => "ON", + "country" => "Canada", + "zip" => "A1B2C3", + "phone" => "555-555-5555" + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920481, "note" => null, "email" => null, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:57-05:00", "updated_at" => "2024-01-02T09:10:57-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630387, "variant_id" => null, "product_id" => null, "title" => "Custom Tee", "variant_title" => null, "sku" => null, "vendor" => null, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "0.50"], ["rate" => 0.08, "title" => "Tax", "price" => "0.80"]], "applied_discount" => ["description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "10.00", "value_type" => "fixed_amount"], "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630387"]], "shipping_address" => null, "billing_address" => null, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/0b86f66c5aa866b1727b1c2263a6469a", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "0.50"], ["rate" => 0.08, "title" => "Tax", "price" => "0.80"]], "tags" => "", "note_attributes" => [], "total_price" => "11.30", "subtotal_price" => "10.00", "total_tax" => "1.30", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "20.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "20.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "11.30", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.30", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "1.30", "currency_code" => "USD"], "presentment_money" => ["amount" => "1.30", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920481"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["title" => "Custom Tee", "price" => "20.00", "quantity" => 1, "applied_discount" => ["description" => "Custom discount", "value_type" => "fixed_amount", "value" => "10.0", "amount" => "10.0", "title" => "Custom"]]]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 1, + "applied_discount" => [ + "description" => "Custom discount", + "value_type" => "fixed_amount", + "value" => "10.0", + "amount" => "10.0", + "title" => "Custom" + ] + ] + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 1069920476, "note" => null, "email" => null, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T09:10:47-05:00", "updated_at" => "2024-01-02T09:10:47-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D3", "status" => "open", "line_items" => [["id" => 1066630381, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "applied_discount" => null, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630381"]], "shipping_address" => null, "billing_address" => null, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/1f6cd8830766f66541635bf86efbf290", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [["rate" => 0.05, "title" => "GST", "price" => "9.95"], ["rate" => 0.08, "title" => "Tax", "price" => "15.92"]], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "224.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "224.87", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "25.87", "currency_code" => "USD"], "presentment_money" => ["amount" => "25.87", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920476"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_orders" => [["id" => 72885271, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D1", "status" => "completed", "line_items" => [["id" => 498266019, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 2, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/498266019"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f945c7e2b158dbb69fa642cb8d79171f", "applied_discount" => null, "order_id" => 450789469, "shipping_line" => null, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "408.00", "subtotal_price" => "398.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "398.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "398.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "408.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "408.00", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "398.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "398.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/72885271", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]], ["id" => 622762746, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D1", "status" => "open", "line_items" => [["id" => 466157049, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/466157049"], ["id" => 605833968, "variant_id" => null, "product_id" => null, "title" => "IPod Nano Engraving", "variant_title" => null, "sku" => "IPODENGRAVING", "vendor" => null, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano Engraving", "properties" => [], "custom" => true, "price" => "30.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/605833968"], ["id" => 783764327, "variant_id" => 457924702, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "black", "sku" => "IPOD2008BLACK", "vendor" => null, "quantity" => 3, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/783764327"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f1df1a91d10a6d7704cf2f0315461api", "applied_discount" => null, "order_id" => null, "shipping_line" => ["title" => "custom shipping", "custom" => true, "handle" => null, "price" => "10.00"], "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "836.00", "subtotal_price" => "826.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "826.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "826.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "836.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "836.00", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "826.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "826.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/622762746", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]], ["id" => 691042898, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => "2016-12-31T19:00:00-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => "2016-12-31T19:00:00-05:00", "name" => "#D1", "status" => "completed", "line_items" => [["id" => 158115779, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/158115779"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/56dd92fb7adc1a2c38402b1aab15b2f4", "applied_discount" => null, "order_id" => 450789469, "shipping_line" => ["title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"], "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "209.00", "subtotal_price" => "199.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "209.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "209.00", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/691042898", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]], ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => null, "shipping_line" => ["title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "206.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "206.25", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "194.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "194.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "5.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]], ["id" => 1012750869, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 294997122, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/294997122"]], "shipping_address" => null, "billing_address" => null, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f1df1a91d10a6d7704cf2f0315461noaddressapi", "applied_discount" => null, "order_id" => null, "shipping_line" => null, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "232.88", "subtotal_price" => "199.00", "total_tax" => "23.88", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "232.88", "currency_code" => "USD"], "presentment_money" => ["amount" => "232.88", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "23.88", "currency_code" => "USD"], "presentment_money" => ["amount" => "23.88", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1012750869"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DraftOrder::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:54-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "19.90", "value_type" => "percentage"], "order_id" => null, "shipping_line" => ["title" => "UPS Ground", "custom" => true, "handle" => null, "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "191.35", "subtotal_price" => "179.10", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "191.35", "currency_code" => "USD"], "presentment_money" => ["amount" => "191.35", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "179.10", "currency_code" => "USD"], "presentment_money" => ["amount" => "179.10", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "19.90", "currency_code" => "USD"], "presentment_money" => ["amount" => "19.90", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["applied_discount" => ["description" => "Custom discount", "value_type" => "percentage", "value" => "10.0", "amount" => "19.90", "title" => "Custom"]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->applied_discount = [ + "description" => "Custom discount", + "value_type" => "percentage", + "value" => "10.0", + "amount" => "19.90", + "title" => "Custom" + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "Customer contacted us about a custom engraving on this iPod", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:58-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => null, "shipping_line" => ["title" => "UPS Ground", "custom" => true, "handle" => null, "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "206.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "206.25", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "194.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "194.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "5.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["note" => "Customer contacted us about a custom engraving on this iPod"]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->note = "Customer contacted us about a custom engraving on this iPod"; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:51-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 1066630385, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630385"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => null, "shipping_line" => ["title" => "UPS Ground", "custom" => true, "handle" => null, "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "206.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "206.25", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "194.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "194.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "5.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]]]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $draft_order->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => null, "name" => "#D2", "status" => "open", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => null, "shipping_line" => ["title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DraftOrder::find( + $this->test_session, + 994118539, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DraftOrder::delete( + $this->test_session, + 994118539, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 5] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + DraftOrder::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order_invoice" => ["to" => "first@example.com", "from" => "j.smith@example.com", "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!", "bcc" => ["j.smith@example.com"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539/send_invoice.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order_invoice" => ["to" => "first@example.com", "from" => "j.smith@example.com", "bcc" => ["j.smith@example.com"], "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!"]]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->send_invoice( + [], + ["draft_order_invoice" => ["to" => "first@example.com", "from" => "j.smith@example.com", "bcc" => ["j.smith@example.com"], "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!"]], + ); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order_invoice" => ["to" => "bob.norman@mail.example.com", "from" => "\"John Smith Test Store\" ", "subject" => "Draft Order #D2", "custom_message" => "", "bcc" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539/send_invoice.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["draft_order_invoice" => []]), + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->send_invoice( + [], + ["draft_order_invoice" => []], + ); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:39-05:00", "tax_exempt" => false, "completed_at" => "2024-01-02T09:10:39-05:00", "name" => "#D2", "status" => "completed", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => 1073459985, "shipping_line" => ["title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "206.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "206.25", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "194.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "194.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "5.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:40-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 2, "state" => "disabled", "total_spent" => "405.90", "last_order_id" => 1073459985, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1002", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 1053317299, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "+1(502)-459-2181", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539/complete.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->complete( + [], + ); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["draft_order" => ["id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:42-05:00", "tax_exempt" => false, "completed_at" => "2024-01-02T09:10:42-05:00", "name" => "#D2", "status" => "completed", "line_items" => [["id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => null, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => null, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => ["description" => "\$5promo", "value" => "5.0", "title" => null, "amount" => "5.00", "value_type" => "fixed_amount"], "order_id" => 1073459986, "shipping_line" => ["title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"], "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_price_set" => ["shop_money" => ["amount" => "206.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "206.25", "currency_code" => "USD"]], "subtotal_price_set" => ["shop_money" => ["amount" => "194.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "194.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_discounts_set" => ["shop_money" => ["amount" => "5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "5.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "12.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "12.25", "currency_code" => "USD"]], "total_additional_fees_set" => null, "total_duties_set" => null, "payment_terms" => null, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:42-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 2, "state" => "disabled", "total_spent" => "405.90", "last_order_id" => 1073459986, "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1002", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 1053317300, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "+1(502)-459-2181", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/994118539/complete.json?payment_pending=true", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $draft_order = new DraftOrder($this->test_session); + $draft_order->id = 994118539; + $draft_order->complete( + ["payment_pending" => "true"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Event202404Test.php b/tests/Rest/Admin2024_04/Event202404Test.php new file mode 100644 index 00000000..4b97db28 --- /dev/null +++ b/tests/Rest/Admin2024_04/Event202404Test.php @@ -0,0 +1,341 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => null, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"], ["id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => null, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"], ["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 103105390, "subject_id" => 450789469, "created_at" => "2008-01-10T05:00:00-05:00", "subject_type" => "Order", "verb" => "authorization_success", "arguments" => ["389404469", "210.94", "USD"], "body" => null, "message" => "A transaction was authorized.", "author" => "Shopify", "description" => "A transaction was authorized.", "path" => "/admin/orders/450789469"], ["id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => null, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"], ["id" => 852065041, "subject_id" => 450789469, "created_at" => "2008-01-10T09:00:00-05:00", "subject_type" => "Order", "verb" => "placed", "arguments" => [], "body" => null, "message" => "This order was created for Bob Norman from draft order #D1.", "author" => "Shopify", "description" => "This order was created for Bob Norman from draft order #D1.", "path" => "/admin/orders/450789469"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/events.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => null, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"], ["id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => null, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"], ["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events.json?filter=Product%2COrder", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + [], + ["filter" => "Product,Order"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events.json?filter=Product&verb=destroy", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + [], + ["filter" => "Product", "verb" => "destroy"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events.json?created_at_min=2008-01-10+12%3A30%3A00%2B00%3A00", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + [], + ["created_at_min" => "2008-01-10 12:30:00+00:00"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => null, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"], ["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events.json?since_id=164748010", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + [], + ["since_id" => "164748010"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/921728736/events.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + ["product_id" => "921728736"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["events" => [["id" => 852065041, "subject_id" => 450789469, "created_at" => "2008-01-10T09:00:00-05:00", "subject_type" => "Order", "verb" => "placed", "arguments" => [], "body" => null, "message" => "This order was created for Bob Norman from draft order #D1.", "author" => "Shopify", "description" => "This order was created for Bob Norman from draft order #D1.", "path" => "/admin/orders/450789469"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/events.json?limit=1&since_id=164748010", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::all( + $this->test_session, + ["order_id" => "450789469"], + ["limit" => "1", "since_id" => "164748010"], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["event" => ["id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => null, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events/677313116.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::find( + $this->test_session, + 677313116, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/events/count.json?created_at_min=2008-01-10T13%3A00%3A00%2B00%3A00", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Event::count( + $this->test_session, + [], + ["created_at_min" => "2008-01-10T13:00:00+00:00"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Fulfillment202404Test.php b/tests/Rest/Admin2024_04/Fulfillment202404Test.php new file mode 100644 index 00000000..da15bd78 --- /dev/null +++ b/tests/Rest/Admin2024_04/Fulfillment202404Test.php @@ -0,0 +1,441 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillments" => [["id" => 255858046, "order_id" => 450789469, "status" => "failure", "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T08:59:11-05:00", "tracking_company" => "USPS", "shipment_status" => null, "location_id" => 655441491, "origin_address" => null, "line_items" => [["id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.34", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]]]], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "duties" => [], "tax_lines" => [["price" => "3.98", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "channel_liable" => null]], "fulfillment_line_item_id" => 225088298]], "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "receipt" => ["testcase" => true, "authorization" => "123456"], "name" => "#1001.0", "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Fulfillment::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillments" => [["id" => 1069019863, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:01:34-05:00", "service" => "shipwire-app", "updated_at" => "2024-01-02T09:01:34-05:00", "tracking_company" => "TNT", "shipment_status" => null, "location_id" => 24826418, "origin_address" => null, "line_items" => [["id" => 518995019, "variant_id" => 49148385, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008RED", "variant_title" => "red", "vendor" => null, "fulfillment_service" => "shipwire-app", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - red", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.33", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]]]], "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "duties" => [], "tax_lines" => [["price" => "3.98", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "channel_liable" => null]], "fulfillment_line_item_id" => 952525844]], "tracking_number" => "123456789", "tracking_numbers" => ["123456789"], "tracking_url" => "https://www.tnt.com/express/en_us/site/tracking.html?searchType=con&cons=123456789", "tracking_urls" => ["https://www.tnt.com/express/en_us/site/tracking.html?searchType=con&cons=123456789"], "receipt" => [], "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019863"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments.json?since_id=255858046", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Fulfillment::all( + $this->test_session, + ["order_id" => "450789469"], + ["since_id" => "255858046"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillments" => [["id" => 1069019876, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T08:59:11-05:00", "tracking_company" => "UPS", "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823182, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823182", "tax_lines" => []]], "tracking_number" => "#\u26201\u2622\n---\n4321\n", "tracking_numbers" => ["#\u26201\u2622\n---\n4321\n"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321"], "receipt" => [], "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019876"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000799/fulfillments.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Fulfillment::all( + $this->test_session, + ["fulfillment_order_id" => "1046000799"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Fulfillment::count( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 255858046, "order_id" => 450789469, "status" => "failure", "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T08:59:11-05:00", "tracking_company" => "USPS", "shipment_status" => null, "location_id" => 655441491, "origin_address" => null, "line_items" => [["id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.34", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]], "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "receipt" => ["testcase" => true, "authorization" => "123456"], "name" => "#1001.0", "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/255858046.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Fulfillment::find( + $this->test_session, + 255858046, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 1069019884, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:02:00-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:02:00-05:00", "tracking_company" => null, "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823187, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823187", "tax_lines" => []]], "tracking_number" => "MS1562678", "tracking_numbers" => ["MS1562678"], "tracking_url" => "https://www.my-shipping-company.com?tracking_number=MS1562678", "tracking_urls" => ["https://www.my-shipping-company.com?tracking_number=MS1562678"], "receipt" => [], "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019884"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["line_items_by_fulfillment_order" => [["fulfillment_order_id" => 1046000805]], "tracking_info" => ["number" => "MS1562678", "url" => "https://www.my-shipping-company.com?tracking_number=MS1562678"]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->line_items_by_fulfillment_order = [ + [ + "fulfillment_order_id" => 1046000805 + ] + ]; + $fulfillment->tracking_info = [ + "number" => "MS1562678", + "url" => "https://www.my-shipping-company.com?tracking_number=MS1562678" + ]; + $fulfillment->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 1069019879, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:01:55-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:55-05:00", "tracking_company" => "UPS", "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823185, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823185", "tax_lines" => []]], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => [], "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019879"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["line_items_by_fulfillment_order" => [["fulfillment_order_id" => 1046000801]], "tracking_info" => ["number" => "1Z001985YW99744790"]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->line_items_by_fulfillment_order = [ + [ + "fulfillment_order_id" => 1046000801 + ] + ]; + $fulfillment->tracking_info = [ + "number" => "1Z001985YW99744790" + ]; + $fulfillment->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 1069019867, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:01:37-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:37-05:00", "tracking_company" => null, "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823175, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823175", "tax_lines" => []]], "tracking_number" => "MS1562678", "tracking_numbers" => ["MS1562678"], "tracking_url" => "https://www.my-shipping-company.com?tracking=MS1562678", "tracking_urls" => ["https://www.my-shipping-company.com?tracking=MS1562678"], "receipt" => [], "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019867"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["message" => "The package was shipped this morning.", "notify_customer" => false, "tracking_info" => ["number" => "MS1562678", "url" => "https://www.my-shipping-company.com?tracking=MS1562678"], "line_items_by_fulfillment_order" => [["fulfillment_order_id" => 1046000787]]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->message = "The package was shipped this morning."; + $fulfillment->notify_customer = false; + $fulfillment->tracking_info = [ + "number" => "MS1562678", + "url" => "https://www.my-shipping-company.com?tracking=MS1562678" + ]; + $fulfillment->line_items_by_fulfillment_order = [ + [ + "fulfillment_order_id" => 1046000787 + ] + ]; + $fulfillment->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 1069019875, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:01:51-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:51-05:00", "tracking_company" => "UPS", "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823181, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823181", "tax_lines" => []]], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => [], "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019875"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["message" => "The package was shipped this morning.", "notify_customer" => false, "tracking_info" => ["number" => "1Z001985YW99744790", "company" => "UPS"], "line_items_by_fulfillment_order" => [["fulfillment_order_id" => 1046000798, "fulfillment_order_line_items" => [["id" => 1058737525, "quantity" => 1]]]]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->message = "The package was shipped this morning."; + $fulfillment->notify_customer = false; + $fulfillment->tracking_info = [ + "number" => "1Z001985YW99744790", + "company" => "UPS" + ]; + $fulfillment->line_items_by_fulfillment_order = [ + [ + "fulfillment_order_id" => 1046000798, + "fulfillment_order_line_items" => [ + [ + "id" => 1058737525, + "quantity" => 1 + ] + ] + ] + ]; + $fulfillment->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["id" => 1069019886, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T09:02:02-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:02:02-05:00", "tracking_company" => null, "shipment_status" => null, "location_id" => 24826418, "line_items" => [["id" => 1071823189, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823189", "tax_lines" => []]], "tracking_number" => null, "tracking_numbers" => [], "tracking_url" => null, "tracking_urls" => [], "receipt" => [], "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019886"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["line_items_by_fulfillment_order" => [["fulfillment_order_id" => 1046000808]]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->line_items_by_fulfillment_order = [ + [ + "fulfillment_order_id" => 1046000808 + ] + ]; + $fulfillment->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["tracking_company" => "UPS", "location_id" => 24826418, "id" => 1069019869, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:43-05:00", "shipment_status" => null, "line_items" => [["id" => 1071823176, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823176", "tax_lines" => []]], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => [], "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019869"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments/1069019869/update_tracking.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["notify_customer" => true, "tracking_info" => ["company" => "UPS", "number" => "1Z001985YW99744790"]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->id = 1069019869; + $fulfillment->update_tracking( + [], + ["fulfillment" => ["notify_customer" => true, "tracking_info" => ["company" => "UPS", "number" => "1Z001985YW99744790"]]], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["tracking_company" => null, "location_id" => 24826418, "id" => 1069019864, "order_id" => 450789469, "status" => "success", "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:35-05:00", "shipment_status" => null, "line_items" => [["id" => 1071823172, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823172", "tax_lines" => []]], "tracking_number" => "1111", "tracking_numbers" => ["1111"], "tracking_url" => "http://www.my-url.com", "tracking_urls" => ["http://www.my-url.com"], "receipt" => [], "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019864"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments/1069019864/update_tracking.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment" => ["notify_customer" => true, "tracking_info" => ["number" => "1111", "url" => "http://www.my-url.com"]]]), + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->id = 1069019864; + $fulfillment->update_tracking( + [], + ["fulfillment" => ["notify_customer" => true, "tracking_info" => ["number" => "1111", "url" => "http://www.my-url.com"]]], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment" => ["order_id" => 450789469, "status" => "cancelled", "location_id" => 24826418, "id" => 1069019871, "created_at" => "2024-01-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-01-02T09:01:46-05:00", "tracking_company" => "UPS", "shipment_status" => null, "line_items" => [["id" => 1071823178, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => null, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823178", "tax_lines" => []]], "tracking_number" => "#\u26201\u2622\n---\n4321\n", "tracking_numbers" => ["#\u26201\u2622\n---\n4321\n"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321"], "receipt" => [], "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019871"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillments/1069019871/cancel.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $fulfillment = new Fulfillment($this->test_session); + $fulfillment->id = 1069019871; + $fulfillment->cancel( + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/FulfillmentEvent202404Test.php b/tests/Rest/Admin2024_04/FulfillmentEvent202404Test.php new file mode 100644 index 00000000..bee6d6e8 --- /dev/null +++ b/tests/Rest/Admin2024_04/FulfillmentEvent202404Test.php @@ -0,0 +1,147 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_events" => [["id" => 944956392, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => null, "happened_at" => "2024-01-02T09:30:55-05:00", "city" => null, "province" => null, "country" => null, "zip" => null, "address1" => null, "latitude" => null, "longitude" => null, "shop_id" => 548380009, "created_at" => "2024-01-02T09:30:55-05:00", "updated_at" => "2024-01-02T09:30:55-05:00", "estimated_delivery_at" => null, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956392"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/255858046/events.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentEvent::all( + $this->test_session, + ["order_id" => "450789469", "fulfillment_id" => "255858046"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_event" => ["id" => 944956394, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => null, "happened_at" => "2024-01-02T09:30:58-05:00", "city" => null, "province" => null, "country" => null, "zip" => null, "address1" => null, "latitude" => null, "longitude" => null, "shop_id" => 548380009, "created_at" => "2024-01-02T09:30:58-05:00", "updated_at" => "2024-01-02T09:30:58-05:00", "estimated_delivery_at" => null, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956394"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/255858046/events.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["event" => ["status" => "in_transit"]]), + ), + ]); + + $fulfillment_event = new FulfillmentEvent($this->test_session); + $fulfillment_event->order_id = 450789469; + $fulfillment_event->fulfillment_id = 255858046; + $fulfillment_event->status = "in_transit"; + $fulfillment_event->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_event" => ["id" => 944956391, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => null, "happened_at" => "2024-01-02T09:30:55-05:00", "city" => null, "province" => null, "country" => null, "zip" => null, "address1" => null, "latitude" => null, "longitude" => null, "shop_id" => 548380009, "created_at" => "2024-01-02T09:30:55-05:00", "updated_at" => "2024-01-02T09:30:55-05:00", "estimated_delivery_at" => null, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956391"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/255858046/events/944956391.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentEvent::find( + $this->test_session, + 944956391, + ["order_id" => "450789469", "fulfillment_id" => "255858046"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillments/255858046/events/944956393.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentEvent::delete( + $this->test_session, + 944956393, + ["order_id" => "450789469", "fulfillment_id" => "255858046"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/FulfillmentOrder202404Test.php b/tests/Rest/Admin2024_04/FulfillmentOrder202404Test.php new file mode 100644 index 00000000..de37fcd1 --- /dev/null +++ b/tests/Rest/Admin2024_04/FulfillmentOrder202404Test.php @@ -0,0 +1,437 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_orders" => [["id" => 1046000823, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000807, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737564, "shop_id" => 548380009, "fulfillment_order_id" => 1046000823, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:25-05:00", "updated_at" => "2024-01-02T09:11:25-05:00", "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillment_orders.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_orders" => [["id" => 1046000836, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000820, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737576, "shop_id" => 548380009, "fulfillment_order_id" => 1046000836, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385, "financial_summaries" => [["quantity" => 1, "original_unit_price_set" => "199.00", "approximate_discounted_unit_price_set" => "199.00", "discount_allocations" => [["amount" => "3.33", "discount_application" => ["allocation_method" => "across", "target_selection" => "all", "target_type" => "line_item"]]]]]]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:42-05:00", "updated_at" => "2024-01-02T09:11:42-05:00", "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillment_orders.json?include_financial_summaries=true", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::all( + $this->test_session, + ["order_id" => "450789469"], + ["include_financial_summaries" => "true"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_orders" => [["id" => 1046000826, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000810, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737566, "shop_id" => 548380009, "fulfillment_order_id" => 1046000826, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:28-05:00", "updated_at" => "2024-01-02T09:11:28-05:00", "order_name" => "#1001", "order_processed_at" => "2008-01-10T11:00:00-05:00", "channel_id" => null, "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/fulfillment_orders.json?include_order_reference_fields=true", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::all( + $this->test_session, + ["order_id" => "450789469"], + ["include_order_reference_fields" => "true"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000819, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000803, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737560, "shop_id" => 548380009, "fulfillment_order_id" => 1046000819, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:20-05:00", "updated_at" => "2024-01-02T09:11:20-05:00", "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000819.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::find( + $this->test_session, + 1046000819, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000837, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000821, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737577, "shop_id" => 548380009, "fulfillment_order_id" => 1046000837, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385, "financial_summaries" => [["quantity" => 1, "original_unit_price_set" => "199.00", "approximate_discounted_unit_price_set" => "199.00", "discount_allocations" => [["amount" => "3.33", "discount_application" => ["allocation_method" => "across", "target_selection" => "all", "target_type" => "line_item"]]]]]]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:43-05:00", "updated_at" => "2024-01-02T09:11:43-05:00", "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000837.json?include_financial_summaries=true", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::find( + $this->test_session, + 1046000837, + [], + ["include_financial_summaries" => "true"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000828, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000812, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737568, "shop_id" => 548380009, "fulfillment_order_id" => 1046000828, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfill_at" => null, "fulfill_by" => null, "fulfillment_holds" => [], "created_at" => "2024-01-02T09:11:32-05:00", "updated_at" => "2024-01-02T09:11:32-05:00", "order_name" => "#1001", "order_processed_at" => "2008-01-10T11:00:00-05:00", "channel_id" => null, "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000828.json?include_order_reference_fields=true", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentOrder::find( + $this->test_session, + 1046000828, + [], + ["include_order_reference_fields" => "true"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000824, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "closed", "supported_actions" => [], "destination" => ["id" => 1046000808, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [], "international_duties" => null, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []], "replacement_fulfillment_order" => ["id" => 1046000825, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000809, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737565, "shop_id" => 548380009, "fulfillment_order_id" => 1046000825, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000824/cancel.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000824; + $fulfillment_order->cancel( + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000818, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "closed", "status" => "incomplete", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000802, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737559, "shop_id" => 548380009, "fulfillment_order_id" => 1046000818, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000818/close.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_order" => ["message" => "Not enough inventory to complete this work."]]), + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000818; + $fulfillment_order->close( + [], + ["fulfillment_order" => ["message" => "Not enough inventory to complete this work."]], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["original_fulfillment_order" => ["id" => 1046000834, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 487838322, "request_status" => "submitted", "status" => "closed", "supported_actions" => [], "destination" => ["id" => 1046000818, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [], "international_duties" => null, "fulfillment_service_handle" => "manual", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []], "moved_fulfillment_order" => ["id" => 1046000835, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 655441491, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["create_fulfillment", "move"], "destination" => ["id" => 1046000819, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737575, "shop_id" => 548380009, "fulfillment_order_id" => 1046000835, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfillment_service_handle" => "manual", "assigned_location" => ["address1" => "50 Rideau Street", "address2" => null, "city" => "Ottawa", "country_code" => "CA", "location_id" => 655441491, "name" => "50 Rideau Street", "phone" => null, "province" => "Ontario", "zip" => "K1N 9J7"], "merchant_requests" => []], "remaining_fulfillment_order" => null] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000834/move.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_order" => ["new_location_id" => 655441491, "fulfillment_order_line_items" => [["id" => 1058737574, "quantity" => 1]]]]), + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000834; + $fulfillment_order->move( + [], + ["fulfillment_order" => ["new_location_id" => 655441491, "fulfillment_order_line_items" => [["id" => 1058737574, "quantity" => 1]]]], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000821, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000805, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737562, "shop_id" => 548380009, "fulfillment_order_id" => 1046000821, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfillment_service_handle" => "mars-fulfillment", "fulfill_at" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000821/open.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000821; + $fulfillment_order->open( + [], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000830, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "scheduled", "supported_actions" => ["mark_as_open"], "destination" => ["id" => 1046000814, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737570, "shop_id" => 548380009, "fulfillment_order_id" => 1046000830, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfillment_service_handle" => "mars-fulfillment", "fulfill_at" => "2025-02-02T09:11:00-05:00", "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000830/reschedule.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_order" => ["new_fulfill_at" => "2025-02-02 14:11 UTC"]]), + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000830; + $fulfillment_order->reschedule( + [], + ["fulfillment_order" => ["new_fulfill_at" => "2025-02-02 14:11 UTC"]], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000827, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "on_hold", "supported_actions" => ["release_hold"], "destination" => ["id" => 1046000811, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "line_items" => [["id" => 1058737567, "shop_id" => 548380009, "fulfillment_order_id" => 1046000827, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "international_duties" => null, "fulfill_at" => null, "fulfillment_holds" => [["reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work."]], "delivery_method" => null, "assigned_location" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "merchant_requests" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000827/hold.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_hold" => ["reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work.", "fulfillment_order_line_items" => [["id" => 1058737567, "quantity" => 1]]]]), + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000827; + $fulfillment_order->hold( + [], + ["fulfillment_hold" => ["reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work.", "fulfillment_order_line_items" => [["id" => 1058737567, "quantity" => 1]]]], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/set_fulfillment_orders_deadline.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_order_ids" => [1046000820], "fulfillment_deadline" => "2021-05-26T10:00:00-04:00"]), + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + + $fulfillment_order->set_fulfillment_orders_deadline( + [], + ["fulfillment_order_ids" => [1046000820], "fulfillment_deadline" => "2021-05-26T10:00:00-04:00"], + ); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000829, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000813, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737569, "shop_id" => 548380009, "fulfillment_order_id" => 1046000829, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [], "international_duties" => null, "fulfill_at" => null, "fulfillment_holds" => [], "delivery_method" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000829/release_hold.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $fulfillment_order = new FulfillmentOrder($this->test_session); + $fulfillment_order->id = 1046000829; + $fulfillment_order->release_hold( + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/FulfillmentRequest202404Test.php b/tests/Rest/Admin2024_04/FulfillmentRequest202404Test.php new file mode 100644 index 00000000..7266314c --- /dev/null +++ b/tests/Rest/Admin2024_04/FulfillmentRequest202404Test.php @@ -0,0 +1,158 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["original_fulfillment_order" => ["id" => 1046000778, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000778, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737484, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737485, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385], ["id" => 1058737486, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702]], "outgoing_requests" => [["message" => "Fulfill this ASAP please.", "request_options" => ["notify_customer" => false], "sent_at" => "2024-01-02T08:57:14-05:00", "kind" => "fulfillment_request"]], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"], "submitted_fulfillment_order" => ["id" => 1046000778, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000778, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737484, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737485, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385], ["id" => 1058737486, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702]], "outgoing_requests" => [["message" => "Fulfill this ASAP please.", "request_options" => ["notify_customer" => false], "sent_at" => "2024-01-02T08:57:14-05:00", "kind" => "fulfillment_request"]], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"], "unsubmitted_fulfillment_order" => null] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000778/fulfillment_request.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_request" => ["message" => "Fulfill this ASAP please."]]), + ), + ]); + + $fulfillment_request = new FulfillmentRequest($this->test_session); + $fulfillment_request->fulfillment_order_id = 1046000778; + $fulfillment_request->message = "Fulfill this ASAP please."; + $fulfillment_request->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["original_fulfillment_order" => ["id" => 1046000779, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000779, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737487, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737488, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [["message" => "Fulfill this ASAP please.", "request_options" => ["notify_customer" => false], "sent_at" => "2024-01-02T08:57:16-05:00", "kind" => "fulfillment_request"]], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"], "submitted_fulfillment_order" => ["id" => 1046000779, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => ["id" => 1046000779, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737487, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737488, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385]], "outgoing_requests" => [["message" => "Fulfill this ASAP please.", "request_options" => ["notify_customer" => false], "sent_at" => "2024-01-02T08:57:16-05:00", "kind" => "fulfillment_request"]], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"], "unsubmitted_fulfillment_order" => ["id" => 1046000780, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000780, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737489, "shop_id" => 548380009, "fulfillment_order_id" => 1046000780, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000779/fulfillment_request.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_request" => ["message" => "Fulfill this ASAP please.", "fulfillment_order_line_items" => [["id" => 1058737487, "quantity" => 1], ["id" => 1058737488, "quantity" => 1]]]]), + ), + ]); + + $fulfillment_request = new FulfillmentRequest($this->test_session); + $fulfillment_request->fulfillment_order_id = 1046000779; + $fulfillment_request->message = "Fulfill this ASAP please."; + $fulfillment_request->fulfillment_order_line_items = [ + [ + "id" => 1058737487, + "quantity" => 1 + ], + [ + "id" => 1058737488, + "quantity" => 1 + ] + ]; + $fulfillment_request->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000781, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "accepted", "status" => "in_progress", "supported_actions" => ["request_cancellation"], "destination" => ["id" => 1046000781, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737490, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737491, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385], ["id" => 1058737492, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000781/fulfillment_request/accept.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_request" => ["message" => "We will start processing your fulfillment on the next business day."]]), + ), + ]); + + $fulfillment_request = new FulfillmentRequest($this->test_session); + $fulfillment_request->fulfillment_order_id = 1046000781; + $fulfillment_request->accept( + [], + ["fulfillment_request" => ["message" => "We will start processing your fulfillment on the next business day."]], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_order" => ["id" => 1046000777, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "rejected", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => ["id" => 1046000777, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => null, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"], "origin" => ["address1" => null, "address2" => null, "city" => null, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => null, "province" => null, "zip" => null], "line_items" => [["id" => 1058737481, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856], ["id" => 1058737482, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385], ["id" => 1058737483, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702]], "outgoing_requests" => [], "international_duties" => null, "fulfillment_service_handle" => "shipwire-app"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000777/fulfillment_request/reject.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_request" => ["message" => "Not enough inventory on hand to complete the work.", "reason" => "inventory_out_of_stock", "line_items" => [["fulfillment_order_line_item_id" => 1058737481, "message" => "Not enough inventory."]]]]), + ), + ]); + + $fulfillment_request = new FulfillmentRequest($this->test_session); + $fulfillment_request->fulfillment_order_id = 1046000777; + $fulfillment_request->reject( + [], + ["fulfillment_request" => ["message" => "Not enough inventory on hand to complete the work.", "reason" => "inventory_out_of_stock", "line_items" => [["fulfillment_order_line_item_id" => 1058737481, "message" => "Not enough inventory."]]]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/FulfillmentService202404Test.php b/tests/Rest/Admin2024_04/FulfillmentService202404Test.php new file mode 100644 index 00000000..a3304871 --- /dev/null +++ b/tests/Rest/Admin2024_04/FulfillmentService202404Test.php @@ -0,0 +1,208 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_services" => [["id" => 611870435, "name" => "Venus Fulfillment", "email" => null, "service_name" => "Venus Fulfillment", "handle" => "venus-fulfillment", "fulfillment_orders_opt_in" => false, "include_pending_stock" => false, "provider_id" => null, "location_id" => 611870435, "callback_url" => null, "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/611870435"], ["id" => 755357713, "name" => "Mars Fulfillment", "email" => null, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => null, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services.json?scope=all", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentService::all( + $this->test_session, + [], + ["scope" => "all"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_services" => [["id" => 755357713, "name" => "Mars Fulfillment", "email" => null, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => null, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentService::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_service" => ["id" => 1061774488, "name" => "Jupiter Fulfillment", "email" => null, "service_name" => "Jupiter Fulfillment", "handle" => "jupiter-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => null, "location_id" => 1072404545, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/1061774488", "permits_sku_sharing" => true]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_service" => ["name" => "Jupiter Fulfillment", "callback_url" => "http://google.com", "inventory_management" => true, "tracking_support" => true, "requires_shipping_method" => true, "format" => "json", "permits_sku_sharing" => true, "fulfillment_orders_opt_in" => true]]), + ), + ]); + + $fulfillment_service = new FulfillmentService($this->test_session); + $fulfillment_service->name = "Jupiter Fulfillment"; + $fulfillment_service->callback_url = "http://google.com"; + $fulfillment_service->inventory_management = true; + $fulfillment_service->tracking_support = true; + $fulfillment_service->requires_shipping_method = true; + $fulfillment_service->format = "json"; + $fulfillment_service->permits_sku_sharing = true; + $fulfillment_service->fulfillment_orders_opt_in = true; + $fulfillment_service->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_service" => ["id" => 755357713, "name" => "Mars Fulfillment", "email" => null, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => null, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services/755357713.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentService::find( + $this->test_session, + 755357713, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["fulfillment_service" => ["id" => 755357713, "name" => "New Fulfillment Service Name", "email" => null, "service_name" => "New Fulfillment Service Name", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => null, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services/755357713.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["fulfillment_service" => ["name" => "New Fulfillment Service Name"]]), + ), + ]); + + $fulfillment_service = new FulfillmentService($this->test_session); + $fulfillment_service->id = 755357713; + $fulfillment_service->name = "New Fulfillment Service Name"; + $fulfillment_service->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_services/755357713.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + FulfillmentService::delete( + $this->test_session, + 755357713, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/GiftCard202404Test.php b/tests/Rest/Admin2024_04/GiftCard202404Test.php new file mode 100644 index 00000000..0f811546 --- /dev/null +++ b/tests/Rest/Admin2024_04/GiftCard202404Test.php @@ -0,0 +1,374 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_cards" => [["id" => 766118925, "balance" => "25.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => "2023-01-02", "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "0e0e", "order_id" => null], ["id" => 10274553, "balance" => "0.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "0y0y", "order_id" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards.json?status=enabled", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::all( + $this->test_session, + [], + ["status" => "enabled"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_cards" => [["id" => 1035197676, "balance" => "100.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "0d0d", "order_id" => null], ["id" => 766118925, "balance" => "25.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => "2023-01-02", "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "0e0e", "order_id" => null], ["id" => 10274553, "balance" => "0.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "0y0y", "order_id" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["id" => 1035197676, "balance" => "100.00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "last_characters" => "0d0d", "order_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::find( + $this->test_session, + 1035197676, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["expires_on" => "2020-01-01", "template_suffix" => null, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => null, "id" => 1035197676, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:01:27-05:00", "currency" => "USD", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "note" => null, "last_characters" => "0d0d", "order_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["expires_on" => "2020-01-01"]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->id = 1035197676; + $gift_card->expires_on = "2020-01-01"; + $gift_card->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["note" => "Updating with a new note", "template_suffix" => null, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => null, "id" => 1035197676, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:01:23-05:00", "currency" => "USD", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "expires_on" => null, "last_characters" => "0d0d", "order_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["note" => "Updating with a new note"]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->id = 1035197676; + $gift_card->note = "Updating with a new note"; + $gift_card->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/count.json?status=enabled", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::count( + $this->test_session, + [], + ["status" => "enabled"], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["id" => 1063936318, "balance" => "100.00", "created_at" => "2024-01-02T09:01:24-05:00", "updated_at" => "2024-01-02T09:01:24-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => 755357713, "user_id" => null, "customer_id" => null, "note" => "This is a note", "expires_on" => null, "template_suffix" => "gift_cards.birthday.liquid", "last_characters" => "mnop", "order_id" => null, "code" => "abcdefghijklmnop"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["note" => "This is a note", "initial_value" => "100.00", "code" => "ABCD EFGH IJKL MNOP", "template_suffix" => "gift_cards.birthday.liquid"]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->note = "This is a note"; + $gift_card->initial_value = "100.00"; + $gift_card->code = "ABCD EFGH IJKL MNOP"; + $gift_card->template_suffix = "gift_cards.birthday.liquid"; + $gift_card->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["id" => 1063936319, "balance" => "25.00", "created_at" => "2024-01-02T09:01:25-05:00", "updated_at" => "2024-01-02T09:01:25-05:00", "currency" => "USD", "initial_value" => "25.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => 755357713, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "last_characters" => "bc76", "order_id" => null, "code" => "ad62h8aae5c3bc76"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["initial_value" => "25.00"]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->initial_value = "25.00"; + $gift_card->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["id" => 1063936320, "balance" => "100.00", "created_at" => "2024-01-02T09:01:26-05:00", "updated_at" => "2024-01-02T09:01:26-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => 755357713, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "last_characters" => "6ag3", "order_id" => null, "code" => "96577h3499436ag3"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["initial_value" => "100.00", "recipient_id" => 207119551, "message" => "Happy birthday!", "send_on" => "2023-12-31T19:00:00-05:00"]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->initial_value = "100.00"; + $gift_card->recipient_id = 207119551; + $gift_card->message = "Happy birthday!"; + $gift_card->send_on = "2023-12-31T19:00:00-05:00"; + $gift_card->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_card" => ["disabled_at" => "2024-01-02T09:01:25-05:00", "template_suffix" => null, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => null, "id" => 1035197676, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:01:25-05:00", "currency" => "USD", "line_item_id" => null, "api_client_id" => null, "user_id" => null, "note" => null, "expires_on" => null, "last_characters" => "0d0d", "order_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/disable.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["gift_card" => ["id" => 1035197676]]), + ), + ]); + + $gift_card = new GiftCard($this->test_session); + $gift_card->id = 1035197676; + $gift_card->disable( + [], + ["gift_card" => ["id" => 1035197676]], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["gift_cards" => [["id" => 1063936321, "balance" => "10.00", "created_at" => "2024-01-02T09:01:29-05:00", "updated_at" => "2024-01-02T09:01:29-05:00", "currency" => "USD", "initial_value" => "10.00", "disabled_at" => null, "line_item_id" => null, "api_client_id" => null, "user_id" => null, "customer_id" => null, "note" => null, "expires_on" => null, "template_suffix" => null, "recipient_id" => null, "message" => null, "send_on" => null, "notify" => true, "last_characters" => "mnop", "order_id" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/search.json?query=last_characters%3Amnop", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCard::search( + $this->test_session, + [], + ["query" => "last_characters:mnop"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/GiftCardAdjustment202404Test.php b/tests/Rest/Admin2024_04/GiftCardAdjustment202404Test.php new file mode 100644 index 00000000..491fd9a8 --- /dev/null +++ b/tests/Rest/Admin2024_04/GiftCardAdjustment202404Test.php @@ -0,0 +1,206 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustments" => [["id" => 1064273908, "gift_card_id" => 1035197676, "api_client_id" => null, "user_id" => null, "order_transaction_id" => null, "number" => null, "amount" => "10.00", "processed_at" => null, "created_at" => "2024-01-03T11:57:29-05:00", "updated_at" => "2024-01-03T11:57:29-05:00", "note" => "Customer refilled gift card by \$10", "remote_transaction_ref" => null, "remote_transaction_url" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCardAdjustment::all( + $this->test_session, + ["gift_card_id" => "1035197676"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustment" => ["id" => 1064273909, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => null, "order_transaction_id" => null, "number" => 1, "amount" => "10.00", "processed_at" => "2024-01-03T11:58:04-05:00", "created_at" => "2024-01-03T11:58:04-05:00", "updated_at" => "2024-01-03T11:58:04-05:00", "note" => null, "remote_transaction_ref" => "gift_card_app_transaction_193402", "remote_transaction_url" => "http://example.com/my-gift-card-app/gift_card_adjustments/193402"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["adjustment" => ["amount" => 10.0, "remote_transaction_ref" => "gift_card_app_transaction_193402", "remote_transaction_url" => "http://example.com/my-gift-card-app/gift_card_adjustments/193402"]]), + ), + ]); + + $gift_card_adjustment = new GiftCardAdjustment($this->test_session); + $gift_card_adjustment->gift_card_id = 1035197676; + $gift_card_adjustment->amount = 10.0; + $gift_card_adjustment->remote_transaction_ref = "gift_card_app_transaction_193402"; + $gift_card_adjustment->remote_transaction_url = "http://example.com/my-gift-card-app/gift_card_adjustments/193402"; + $gift_card_adjustment->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustment" => ["id" => 1064273912, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => null, "order_transaction_id" => null, "number" => 1, "amount" => "10.00", "processed_at" => "2024-01-03T11:58:07-05:00", "created_at" => "2024-01-03T11:58:07-05:00", "updated_at" => "2024-01-03T11:58:07-05:00", "note" => "Customer refilled gift card by \$10", "remote_transaction_ref" => null, "remote_transaction_url" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["adjustment" => ["amount" => 10.0, "note" => "Customer refilled gift card by \$10"]]), + ), + ]); + + $gift_card_adjustment = new GiftCardAdjustment($this->test_session); + $gift_card_adjustment->gift_card_id = 1035197676; + $gift_card_adjustment->amount = 10.0; + $gift_card_adjustment->note = "Customer refilled gift card by \$10"; + $gift_card_adjustment->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustment" => ["id" => 1064273911, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => null, "order_transaction_id" => null, "number" => 1, "amount" => "-20.00", "processed_at" => "2024-01-03T11:58:06-05:00", "created_at" => "2024-01-03T11:58:06-05:00", "updated_at" => "2024-01-03T11:58:06-05:00", "note" => "Customer spent \$20 via external service", "remote_transaction_ref" => null, "remote_transaction_url" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["adjustment" => ["amount" => -20.0, "note" => "Customer spent \$20 via external service"]]), + ), + ]); + + $gift_card_adjustment = new GiftCardAdjustment($this->test_session); + $gift_card_adjustment->gift_card_id = 1035197676; + $gift_card_adjustment->amount = -20.0; + $gift_card_adjustment->note = "Customer spent \$20 via external service"; + $gift_card_adjustment->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustment" => ["id" => 1064273910, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => null, "order_transaction_id" => null, "number" => 1, "amount" => "10.00", "processed_at" => "2023-07-03T11:58:04-04:00", "created_at" => "2024-01-03T11:58:04-05:00", "updated_at" => "2024-01-03T11:58:04-05:00", "note" => null, "remote_transaction_ref" => null, "remote_transaction_url" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["adjustment" => ["amount" => 10.0, "processed_at" => "2023-07-03T11:58:04-04:00"]]), + ), + ]); + + $gift_card_adjustment = new GiftCardAdjustment($this->test_session); + $gift_card_adjustment->gift_card_id = 1035197676; + $gift_card_adjustment->amount = 10.0; + $gift_card_adjustment->processed_at = "2023-07-03T11:58:04-04:00"; + $gift_card_adjustment->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["adjustment" => ["id" => 1064273908, "gift_card_id" => 1035197676, "api_client_id" => null, "user_id" => null, "order_transaction_id" => null, "number" => null, "amount" => "10.00", "processed_at" => null, "created_at" => "2024-01-03T11:57:29-05:00", "updated_at" => "2024-01-03T11:57:29-05:00", "note" => "Customer refilled gift card by \$10", "remote_transaction_ref" => null, "remote_transaction_url" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/gift_cards/1035197676/adjustments/1064273908.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + GiftCardAdjustment::find( + $this->test_session, + 1064273908, + ["gift_card_id" => "1035197676"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Image202404Test.php b/tests/Rest/Admin2024_04/Image202404Test.php new file mode 100644 index 00000000..509ccbb4 --- /dev/null +++ b/tests/Rest/Admin2024_04/Image202404Test.php @@ -0,0 +1,458 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::all( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["images" => [["id" => 1001473899, "alt" => null, "position" => 4, "product_id" => 632910392, "created_at" => "2024-01-02T08:58:45-05:00", "updated_at" => "2024-01-02T08:58:45-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473899", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203925", "variant_ids" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json?since_id=850703190", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::all( + $this->test_session, + ["product_id" => "632910392"], + ["since_id" => "850703190"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["width" => 110, "height" => 140, "position" => 1, "alt" => null, "id" => 1001473897, "product_id" => 632910392, "created_at" => "2024-01-02T08:58:42-05:00", "updated_at" => "2024-01-02T08:58:42-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203922", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473897"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["position" => 1, "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]], "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->position = 1; + $image->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $image->attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"; + $image->filename = "rails_logo.gif"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 1001473900, "product_id" => 632910392, "position" => 4, "created_at" => "2024-01-02T08:58:49-05:00", "updated_at" => "2024-01-02T08:58:49-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203929", "variant_ids" => [457924702, 808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473900"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["variant_ids" => [808950810, 457924702], "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->variant_ids = [ + 808950810, + 457924702 + ]; + $image->attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"; + $image->filename = "rails_logo.gif"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["position" => 1, "width" => 110, "height" => 140, "alt" => null, "id" => 1001473896, "product_id" => 632910392, "created_at" => "2024-01-02T08:58:40-05:00", "updated_at" => "2024-01-02T08:58:40-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203920", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473896"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["position" => 1, "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->position = 1; + $image->attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"; + $image->filename = "rails_logo.gif"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 1001473895, "product_id" => 632910392, "position" => 4, "created_at" => "2024-01-02T08:58:39-05:00", "updated_at" => "2024-01-02T08:58:39-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo20240102-28582-k6leis.gif?v=1704203919", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473895"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["src" => "http://example.com/rails_logo.gif"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->src = "http://example.com/rails_logo.gif"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 1001473898, "product_id" => 632910392, "position" => 4, "created_at" => "2024-01-02T08:58:43-05:00", "updated_at" => "2024-01-02T08:58:43-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203923", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473898"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"; + $image->filename = "rails_logo.gif"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::count( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 0] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/count.json?since_id=850703190", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::count( + $this->test_session, + ["product_id" => "632910392"], + ["since_id" => "850703190"], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/850703190.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::find( + $this->test_session, + 850703190, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 850703190, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:58:38-05:00", "alt" => "new alt tag content", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203918", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/850703190.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["position" => 2, "alt" => "new alt tag content"]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->id = 850703190; + $image->position = 2; + $image->alt = "new alt tag content"; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/850703190.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["metafields" => [["key" => "my_new_metafield", "value" => "my_new_value", "type" => "single_line_text_field", "namespace" => "tags"]]]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->id = 850703190; + $image->metafields = [ + [ + "key" => "my_new_metafield", + "value" => "my_new_value", + "type" => "single_line_text_field", + "namespace" => "tags" + ] + ]; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => [457924702, 808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/850703190.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["image" => ["variant_ids" => [808950810, 457924702]]]), + ), + ]); + + $image = new Image($this->test_session); + $image->product_id = 632910392; + $image->id = 850703190; + $image->variant_ids = [ + 808950810, + 457924702 + ]; + $image->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/images/850703190.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Image::delete( + $this->test_session, + 850703190, + ["product_id" => "632910392"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/InventoryItem202404Test.php b/tests/Rest/Admin2024_04/InventoryItem202404Test.php new file mode 100644 index 00000000..e8fab034 --- /dev/null +++ b/tests/Rest/Admin2024_04/InventoryItem202404Test.php @@ -0,0 +1,145 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_items" => [["id" => 39072856, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/39072856"], ["id" => 457924702, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/457924702"], ["id" => 808950810, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_items.json?ids=808950810%2C39072856%2C457924702", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryItem::all( + $this->test_session, + [], + ["ids" => "808950810,39072856,457924702"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_item" => ["id" => 808950810, "sku" => "IPOD2008PINK", "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_items/808950810.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryItem::find( + $this->test_session, + 808950810, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_item" => ["id" => 808950810, "sku" => "new sku", "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:31:51-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_items/808950810.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["inventory_item" => ["sku" => "new sku"]]), + ), + ]); + + $inventory_item = new InventoryItem($this->test_session); + $inventory_item->id = 808950810; + $inventory_item->sku = "new sku"; + $inventory_item->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_item" => ["id" => 808950810, "sku" => "IPOD2008PINK", "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => null, "province_code_of_origin" => null, "harmonized_system_code" => null, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_items/808950810.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["inventory_item" => ["cost" => "25.00"]]), + ), + ]); + + $inventory_item = new InventoryItem($this->test_session); + $inventory_item->id = 808950810; + $inventory_item->cost = "25.00"; + $inventory_item->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/InventoryLevel202404Test.php b/tests/Rest/Admin2024_04/InventoryLevel202404Test.php new file mode 100644 index 00000000..331e78d7 --- /dev/null +++ b/tests/Rest/Admin2024_04/InventoryLevel202404Test.php @@ -0,0 +1,234 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_levels" => [["inventory_item_id" => 49148385, "location_id" => 655441491, "available" => 2, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=49148385"], ["inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"], ["inventory_item_id" => 457924702, "location_id" => 655441491, "available" => 4, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=457924702"], ["inventory_item_id" => 39072856, "location_id" => 655441491, "available" => 3, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=39072856"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels.json?location_ids=655441491", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryLevel::all( + $this->test_session, + [], + ["location_ids" => "655441491"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_levels" => [["inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"], ["inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels.json?inventory_item_ids=808950810", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryLevel::all( + $this->test_session, + [], + ["inventory_item_ids" => "808950810"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_levels" => [["inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"], ["inventory_item_id" => 39072856, "location_id" => 487838322, "available" => 27, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=39072856"], ["inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"], ["inventory_item_id" => 39072856, "location_id" => 655441491, "available" => 3, "updated_at" => "2024-01-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=39072856"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels.json?inventory_item_ids=808950810%2C39072856&location_ids=655441491%2C487838322", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryLevel::all( + $this->test_session, + [], + ["inventory_item_ids" => "808950810,39072856", "location_ids" => "655441491,487838322"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_level" => ["inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 6, "updated_at" => "2024-01-02T08:57:27-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels/adjust.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["location_id" => 655441491, "inventory_item_id" => 808950810, "available_adjustment" => 5]), + ), + ]); + + $inventory_level = new InventoryLevel($this->test_session); + + $inventory_level->adjust( + [], + ["location_id" => 655441491, "inventory_item_id" => 808950810, "available_adjustment" => 5], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels.json?inventory_item_id=808950810&location_id=655441491", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + InventoryLevel::delete( + $this->test_session, + [], + ["inventory_item_id" => "808950810", "location_id" => "655441491"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_level" => ["inventory_item_id" => 457924702, "location_id" => 844681632, "available" => 0, "updated_at" => "2024-01-02T08:57:20-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/844681632?inventory_item_id=457924702"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels/connect.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["location_id" => 844681632, "inventory_item_id" => 457924702]), + ), + ]); + + $inventory_level = new InventoryLevel($this->test_session); + + $inventory_level->connect( + [], + ["location_id" => 844681632, "inventory_item_id" => 457924702], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_level" => ["inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 42, "updated_at" => "2024-01-02T08:57:24-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/inventory_levels/set.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["location_id" => 655441491, "inventory_item_id" => 808950810, "available" => 42]), + ), + ]); + + $inventory_level = new InventoryLevel($this->test_session); + + $inventory_level->set( + [], + ["location_id" => 655441491, "inventory_item_id" => 808950810, "available" => 42], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Location202404Test.php b/tests/Rest/Admin2024_04/Location202404Test.php new file mode 100644 index 00000000..6e3922b0 --- /dev/null +++ b/tests/Rest/Admin2024_04/Location202404Test.php @@ -0,0 +1,146 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["locations" => [["id" => 655441491, "name" => "50 Rideau Street", "address1" => "50 Rideau Street", "address2" => null, "city" => "Ottawa", "zip" => "K1N 9J7", "province" => "Ontario", "country" => "CA", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "CA", "country_name" => "Canada", "province_code" => "ON", "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/655441491", "localized_country_name" => "Canada", "localized_province_name" => "Ontario"], ["id" => 24826418, "name" => "Apple Api Shipwire", "address1" => null, "address2" => null, "city" => null, "zip" => null, "province" => null, "country" => "DE", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "DE", "country_name" => "Germany", "province_code" => null, "legacy" => true, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/24826418", "localized_country_name" => "Germany", "localized_province_name" => null], ["id" => 844681632, "name" => "Apple Cupertino", "address1" => null, "address2" => null, "city" => null, "zip" => null, "province" => null, "country" => "US", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => null, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/844681632", "localized_country_name" => "United States", "localized_province_name" => null], ["id" => 611870435, "name" => "Apple Shipwire", "address1" => null, "address2" => null, "city" => null, "zip" => null, "province" => null, "country" => "DE", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "DE", "country_name" => "Germany", "province_code" => null, "legacy" => true, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/611870435", "localized_country_name" => "Germany", "localized_province_name" => null], ["id" => 487838322, "name" => "Fifth Avenue AppleStore", "address1" => null, "address2" => null, "city" => null, "zip" => null, "province" => null, "country" => "US", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => null, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/487838322", "localized_country_name" => "United States", "localized_province_name" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/locations.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Location::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["location" => ["id" => 487838322, "name" => "Fifth Avenue AppleStore", "address1" => null, "address2" => null, "city" => null, "zip" => null, "province" => null, "country" => "US", "phone" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => null, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/487838322"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/locations/487838322.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Location::find( + $this->test_session, + 487838322, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 5] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/locations/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Location::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["inventory_levels" => [["inventory_item_id" => 49148385, "location_id" => 487838322, "available" => 18, "updated_at" => "2024-01-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=49148385"], ["inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-01-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"], ["inventory_item_id" => 457924702, "location_id" => 487838322, "available" => 36, "updated_at" => "2024-01-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=457924702"], ["inventory_item_id" => 39072856, "location_id" => 487838322, "available" => 27, "updated_at" => "2024-01-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=39072856"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/locations/487838322/inventory_levels.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Location::inventory_levels( + $this->test_session, + 487838322, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/LocationsForMove202404Test.php b/tests/Rest/Admin2024_04/LocationsForMove202404Test.php new file mode 100644 index 00000000..2b1a101f --- /dev/null +++ b/tests/Rest/Admin2024_04/LocationsForMove202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["locations_for_move" => [["location" => ["id" => 1072404542, "name" => "Alpha Location"], "message" => "Current location.", "movable" => false], ["location" => ["id" => 1072404543, "name" => "Bravo Location"], "message" => "No items are stocked at this location.", "movable" => false]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/fulfillment_orders/1046000782/locations_for_move.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + LocationsForMove::all( + $this->test_session, + ["fulfillment_order_id" => "1046000782"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/MarketingEvent202404Test.php b/tests/Rest/Admin2024_04/MarketingEvent202404Test.php new file mode 100644 index 00000000..1ba15806 --- /dev/null +++ b/tests/Rest/Admin2024_04/MarketingEvent202404Test.php @@ -0,0 +1,249 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["marketing_events" => [["id" => 998730532, "event_type" => "post", "remote_id" => "12345678", "started_at" => "2024-01-15T10:56:18-05:00", "ended_at" => null, "scheduled_to_end_at" => null, "budget" => "10.11", "currency" => "GBP", "manage_url" => null, "preview_url" => null, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "budget_type" => "daily", "description" => null, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => null, "marketing_activity_id" => null, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MarketingEvent::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["marketing_event" => ["id" => 1069063883, "event_type" => "ad", "remote_id" => null, "started_at" => "2024-12-14T19:00:00-05:00", "ended_at" => null, "scheduled_to_end_at" => null, "budget" => null, "currency" => null, "manage_url" => null, "preview_url" => null, "utm_campaign" => "Christmas2024", "utm_source" => "facebook", "utm_medium" => "cpc", "budget_type" => null, "description" => null, "marketing_channel" => "social", "paid" => true, "referring_domain" => "facebook.com", "breadcrumb_id" => null, "marketing_activity_id" => 1063897333, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/1069063883", "marketed_resources" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["marketing_event" => ["started_at" => "2024-12-15", "utm_campaign" => "Christmas2024", "utm_source" => "facebook", "utm_medium" => "cpc", "event_type" => "ad", "referring_domain" => "facebook.com", "marketing_channel" => "social", "paid" => true]]), + ), + ]); + + $marketing_event = new MarketingEvent($this->test_session); + $marketing_event->started_at = "2024-12-15"; + $marketing_event->utm_campaign = "Christmas2024"; + $marketing_event->utm_source = "facebook"; + $marketing_event->utm_medium = "cpc"; + $marketing_event->event_type = "ad"; + $marketing_event->referring_domain = "facebook.com"; + $marketing_event->marketing_channel = "social"; + $marketing_event->paid = true; + $marketing_event->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MarketingEvent::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["marketing_event" => ["id" => 998730532, "event_type" => "post", "remote_id" => "12345678", "started_at" => "2024-01-15T10:56:18-05:00", "ended_at" => null, "scheduled_to_end_at" => null, "budget" => "10.11", "currency" => "GBP", "manage_url" => null, "preview_url" => null, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "budget_type" => "daily", "description" => null, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => null, "marketing_activity_id" => null, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events/998730532.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MarketingEvent::find( + $this->test_session, + 998730532, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["marketing_event" => ["started_at" => "2024-02-01T19:00:00-05:00", "ended_at" => "2024-02-02T19:00:00-05:00", "scheduled_to_end_at" => "2024-02-03T19:00:00-05:00", "remote_id" => "1000:2000", "currency" => "CAD", "budget" => "11.1", "budget_type" => "daily", "id" => 998730532, "event_type" => "post", "manage_url" => null, "preview_url" => null, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "description" => null, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => null, "marketing_activity_id" => null, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events/998730532.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["marketing_event" => ["remote_id" => "1000:2000", "started_at" => "2024-02-02T00:00 +00:00", "ended_at" => "2024-02-03T00:00 +00:00", "scheduled_to_end_at" => "2024-02-04T00:00 +00:00", "budget" => "11.1", "budget_type" => "daily", "currency" => "CAD", "utm_campaign" => "other", "utm_source" => "other", "utm_medium" => "other", "event_type" => "ad", "referring_domain" => "instagram.com"]]), + ), + ]); + + $marketing_event = new MarketingEvent($this->test_session); + $marketing_event->id = 998730532; + $marketing_event->remote_id = "1000:2000"; + $marketing_event->started_at = "2024-02-02T00:00 +00:00"; + $marketing_event->ended_at = "2024-02-03T00:00 +00:00"; + $marketing_event->scheduled_to_end_at = "2024-02-04T00:00 +00:00"; + $marketing_event->budget = "11.1"; + $marketing_event->budget_type = "daily"; + $marketing_event->currency = "CAD"; + $marketing_event->utm_campaign = "other"; + $marketing_event->utm_source = "other"; + $marketing_event->utm_medium = "other"; + $marketing_event->event_type = "ad"; + $marketing_event->referring_domain = "instagram.com"; + $marketing_event->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events/998730532.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MarketingEvent::delete( + $this->test_session, + 998730532, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["engagements" => [["occurred_on" => "2024-01-15", "fetched_at" => null, "views_count" => 0, "impressions_count" => null, "clicks_count" => 0, "favorites_count" => 0, "comments_count" => null, "shares_count" => null, "ad_spend" => "10.0", "currency_code" => null, "is_cumulative" => true, "unsubscribes_count" => null, "complaints_count" => null, "fails_count" => null, "sends_count" => null, "unique_views_count" => null, "unique_clicks_count" => null, "utc_offset" => null], ["occurred_on" => "2024-01-16", "fetched_at" => null, "views_count" => 100, "impressions_count" => null, "clicks_count" => 50, "favorites_count" => null, "comments_count" => null, "shares_count" => null, "ad_spend" => null, "currency_code" => null, "is_cumulative" => true, "unsubscribes_count" => null, "complaints_count" => null, "fails_count" => null, "sends_count" => null, "unique_views_count" => null, "unique_clicks_count" => null, "utc_offset" => null], ["occurred_on" => "2024-01-17", "fetched_at" => null, "views_count" => 200, "impressions_count" => null, "clicks_count" => 100, "favorites_count" => null, "comments_count" => null, "shares_count" => null, "ad_spend" => null, "currency_code" => null, "is_cumulative" => true, "unsubscribes_count" => null, "complaints_count" => null, "fails_count" => null, "sends_count" => null, "unique_views_count" => null, "unique_clicks_count" => null, "utc_offset" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/marketing_events/998730532/engagements.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["engagements" => [["occurred_on" => "2024-01-15", "views_count" => 0, "clicks_count" => 0, "favorites_count" => 0, "ad_spend" => 10.0, "is_cumulative" => true], ["occurred_on" => "2024-01-16", "views_count" => 100, "clicks_count" => 50, "is_cumulative" => true], ["occurred_on" => "2024-01-17", "views_count" => 200, "clicks_count" => 100, "is_cumulative" => true]]]), + ), + ]); + + $marketing_event = new MarketingEvent($this->test_session); + $marketing_event->id = 998730532; + $marketing_event->engagements( + [], + ["engagements" => [["occurred_on" => "2024-01-15", "views_count" => 0, "clicks_count" => 0, "favorites_count" => 0, "ad_spend" => 10.0, "is_cumulative" => true], ["occurred_on" => "2024-01-16", "views_count" => 100, "clicks_count" => 50, "is_cumulative" => true], ["occurred_on" => "2024-01-17", "views_count" => 200, "clicks_count" => 100, "is_cumulative" => true]]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Metafield202404Test.php b/tests/Rest/Admin2024_04/Metafield202404Test.php new file mode 100644 index 00000000..9224ec3f --- /dev/null +++ b/tests/Rest/Admin2024_04/Metafield202404Test.php @@ -0,0 +1,1983 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=382285388&metafield%5Bowner_resource%5D=blog", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "382285388", "owner_resource" => "blog"]], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 519046726, "namespace" => "notes", "key" => "descriptionription", "value" => "Collection description", "description" => "Custom Collection notes", "owner_id" => 482865238, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/519046726"], ["id" => 624849518, "namespace" => "global", "key" => "description_tag", "value" => "Some seo description value", "description" => null, "owner_id" => 482865238, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/624849518"], ["id" => 1010236510, "namespace" => "global", "key" => "title_tag", "value" => "Some seo title value", "description" => null, "owner_id" => 482865238, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=482865238&metafield%5Bowner_resource%5D=collection", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "482865238", "owner_resource" => "collection"]], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 220591908, "namespace" => "discounts", "key" => "returning_customer", "value" => "no", "description" => "Customer deserves discount", "owner_id" => 207119551, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=207119551&metafield%5Bowner_resource%5D=customer", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "207119551", "owner_resource" => "customer"]], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 106172460, "namespace" => "notes", "key" => "note", "value" => "B flat", "description" => "This is for notes", "owner_id" => 622762746, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=622762746&metafield%5Bowner_resource%5D=draft_order", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "622762746", "owner_resource" => "draft_order"]], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 290519330, "namespace" => "translation", "key" => "title_fr", "value" => "Le TOS", "description" => "Page French title translation", "owner_id" => 131092082, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=131092082&metafield%5Bowner_resource%5D=page", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "131092082", "owner_resource" => "page"]], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 51714266, "namespace" => "my_namespace", "key" => "my_key", "value" => "Hello", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/51714266"], ["id" => 116539875, "namespace" => "descriptors", "key" => "subtitle", "value" => "The best ipod", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/116539875"], ["id" => 263497237, "namespace" => "installments", "key" => "disable", "value" => true, "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "boolean", "admin_graphql_api_id" => "gid://shopify/Metafield/263497237"], ["id" => 273160493, "namespace" => "facts", "key" => "isbn", "value" => "978-0-14-004259-7", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/273160493"], ["id" => 524118066, "namespace" => "facts", "key" => "ean", "value" => "0123456789012", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/524118066"], ["id" => 543636738, "namespace" => "reviews", "key" => "rating_count", "value" => 1, "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/543636738"], ["id" => 572384404, "namespace" => "reviews", "key" => "rating", "value" => "{\"value\": \"3.5\", \"scale_min\": \"1.0\", \"scale_max\": \"5.0\"}", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "rating", "admin_graphql_api_id" => "gid://shopify/Metafield/572384404"], ["id" => 613330208, "namespace" => "shopify_filter", "key" => "display", "value" => "retina", "description" => "This field keeps track of the type of display", "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/613330208"], ["id" => 779326701, "namespace" => "facts", "key" => "upc", "value" => "012345678901", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/779326701"], ["id" => 845366454, "namespace" => "translations", "key" => "title_fr", "value" => "produit", "description" => "French product title", "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/845366454"], ["id" => 861799889, "namespace" => "my_other_fields", "key" => "organic", "value" => true, "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "boolean", "admin_graphql_api_id" => "gid://shopify/Metafield/861799889"], ["id" => 870326793, "namespace" => "descriptors", "key" => "care_guide", "value" => "Wash in cold water", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => null, "admin_graphql_api_id" => "gid://shopify/Metafield/870326793"], ["id" => 908250163, "namespace" => "my_other_fields", "key" => "shipping_policy", "value" => "Ships for free in Canada", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "multi_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/908250163"], ["id" => 925288667, "namespace" => "my_other_fields", "key" => "year_released", "value" => 2019, "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/925288667"], ["id" => 1001077698, "namespace" => "my_fields", "key" => "best_for", "value" => "travel", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"], ["id" => 1029402048, "namespace" => "my_other_fields", "key" => "ingredients", "value" => "[\"apple\", \"music\", \"u2\"]", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "list.single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1029402048"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=632910392&metafield%5Bowner_resource%5D=product", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "632910392", "owner_resource" => "product"]], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 625663657, "namespace" => "translation", "key" => "title_fr", "value" => "tbn", "description" => "French product image title", "owner_id" => 850703190, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=850703190&metafield%5Bowner_resource%5D=product_image", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "850703190", "owner_resource" => "product_image"]], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=49148385&metafield%5Bowner_resource%5D=variants", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "49148385", "owner_resource" => "variants"]], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => []] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=674387490&metafield%5Bowner_resource%5D=article", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "674387490", "owner_resource" => "article"]], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 915396079, "namespace" => "notes", "key" => "buyer", "value" => "Notes about this buyer", "description" => "This field is for buyer notes", "owner_id" => 450789469, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?metafield%5Bowner_id%5D=450789469&metafield%5Bowner_resource%5D=order", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["metafield" => ["owner_id" => "450789469", "owner_resource" => "order"]], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 721389482, "namespace" => "affiliates", "key" => "app_key", "value" => "app_key", "description" => null, "owner_id" => 548380009, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "shop", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafields" => [["id" => 1069228974, "namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "description" => null, "owner_id" => 548380009, "created_at" => "2024-01-02T09:09:35-05:00", "updated_at" => "2024-01-02T09:09:35-05:00", "owner_resource" => "shop", "type" => "json", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228974"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json?since_id=721389482", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::all( + $this->test_session, + [], + ["since_id" => "721389482"], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228957, "namespace" => "my_fields", "key" => "sponsor", "value" => "Shopify", "description" => null, "owner_id" => 382285388, "created_at" => "2024-01-02T09:08:56-05:00", "updated_at" => "2024-01-02T09:08:56-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228957"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/382285388/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "sponsor", "type" => "single_line_text_field", "value" => "Shopify"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->blog_id = 382285388; + $metafield->namespace = "my_fields"; + $metafield->key = "sponsor"; + $metafield->type = "single_line_text_field"; + $metafield->value = "Shopify"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228958, "namespace" => "my_fields", "key" => "discount", "value" => "25%", "description" => null, "owner_id" => 482865238, "created_at" => "2024-01-02T09:08:58-05:00", "updated_at" => "2024-01-02T09:08:58-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228958"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/482865238/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "discount", "type" => "single_line_text_field", "value" => "25%"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->collection_id = 482865238; + $metafield->namespace = "my_fields"; + $metafield->key = "discount"; + $metafield->type = "single_line_text_field"; + $metafield->value = "25%"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228949, "namespace" => "discounts", "key" => "special", "value" => "yes", "description" => null, "owner_id" => 207119551, "created_at" => "2024-01-02T09:08:43-05:00", "updated_at" => "2024-01-02T09:08:43-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228949"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "discounts", "key" => "special", "value" => "yes", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->customer_id = 207119551; + $metafield->namespace = "discounts"; + $metafield->key = "special"; + $metafield->value = "yes"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228956, "namespace" => "my_fields", "key" => "purchase_order", "value" => "97453", "description" => null, "owner_id" => 622762746, "created_at" => "2024-01-02T09:08:55-05:00", "updated_at" => "2024-01-02T09:08:55-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228956"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/622762746/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "purchase_order", "type" => "single_line_text_field", "value" => "97453"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->draft_order_id = 622762746; + $metafield->namespace = "my_fields"; + $metafield->key = "purchase_order"; + $metafield->type = "single_line_text_field"; + $metafield->value = "97453"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228994, "namespace" => "my_fields", "key" => "subtitle", "value" => "A subtitle for my page", "description" => null, "owner_id" => 131092082, "created_at" => "2024-01-02T09:10:22-05:00", "updated_at" => "2024-01-02T09:10:22-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228994"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "subtitle", "type" => "single_line_text_field", "value" => "A subtitle for my page"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->page_id = 131092082; + $metafield->namespace = "my_fields"; + $metafield->key = "subtitle"; + $metafield->type = "single_line_text_field"; + $metafield->value = "A subtitle for my page"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228955, "namespace" => "inventory", "key" => "warehouse", "value" => 25, "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T09:08:52-05:00", "updated_at" => "2024-01-02T09:08:52-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228955"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "inventory", "key" => "warehouse", "value" => 25, "type" => "number_integer"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->product_id = 632910392; + $metafield->namespace = "inventory"; + $metafield->key = "warehouse"; + $metafield->value = 25; + $metafield->type = "number_integer"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228961, "namespace" => "translation", "key" => "title_spanish", "value" => "botas", "description" => null, "owner_id" => 850703190, "created_at" => "2024-01-02T09:09:02-05:00", "updated_at" => "2024-01-02T09:09:02-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228961"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_images/850703190/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "translation", "key" => "title_spanish", "type" => "single_line_text_field", "value" => "botas"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->product_image_id = 850703190; + $metafield->namespace = "translation"; + $metafield->key = "title_spanish"; + $metafield->type = "single_line_text_field"; + $metafield->value = "botas"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228970, "namespace" => "my_fields", "key" => "liner_material", "value" => "synthetic leather", "description" => null, "owner_id" => 49148385, "created_at" => "2024-01-02T09:09:31-05:00", "updated_at" => "2024-01-02T09:09:31-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228970"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/49148385/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "liner_material", "type" => "single_line_text_field", "value" => "synthetic leather"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->variant_id = 49148385; + $metafield->namespace = "my_fields"; + $metafield->key = "liner_material"; + $metafield->type = "single_line_text_field"; + $metafield->value = "synthetic leather"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228969, "namespace" => "my_fields", "key" => "category", "value" => "outdoors", "description" => null, "owner_id" => 674387490, "created_at" => "2024-01-02T09:09:29-05:00", "updated_at" => "2024-01-02T09:09:29-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228969"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/674387490/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "category", "type" => "single_line_text_field", "value" => "outdoors"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->article_id = 674387490; + $metafield->namespace = "my_fields"; + $metafield->key = "category"; + $metafield->type = "single_line_text_field"; + $metafield->value = "outdoors"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_22(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228979, "namespace" => "my_fields", "key" => "purchase_order", "value" => "123", "description" => null, "owner_id" => 450789469, "created_at" => "2024-01-02T09:09:45-05:00", "updated_at" => "2024-01-02T09:09:45-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228979"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "purchase_order", "type" => "single_line_text_field", "value" => "123"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->order_id = 450789469; + $metafield->namespace = "my_fields"; + $metafield->key = "purchase_order"; + $metafield->type = "single_line_text_field"; + $metafield->value = "123"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_23(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1069228982, "namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "description" => null, "owner_id" => 548380009, "created_at" => "2024-01-02T09:09:54-05:00", "updated_at" => "2024-01-02T09:09:54-05:00", "owner_resource" => "shop", "type" => "json", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228982"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "type" => "json"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->namespace = "my_fields"; + $metafield->key = "my_items"; + $metafield->value = "{\"items\":[\"some item\"]}"; + $metafield->type = "json"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_24(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 0] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/382285388/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["blog_id" => "382285388"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_25(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/482865238/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["collection_id" => "482865238"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_26(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_27(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/622762746/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["draft_order_id" => "622762746"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_28(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["page_id" => "131092082"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_29(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 16] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_30(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_images/850703190/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["product_image_id" => "850703190"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_31(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 0] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/49148385/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["variant_id" => "49148385"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_32(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 0] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/674387490/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["article_id" => "674387490"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_33(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_34(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_35(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 534526895, "namespace" => "translation", "key" => "title_fr", "value" => "Le iPod", "description" => "Blog French title translation", "owner_id" => 241253187, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/534526895"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/382285388/metafields/534526895.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 534526895, + ["blog_id" => "382285388"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_36(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1010236510, "namespace" => "global", "key" => "title_tag", "value" => "Some seo title value", "description" => null, "owner_id" => 482865238, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/482865238/metafields/1010236510.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 1010236510, + ["collection_id" => "482865238"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_37(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 220591908, "namespace" => "discounts", "key" => "returning_customer", "value" => "no", "description" => "Customer deserves discount", "owner_id" => 207119551, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/metafields/220591908.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 220591908, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_38(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 106172460, "namespace" => "notes", "key" => "note", "value" => "B flat", "description" => "This is for notes", "owner_id" => 622762746, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/622762746/metafields/106172460.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 106172460, + ["draft_order_id" => "622762746"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_39(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 290519330, "namespace" => "translation", "key" => "title_fr", "value" => "Le TOS", "description" => "Page French title translation", "owner_id" => 131092082, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082/metafields/290519330.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 290519330, + ["page_id" => "131092082"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_40(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 1001077698, "namespace" => "my_fields", "key" => "best_for", "value" => "travel", "description" => null, "owner_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/metafields/1001077698.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 1001077698, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_41(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 625663657, "namespace" => "translation", "key" => "title_fr", "value" => "tbn", "description" => "French product image title", "owner_id" => 850703190, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_images/850703190/metafields/625663657.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 625663657, + ["product_image_id" => "850703190"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_42(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 323119633, "namespace" => "my_fields", "key" => "color", "value" => "Pink", "description" => null, "owner_id" => 808950810, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/323119633"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/49148385/metafields/323119633.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 323119633, + ["variant_id" => "49148385"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_43(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 838981074, "namespace" => "translation", "key" => "title_fr", "value" => "Le Article", "description" => "Article French title translation", "owner_id" => 134645308, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/838981074"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/674387490/metafields/838981074.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 838981074, + ["article_id" => "674387490"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_44(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 915396079, "namespace" => "notes", "key" => "buyer", "value" => "Notes about this buyer", "description" => "This field is for buyer notes", "owner_id" => 450789469, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/metafields/915396079.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 915396079, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_45(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["id" => 721389482, "namespace" => "affiliates", "key" => "app_key", "value" => "app_key", "description" => null, "owner_id" => 548380009, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "owner_resource" => "shop", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields/721389482.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::find( + $this->test_session, + 721389482, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_46(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "a translated blog title", "owner_id" => 241253187, "namespace" => "translation", "key" => "title_fr", "id" => 534526895, "description" => "Blog French title translation", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:59-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/534526895"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/382285388/metafields/534526895.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "a translated blog title", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->blog_id = 382285388; + $metafield->id = 534526895; + $metafield->value = "a translated blog title"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_47(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "seo title", "owner_id" => 482865238, "namespace" => "global", "key" => "title_tag", "id" => 1010236510, "description" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:50-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/482865238/metafields/1010236510.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "seo title", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->collection_id = 482865238; + $metafield->id = 1010236510; + $metafield->value = "seo title"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_48(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "yes", "owner_id" => 207119551, "namespace" => "discounts", "key" => "returning_customer", "id" => 220591908, "description" => "Customer deserves discount", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:43-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/metafields/220591908.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "yes", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->customer_id = 207119551; + $metafield->id = 220591908; + $metafield->value = "yes"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_49(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "110000", "owner_id" => 622762746, "namespace" => "notes", "key" => "note", "id" => 106172460, "description" => "This is for notes", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:05-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/622762746/metafields/106172460.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "110000", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->draft_order_id = 622762746; + $metafield->id = 106172460; + $metafield->value = "110000"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_50(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "An updated translation", "owner_id" => 131092082, "namespace" => "translation", "key" => "title_fr", "id" => 290519330, "description" => "Page French title translation", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:20-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082/metafields/290519330.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "An updated translation", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->page_id = 131092082; + $metafield->id = 290519330; + $metafield->value = "An updated translation"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_51(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "having fun", "owner_id" => 632910392, "namespace" => "my_fields", "key" => "best_for", "id" => 1001077698, "description" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:56-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/metafields/1001077698.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "having fun", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->product_id = 632910392; + $metafield->id = 1001077698; + $metafield->value = "having fun"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_52(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "translated description", "owner_id" => 850703190, "namespace" => "translation", "key" => "title_fr", "id" => 625663657, "description" => "French product image title", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:26-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_images/850703190/metafields/625663657.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "translated description", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->product_image_id = 850703190; + $metafield->id = 625663657; + $metafield->value = "translated description"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_53(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "Red", "owner_id" => 808950810, "namespace" => "my_fields", "key" => "color", "id" => 323119633, "description" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:10:11-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/323119633"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/49148385/metafields/323119633.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "Red", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->variant_id = 49148385; + $metafield->id = 323119633; + $metafield->value = "Red"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_54(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "[\"something new\"]", "owner_id" => 548380009, "namespace" => "affiliates", "key" => "app_key", "id" => 721389482, "description" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:08:44-05:00", "owner_resource" => "shop", "type" => "list.single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields/721389482.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "[\"something new\"]", "type" => "list.single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->id = 721389482; + $metafield->value = "[\"something new\"]"; + $metafield->type = "list.single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_55(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "a translated title", "owner_id" => 134645308, "namespace" => "translation", "key" => "title_fr", "id" => 838981074, "description" => "Article French title translation", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:09:07-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/838981074"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/674387490/metafields/838981074.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "a translated title", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->article_id = 674387490; + $metafield->id = 838981074; + $metafield->value = "a translated title"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_56(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["metafield" => ["value" => "Provided a discount code", "owner_id" => 450789469, "namespace" => "notes", "key" => "buyer", "id" => 915396079, "description" => "This field is for buyer notes", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:08:48-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/metafields/915396079.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["metafield" => ["value" => "Provided a discount code", "type" => "single_line_text_field"]]), + ), + ]); + + $metafield = new Metafield($this->test_session); + $metafield->order_id = 450789469; + $metafield->id = 915396079; + $metafield->value = "Provided a discount code"; + $metafield->type = "single_line_text_field"; + $metafield->save(); + } + + /** + + * + * @return void + */ + public function test_57(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/blogs/382285388/metafields/534526895.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 534526895, + ["blog_id" => "382285388"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_58(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/collections/482865238/metafields/1010236510.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 1010236510, + ["collection_id" => "482865238"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_59(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/customers/207119551/metafields/220591908.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 220591908, + ["customer_id" => "207119551"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_60(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/draft_orders/622762746/metafields/106172460.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 106172460, + ["draft_order_id" => "622762746"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_61(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082/metafields/290519330.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 290519330, + ["page_id" => "131092082"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_62(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/metafields/1001077698.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 1001077698, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_63(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_images/850703190/metafields/625663657.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 625663657, + ["product_image_id" => "850703190"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_64(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/49148385/metafields/323119633.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 323119633, + ["variant_id" => "49148385"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_65(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/articles/674387490/metafields/838981074.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 838981074, + ["article_id" => "674387490"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_66(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/metafields/915396079.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 915396079, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_67(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/metafields/721389482.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Metafield::delete( + $this->test_session, + 721389482, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/MobilePlatformApplication202404Test.php b/tests/Rest/Admin2024_04/MobilePlatformApplication202404Test.php new file mode 100644 index 00000000..ea0c634d --- /dev/null +++ b/tests/Rest/Admin2024_04/MobilePlatformApplication202404Test.php @@ -0,0 +1,254 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_applications" => [["id" => 1066175996, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-01-02T09:02:51-05:00", "updated_at" => "2024-01-02T09:02:51-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => null], ["id" => 1066175997, "application_id" => "com.example", "platform" => "android", "created_at" => "2024-01-02T09:02:51-05:00", "updated_at" => "2024-01-02T09:02:51-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MobilePlatformApplication::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_application" => ["id" => 1066175998, "application_id" => "com.example", "platform" => "android", "created_at" => "2024-01-02T09:02:52-05:00", "updated_at" => "2024-01-02T09:02:52-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["mobile_platform_application" => ["platform" => "android", "application_id" => "com.example", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true]]), + ), + ]); + + $mobile_platform_application = new MobilePlatformApplication($this->test_session); + $mobile_platform_application->platform = "android"; + $mobile_platform_application->application_id = "com.example"; + $mobile_platform_application->sha256_cert_fingerprints = [ + "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5" + ]; + $mobile_platform_application->enabled_universal_or_app_links = true; + $mobile_platform_application->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_application" => ["id" => 1066176003, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-01-02T09:02:57-05:00", "updated_at" => "2024-01-02T09:02:57-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["mobile_platform_application" => ["platform" => "ios", "application_id" => "X1Y2.ca.domain.app", "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true]]), + ), + ]); + + $mobile_platform_application = new MobilePlatformApplication($this->test_session); + $mobile_platform_application->platform = "ios"; + $mobile_platform_application->application_id = "X1Y2.ca.domain.app"; + $mobile_platform_application->enabled_universal_or_app_links = true; + $mobile_platform_application->enabled_shared_webcredentials = true; + $mobile_platform_application->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_application" => ["id" => 1066176001, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-01-02T09:02:55-05:00", "updated_at" => "2024-01-02T09:02:55-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications/1066176001.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MobilePlatformApplication::find( + $this->test_session, + 1066176001, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_application" => ["application_id" => "com.example.news.app", "platform" => "android", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "id" => 1066175999, "created_at" => "2024-01-02T09:02:52-05:00", "updated_at" => "2024-01-02T09:02:53-05:00", "enabled_app_clips" => false, "app_clip_application_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications/1066175999.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["mobile_platform_application" => ["application_id" => "com.example.news.app", "platform" => "android", "created_at" => "2024-01-02T09:02:52-05:00", "updated_at" => "2024-01-02T09:02:52-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => null]]), + ), + ]); + + $mobile_platform_application = new MobilePlatformApplication($this->test_session); + $mobile_platform_application->id = 1066175999; + $mobile_platform_application->application_id = "com.example.news.app"; + $mobile_platform_application->platform = "android"; + $mobile_platform_application->created_at = "2024-01-02T09:02:52-05:00"; + $mobile_platform_application->updated_at = "2024-01-02T09:02:52-05:00"; + $mobile_platform_application->sha256_cert_fingerprints = [ + "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5" + ]; + $mobile_platform_application->enabled_universal_or_app_links = true; + $mobile_platform_application->enabled_shared_webcredentials = false; + $mobile_platform_application->enabled_app_clips = false; + $mobile_platform_application->app_clip_application_id = null; + $mobile_platform_application->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["mobile_platform_application" => ["application_id" => "A1B2.ca.domain.app", "platform" => "ios", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "id" => 1066176002, "created_at" => "2024-01-02T09:02:55-05:00", "updated_at" => "2024-01-02T09:02:56-05:00", "enabled_app_clips" => false, "app_clip_application_id" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications/1066176002.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["mobile_platform_application" => ["application_id" => "A1B2.ca.domain.app", "platform" => "ios", "created_at" => "2024-01-02T09:02:55-05:00", "updated_at" => "2024-01-02T09:02:55-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => null]]), + ), + ]); + + $mobile_platform_application = new MobilePlatformApplication($this->test_session); + $mobile_platform_application->id = 1066176002; + $mobile_platform_application->application_id = "A1B2.ca.domain.app"; + $mobile_platform_application->platform = "ios"; + $mobile_platform_application->created_at = "2024-01-02T09:02:55-05:00"; + $mobile_platform_application->updated_at = "2024-01-02T09:02:55-05:00"; + $mobile_platform_application->sha256_cert_fingerprints = []; + $mobile_platform_application->enabled_universal_or_app_links = true; + $mobile_platform_application->enabled_shared_webcredentials = true; + $mobile_platform_application->enabled_app_clips = false; + $mobile_platform_application->app_clip_application_id = null; + $mobile_platform_application->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/mobile_platform_applications/1066176000.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + MobilePlatformApplication::delete( + $this->test_session, + 1066176000, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Order202404Test.php b/tests/Rest/Admin2024_04/Order202404Test.php new file mode 100644 index 00000000..0019a2e7 --- /dev/null +++ b/tests/Rest/Admin2024_04/Order202404Test.php @@ -0,0 +1,1176 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?status=any", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["status" => "any"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?since_id=123", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["since_id" => "123"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "created_at" => "2008-01-10T11:00:00-05:00", "name" => "#1001", "total_price" => "598.94"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?fields=created_at%2Cid%2Cname%2Ctotal-price", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["fields" => "created_at,id,name,total-price"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?updated_at_min=2005-07-31T15%3A57%3A11-04%3A00", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["updated_at_min" => "2005-07-31T15:57:11-04:00"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "authorized", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:19-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?financial_status=authorized", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["financial_status" => "authorized"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["orders" => [["id" => 1073459972, "admin_graphql_api_id" => "gid://shopify/Order/1073459972", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "MFWM2CZK8", "confirmed" => true, "contact_email" => null, "created_at" => "2024-01-02T09:04:18-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/e6148b4dbdcddf58fe50af960b4aef46/authenticate?key=b0bc2568cd9e91f913293c7d4e703f1d", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:18-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "e6148b4dbdcddf58fe50af960b4aef46", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:18-05:00", "user_id" => null, "billing_address" => null, "customer" => null, "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823202, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823202", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json?ids=1073459972", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::all( + $this->test_session, + [], + ["ids" => "1073459972"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "name" => "#1001", "total_price" => "598.94", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json?fields=id%2Cline_items%2Cname%2Ctotal_price", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::find( + $this->test_session, + 450789469, + [], + ["fields" => "id,line_items,name,total_price"], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::find( + $this->test_session, + 450789469, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/count.json?status=any", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::count( + $this->test_session, + [], + ["status" => "any"], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/count.json?financial_status=authorized", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::count( + $this->test_session, + [], + ["financial_status" => "authorized"], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => "2024-01-02T09:04:41-05:00", "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:41-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/close.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->close( + [], + ); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:49-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/open.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->open( + [], + ); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]], "notice" => "Order has been canceled"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/cancel.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->cancel( + [], + ); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "587.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "587.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "587.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "10.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "598.94", "current_total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "current_total_tax" => "11.94", "current_total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "598.94", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:02-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 929361469, "admin_graphql_api_id" => "gid://shopify/Refund/929361469", "created_at" => "2024-01-02T09:04:02-05:00", "note" => "Order canceled", "order_id" => 450789469, "processed_at" => "2024-01-02T09:04:02-05:00", "restock" => false, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => null, "order_adjustments" => [], "transactions" => [["id" => 1068278498, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278498", "amount" => "10.00", "authorization" => null, "created_at" => "2024-01-02T09:04:02-05:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => "Bogus Gateway: Forced success", "order_id" => 450789469, "parent_id" => 1068278497, "payment_id" => "c901414060.3", "processed_at" => "2024-01-02T09:04:02-05:00", "receipt" => [], "source_name" => "755357713", "status" => "success", "test" => true, "user_id" => null]], "refund_line_items" => [["id" => 1058498313, "line_item_id" => 466157049, "location_id" => null, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 1058498314, "line_item_id" => 518995019, "location_id" => null, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 1058498315, "line_item_id" => 703073504, "location_id" => null, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]], "notice" => "Order has been canceled"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/cancel.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["amount" => "10.00", "currency" => "USD"]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->cancel( + [], + ["amount" => "10.00", "currency" => "USD"], + ); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "587.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "587.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "587.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "10.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "598.94", "current_total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "current_total_tax" => "11.94", "current_total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus", "gift_card"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "598.94", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:37-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 929361468, "admin_graphql_api_id" => "gid://shopify/Refund/929361468", "created_at" => "2024-01-02T09:03:37-05:00", "note" => "Order canceled", "order_id" => 450789469, "processed_at" => "2024-01-02T09:03:37-05:00", "restock" => false, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => null, "order_adjustments" => [["id" => 1030976843, "amount" => "89.64", "amount_set" => ["shop_money" => ["amount" => "89.64", "currency_code" => "USD"], "presentment_money" => ["amount" => "89.64", "currency_code" => "USD"]], "kind" => "refund_discrepancy", "order_id" => 450789469, "reason" => "Refund discrepancy", "refund_id" => 929361468, "tax_amount" => "0.00", "tax_amount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]]]], "transactions" => [["id" => 1068278488, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278488", "amount" => "10.00", "authorization" => null, "created_at" => "2024-01-02T09:03:37-05:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => "Bogus Gateway: Forced success", "order_id" => 450789469, "parent_id" => 1068278486, "payment_id" => "c901414060.4", "processed_at" => "2024-01-02T09:03:37-05:00", "receipt" => [], "source_name" => "755357713", "status" => "success", "test" => true, "user_id" => null], ["id" => 1068278489, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278489", "amount" => "100.00", "authorization" => null, "created_at" => "2024-01-02T09:03:37-05:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "gift_card", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 1068278487, "payment_id" => "c901414060.5", "processed_at" => "2024-01-02T09:03:37-05:00", "receipt" => ["gift_card_id" => 1035197676, "gift_card_last_characters" => "0d0d"], "source_name" => "755357713", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 1058498312, "line_item_id" => 466157049, "location_id" => null, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]], "notice" => "Order has been canceled"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/cancel.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["note" => "Customer made a mistake", "shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 466157049, "quantity" => 1, "restock_type" => "cancel", "location_id" => 24826418]], "transactions" => [["parent_id" => 1068278486, "amount" => "10.00", "kind" => "refund", "gateway" => "bogus"], ["parent_id" => 1068278487, "amount" => "100.00", "kind" => "refund", "gateway" => "gift_card"]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->cancel( + [], + ["refund" => ["note" => "Customer made a mistake", "shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 466157049, "quantity" => 1, "restock_type" => "cancel", "location_id" => 24826418]], "transactions" => [["parent_id" => 1068278486, "amount" => "10.00", "kind" => "refund", "gateway" => "bogus"], ["parent_id" => 1068278487, "amount" => "100.00", "kind" => "refund", "gateway" => "gift_card"]]]], + ); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459975, "admin_graphql_api_id" => "gid://shopify/Order/1073459975", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "0ZW4V9P7W", "confirmed" => true, "contact_email" => null, "created_at" => "2024-01-02T09:04:31-05:00", "currency" => "EUR", "current_subtotal_price" => "224.97", "current_subtotal_price_set" => ["shop_money" => ["amount" => "224.97", "currency_code" => "EUR"], "presentment_money" => ["amount" => "224.97", "currency_code" => "EUR"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "EUR"], "presentment_money" => ["amount" => "0.00", "currency_code" => "EUR"]], "current_total_duties_set" => null, "current_total_price" => "238.47", "current_total_price_set" => ["shop_money" => ["amount" => "238.47", "currency_code" => "EUR"], "presentment_money" => ["amount" => "238.47", "currency_code" => "EUR"]], "current_total_tax" => "13.50", "current_total_tax_set" => ["shop_money" => ["amount" => "13.50", "currency_code" => "EUR"], "presentment_money" => ["amount" => "13.50", "currency_code" => "EUR"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/dd4ddd56c817e612ca849e17672417ec/authenticate?key=327b7aa85e06b1de824125bcc1421d0d", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [""], "phone" => null, "po_number" => null, "presentment_currency" => "EUR", "processed_at" => "2024-01-02T09:04:31-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "224.97", "subtotal_price_set" => ["shop_money" => ["amount" => "224.97", "currency_code" => "EUR"], "presentment_money" => ["amount" => "224.97", "currency_code" => "EUR"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "13.50", "rate" => 0.06, "title" => "State tax", "price_set" => ["shop_money" => ["amount" => "13.50", "currency_code" => "EUR"], "presentment_money" => ["amount" => "13.50", "currency_code" => "EUR"]], "channel_liable" => false]], "taxes_included" => false, "test" => false, "token" => "dd4ddd56c817e612ca849e17672417ec", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "EUR"], "presentment_money" => ["amount" => "0.00", "currency_code" => "EUR"]], "total_line_items_price" => "224.97", "total_line_items_price_set" => ["shop_money" => ["amount" => "224.97", "currency_code" => "EUR"], "presentment_money" => ["amount" => "224.97", "currency_code" => "EUR"]], "total_outstanding" => "0.00", "total_price" => "238.47", "total_price_set" => ["shop_money" => ["amount" => "238.47", "currency_code" => "EUR"], "presentment_money" => ["amount" => "238.47", "currency_code" => "EUR"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "EUR"], "presentment_money" => ["amount" => "0.00", "currency_code" => "EUR"]], "total_tax" => "13.50", "total_tax_set" => ["shop_money" => ["amount" => "13.50", "currency_code" => "EUR"], "presentment_money" => ["amount" => "13.50", "currency_code" => "EUR"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:31-05:00", "user_id" => null, "billing_address" => null, "customer" => null, "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823207, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823207", "current_quantity" => 3, "fulfillable_quantity" => 3, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 1300, "name" => "Big Brown Bear Boots", "price" => "74.99", "price_set" => ["shop_money" => ["amount" => "74.99", "currency_code" => "EUR"], "presentment_money" => ["amount" => "74.99", "currency_code" => "EUR"]], "product_exists" => false, "product_id" => null, "properties" => [], "quantity" => 3, "requires_shipping" => true, "sku" => null, "taxable" => true, "title" => "Big Brown Bear Boots", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "EUR"], "presentment_money" => ["amount" => "0.00", "currency_code" => "EUR"]], "variant_id" => null, "variant_inventory_management" => null, "variant_title" => null, "vendor" => null, "tax_lines" => [["channel_liable" => false, "price" => "13.50", "price_set" => ["shop_money" => ["amount" => "13.50", "currency_code" => "EUR"], "presentment_money" => ["amount" => "13.50", "currency_code" => "EUR"]], "rate" => 0.06, "title" => "State tax"]], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["title" => "Big Brown Bear Boots", "price" => 74.99, "grams" => "1300", "quantity" => 3, "tax_lines" => [["price" => 13.5, "rate" => 0.06, "title" => "State tax"]]]], "transactions" => [["kind" => "sale", "status" => "success", "amount" => 238.47]], "total_tax" => 13.5, "currency" => "EUR"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "title" => "Big Brown Bear Boots", + "price" => 74.99, + "grams" => "1300", + "quantity" => 3, + "tax_lines" => [ + [ + "price" => 13.5, + "rate" => 0.06, + "title" => "State tax" + ] + ] + ] + ]; + $order->transactions = [ + [ + "kind" => "sale", + "status" => "success", + "amount" => 238.47 + ] + ]; + $order->total_tax = 13.5; + $order->currency = "EUR"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459969, "admin_graphql_api_id" => "gid://shopify/Order/1073459969", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "X7855I5Z8", "confirmed" => true, "contact_email" => "jane@example.com", "created_at" => "2024-01-02T09:04:00-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "jane@example.com", "estimated_taxes" => false, "financial_status" => "partially_paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/1410b8d45683e2f551d863ce38cfa228/authenticate?key=8b5fda62dfd116d1dca9837ff81e5175", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [""], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:00-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "1410b8d45683e2f551d863ce38cfa228", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "149.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:00-05:00", "user_id" => null, "billing_address" => ["first_name" => "John", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "John Smith", "country_code" => "CA", "province_code" => "ON"], "customer" => ["id" => 1073339463, "email" => "paul.norman@example.com", "created_at" => "2024-01-02T09:04:00-05:00", "updated_at" => "2024-01-02T09:04:00-05:00", "first_name" => "John", "last_name" => "Smith", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => null, "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => null, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339463", "default_address" => ["id" => 1053317293, "customer_id" => 1073339463, "first_name" => "Jane", "last_name" => "Smith", "company" => null, "address1" => "123 Fake Street", "address2" => null, "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4", "phone" => "777-777-7777", "name" => "Jane Smith", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823199, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823199", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => ["first_name" => "Jane", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "Jane Smith", "country_code" => "CA", "province_code" => "ON"], "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]], "customer" => ["first_name" => "Paul", "last_name" => "Norman", "email" => "paul.norman@example.com"], "billing_address" => ["first_name" => "John", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"], "shipping_address" => ["first_name" => "Jane", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"], "email" => "jane@example.com", "transactions" => [["kind" => "authorization", "status" => "success", "amount" => 50.0]], "financial_status" => "partially_paid"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->customer = [ + "first_name" => "Paul", + "last_name" => "Norman", + "email" => "paul.norman@example.com" + ]; + $order->billing_address = [ + "first_name" => "John", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "555-555-5555", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + ]; + $order->shipping_address = [ + "first_name" => "Jane", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "777-777-7777", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + ]; + $order->email = "jane@example.com"; + $order->transactions = [ + [ + "kind" => "authorization", + "status" => "success", + "amount" => 50.0 + ] + ]; + $order->financial_status = "partially_paid"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459974, "admin_graphql_api_id" => "gid://shopify/Order/1073459974", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "R1TIJIQDF", "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T09:04:27-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "pending", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/67087edca78728ca07684bc4a2210e57/authenticate?key=fab624a3f8689b5bf506c7063fee13ee", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:27-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "67087edca78728ca07684bc4a2210e57", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:27-05:00", "user_id" => null, "billing_address" => null, "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:04:27-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823206, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823206", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]], "customer" => ["id" => 207119551], "financial_status" => "pending"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->customer = [ + "id" => 207119551 + ]; + $order->financial_status = "pending"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459965, "admin_graphql_api_id" => "gid://shopify/Order/1073459965", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "THCEIXRIL", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-01-02T09:03:44-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/1f5645d22cb8e63a7d960147d70766c7/authenticate?key=41badde26dbc157bf732139c55c22c33", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:03:44-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "1f5645d22cb8e63a7d960147d70766c7", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:44-05:00", "user_id" => null, "billing_address" => null, "customer" => ["id" => 1073339460, "email" => "foo@example.com", "created_at" => "2024-01-02T09:03:44-05:00", "updated_at" => "2024-01-02T09:03:45-05:00", "first_name" => null, "last_name" => null, "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => null, "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => null, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339460"], "discount_applications" => [], "fulfillments" => [["id" => 1069019890, "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019890", "created_at" => "2024-01-02T09:03:44-05:00", "location_id" => 24826418, "name" => "#1002.1", "order_id" => 1073459965, "origin_address" => [], "receipt" => [], "service" => "shipwire-app", "shipment_status" => null, "status" => "success", "tracking_company" => null, "tracking_number" => null, "tracking_numbers" => [], "tracking_url" => null, "tracking_urls" => [], "updated_at" => "2024-01-02T09:03:44-05:00", "line_items" => [["id" => 1071823195, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823195", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]]]], "line_items" => [["id" => 1071823195, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823195", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["email" => "foo@example.com", "fulfillment_status" => "fulfilled", "fulfillments" => [["location_id" => 24826418]], "line_items" => [["variant_id" => 447654529, "quantity" => 1]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->email = "foo@example.com"; + $order->fulfillment_status = "fulfilled"; + $order->fulfillments = [ + [ + "location_id" => 24826418 + ] + ]; + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459984, "admin_graphql_api_id" => "gid://shopify/Order/1073459984", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "YQKT8VFVE", "confirmed" => true, "contact_email" => null, "created_at" => "2024-01-02T09:04:55-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/dd72f73e4b3adafc686efb63314bcc47/authenticate?key=f36a4ef195e4d2ba262760e912f81b62", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:55-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "dd72f73e4b3adafc686efb63314bcc47", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:55-05:00", "user_id" => null, "billing_address" => null, "customer" => null, "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823214, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823214", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459964, "admin_graphql_api_id" => "gid://shopify/Order/1073459964", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "JNUA8GGE7", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-01-02T09:03:41-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/7065e08289ab835723267728a976ecc7/authenticate?key=5beab51ad4cc281e7cc47ba519c71aa9", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:03:41-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "7065e08289ab835723267728a976ecc7", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:41-05:00", "user_id" => null, "billing_address" => null, "customer" => ["id" => 1073339459, "email" => "foo@example.com", "created_at" => "2024-01-02T09:03:41-05:00", "updated_at" => "2024-01-02T09:03:41-05:00", "first_name" => null, "last_name" => null, "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => null, "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => null, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339459"], "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823194, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823194", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["email" => "foo@example.com", "fulfillment_status" => "fulfilled", "line_items" => [["variant_id" => 447654529, "quantity" => 1]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->email = "foo@example.com"; + $order->fulfillment_status = "fulfilled"; + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_22(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459978, "admin_graphql_api_id" => "gid://shopify/Order/1073459978", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "CX8G0E4H7", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-01-02T09:04:38-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.00", "current_total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/0094cb3cab56374f0e187d9286cec300/authenticate?key=797bf39cee2c897036ad3202b2862bc9", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:38-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "199.00", "subtotal_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "0094cb3cab56374f0e187d9286cec300", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:38-05:00", "user_id" => null, "billing_address" => null, "customer" => ["id" => 1073339465, "email" => "foo@example.com", "created_at" => "2024-01-02T09:04:38-05:00", "updated_at" => "2024-01-02T09:04:38-05:00", "first_name" => null, "last_name" => null, "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => null, "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => null, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339465"], "discount_applications" => [], "fulfillments" => [["id" => 1069019892, "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019892", "created_at" => "2024-01-02T09:04:38-05:00", "location_id" => 487838322, "name" => "#1002.1", "order_id" => 1073459978, "origin_address" => [], "receipt" => [], "service" => "manual", "shipment_status" => null, "status" => "success", "tracking_company" => null, "tracking_number" => null, "tracking_numbers" => [], "tracking_url" => null, "tracking_urls" => [], "updated_at" => "2024-01-02T09:04:38-05:00", "line_items" => [["id" => 1071823209, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823209", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Nano - 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]]]], "line_items" => [["id" => 1071823209, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823209", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Nano - 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["email" => "foo@example.com", "fulfillment_status" => "fulfilled", "send_receipt" => true, "send_fulfillment_receipt" => true, "line_items" => [["variant_id" => 457924702, "quantity" => 1]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->email = "foo@example.com"; + $order->fulfillment_status = "fulfilled"; + $order->send_receipt = true; + $order->send_fulfillment_receipt = true; + $order->line_items = [ + [ + "variant_id" => 457924702, + "quantity" => 1 + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_23(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459981, "admin_graphql_api_id" => "gid://shopify/Order/1073459981", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "82C04VDXX", "confirmed" => true, "contact_email" => "jane@example.com", "created_at" => "2024-01-02T09:04:43-05:00", "currency" => "USD", "current_subtotal_price" => "181.09", "current_subtotal_price_set" => ["shop_money" => ["amount" => "181.09", "currency_code" => "USD"], "presentment_money" => ["amount" => "181.09", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "17.91", "current_total_discounts_set" => ["shop_money" => ["amount" => "17.91", "currency_code" => "USD"], "presentment_money" => ["amount" => "17.91", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "181.09", "current_total_price_set" => ["shop_money" => ["amount" => "181.09", "currency_code" => "USD"], "presentment_money" => ["amount" => "181.09", "currency_code" => "USD"]], "current_total_tax" => "0.00", "current_total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "FAKE30", "amount" => "17.91", "type" => "percentage"]], "email" => "jane@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/9fd15e7c469e1906e365f0589e5a02d9/authenticate?key=26f47355e74d44c6e49c3854c2dc7be0", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [""], "phone" => "+18885551234", "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:04:43-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "181.09", "subtotal_price_set" => ["shop_money" => ["amount" => "181.09", "currency_code" => "USD"], "presentment_money" => ["amount" => "181.09", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "9fd15e7c469e1906e365f0589e5a02d9", "total_discounts" => "17.91", "total_discounts_set" => ["shop_money" => ["amount" => "17.91", "currency_code" => "USD"], "presentment_money" => ["amount" => "17.91", "currency_code" => "USD"]], "total_line_items_price" => "199.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_outstanding" => "131.09", "total_price" => "181.09", "total_price_set" => ["shop_money" => ["amount" => "181.09", "currency_code" => "USD"], "presentment_money" => ["amount" => "181.09", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "0.00", "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:43-05:00", "user_id" => null, "billing_address" => ["first_name" => "John", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "John Smith", "country_code" => "CA", "province_code" => "ON"], "customer" => ["id" => 1073339467, "email" => "jane@example.com", "created_at" => "2024-01-02T09:04:43-05:00", "updated_at" => "2024-01-02T09:04:43-05:00", "first_name" => "John", "last_name" => "Smith", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => null, "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => null], "sms_marketing_consent" => null, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339467", "default_address" => ["id" => 1053317297, "customer_id" => 1073339467, "first_name" => "Jane", "last_name" => "Smith", "company" => null, "address1" => "123 Fake Street", "address2" => null, "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4", "phone" => "777-777-7777", "name" => "Jane Smith", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "manual", "value" => "9.0", "value_type" => "percentage", "allocation_method" => "across", "target_selection" => "all", "title" => "FAKE30", "description" => "FAKE30"]], "fulfillments" => [], "line_items" => [["id" => 1071823212, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823212", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => null, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => [["amount" => "17.91", "amount_set" => ["shop_money" => ["amount" => "17.91", "currency_code" => "USD"], "presentment_money" => ["amount" => "17.91", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [], "shipping_address" => ["first_name" => "Jane", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => null, "company" => null, "latitude" => null, "longitude" => null, "name" => "Jane Smith", "country_code" => "CA", "province_code" => "ON"], "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["variant_id" => 447654529, "quantity" => 1]], "email" => "jane@example.com", "phone" => "18885551234", "billing_address" => ["first_name" => "John", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"], "shipping_address" => ["first_name" => "Jane", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"], "transactions" => [["kind" => "sale", "status" => "success", "amount" => 50.0]], "financial_status" => "paid", "discount_codes" => [["code" => "FAKE30", "amount" => "9.00", "type" => "percentage"]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "variant_id" => 447654529, + "quantity" => 1 + ] + ]; + $order->email = "jane@example.com"; + $order->phone = "18885551234"; + $order->billing_address = [ + "first_name" => "John", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "555-555-5555", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + ]; + $order->shipping_address = [ + "first_name" => "Jane", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "777-777-7777", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + ]; + $order->transactions = [ + [ + "kind" => "sale", + "status" => "success", + "amount" => 50.0 + ] + ]; + $order->financial_status = "paid"; + $order->discount_codes = [ + [ + "code" => "FAKE30", + "amount" => "9.00", + "type" => "percentage" + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_24(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 1073459962, "admin_graphql_api_id" => "gid://shopify/Order/1073459962", "app_id" => 755357713, "browser_ip" => null, "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => null, "checkout_id" => null, "checkout_token" => null, "client_details" => null, "closed_at" => null, "confirmation_number" => "WRJK6R1YK", "confirmed" => true, "contact_email" => null, "created_at" => "2024-01-02T09:03:29-05:00", "currency" => "USD", "current_subtotal_price" => "255.92", "current_subtotal_price_set" => ["shop_money" => ["amount" => "255.92", "currency_code" => "USD"], "presentment_money" => ["amount" => "255.92", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "0.00", "current_total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "270.37", "current_total_price_set" => ["shop_money" => ["amount" => "270.37", "currency_code" => "USD"], "presentment_money" => ["amount" => "270.37", "currency_code" => "USD"]], "current_total_tax" => "14.45", "current_total_tax_set" => ["shop_money" => ["amount" => "14.45", "currency_code" => "USD"], "presentment_money" => ["amount" => "14.45", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => null, "landing_site" => null, "landing_site_ref" => null, "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1002", "note" => null, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/068b09bb4f214d81f02b7debbf3b8071/authenticate?key=0f49ccebf2dfc5652e1cbc1a95efcd64", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => [], "phone" => null, "po_number" => null, "presentment_currency" => "USD", "processed_at" => "2024-01-02T09:03:29-05:00", "reference" => null, "referring_site" => null, "source_identifier" => null, "source_name" => "755357713", "source_url" => null, "subtotal_price" => "255.92", "subtotal_price_set" => ["shop_money" => ["amount" => "255.92", "currency_code" => "USD"], "presentment_money" => ["amount" => "255.92", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "10.20", "rate" => 0.06, "title" => "State tax", "price_set" => ["shop_money" => ["amount" => "10.20", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.20", "currency_code" => "USD"]], "channel_liable" => false], ["price" => "4.25", "rate" => 0.025, "title" => "County tax", "price_set" => ["shop_money" => ["amount" => "4.25", "currency_code" => "USD"], "presentment_money" => ["amount" => "4.25", "currency_code" => "USD"]], "channel_liable" => false]], "taxes_included" => false, "test" => false, "token" => "068b09bb4f214d81f02b7debbf3b8071", "total_discounts" => "0.00", "total_discounts_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_line_items_price" => "255.92", "total_line_items_price_set" => ["shop_money" => ["amount" => "255.92", "currency_code" => "USD"], "presentment_money" => ["amount" => "255.92", "currency_code" => "USD"]], "total_outstanding" => "270.37", "total_price" => "270.37", "total_price_set" => ["shop_money" => ["amount" => "270.37", "currency_code" => "USD"], "presentment_money" => ["amount" => "270.37", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "14.45", "total_tax_set" => ["shop_money" => ["amount" => "14.45", "currency_code" => "USD"], "presentment_money" => ["amount" => "14.45", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:29-05:00", "user_id" => null, "billing_address" => null, "customer" => null, "discount_applications" => [], "fulfillments" => [], "line_items" => [["id" => 1071823190, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823190", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 1700, "name" => "Red Leather Coat", "price" => "129.99", "price_set" => ["shop_money" => ["amount" => "129.99", "currency_code" => "USD"], "presentment_money" => ["amount" => "129.99", "currency_code" => "USD"]], "product_exists" => false, "product_id" => null, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => null, "taxable" => true, "title" => "Red Leather Coat", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => null, "variant_inventory_management" => null, "variant_title" => null, "vendor" => null, "tax_lines" => [["channel_liable" => false, "price" => "7.81", "price_set" => ["shop_money" => ["amount" => "7.81", "currency_code" => "USD"], "presentment_money" => ["amount" => "7.81", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State tax"], ["channel_liable" => false, "price" => "3.26", "price_set" => ["shop_money" => ["amount" => "3.26", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.26", "currency_code" => "USD"]], "rate" => 0.025, "title" => "County tax"]], "duties" => [], "discount_allocations" => []], ["id" => 1071823191, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823191", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 750, "name" => "Blue Suede Shoes", "price" => "85.95", "price_set" => ["shop_money" => ["amount" => "85.95", "currency_code" => "USD"], "presentment_money" => ["amount" => "85.95", "currency_code" => "USD"]], "product_exists" => false, "product_id" => null, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => null, "taxable" => false, "title" => "Blue Suede Shoes", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => null, "variant_inventory_management" => null, "variant_title" => null, "vendor" => null, "tax_lines" => [], "duties" => [], "discount_allocations" => []], ["id" => 1071823192, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823192", "current_quantity" => 2, "fulfillable_quantity" => 2, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 320, "name" => "Raspberry Beret", "price" => "19.99", "price_set" => ["shop_money" => ["amount" => "19.99", "currency_code" => "USD"], "presentment_money" => ["amount" => "19.99", "currency_code" => "USD"]], "product_exists" => false, "product_id" => null, "properties" => [], "quantity" => 2, "requires_shipping" => true, "sku" => null, "taxable" => true, "title" => "Raspberry Beret", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => null, "variant_inventory_management" => null, "variant_title" => null, "vendor" => null, "tax_lines" => [["channel_liable" => false, "price" => "2.39", "price_set" => ["shop_money" => ["amount" => "2.39", "currency_code" => "USD"], "presentment_money" => ["amount" => "2.39", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State tax"], ["channel_liable" => false, "price" => "0.99", "price_set" => ["shop_money" => ["amount" => "0.99", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.99", "currency_code" => "USD"]], "rate" => 0.025, "title" => "County tax"]], "duties" => [], "discount_allocations" => []]], "payment_terms" => null, "refunds" => [], "shipping_address" => null, "shipping_lines" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["line_items" => [["title" => "Red Leather Coat", "price" => 129.99, "grams" => "1700", "quantity" => 1], ["title" => "Blue Suede Shoes", "price" => 85.95, "grams" => "750", "quantity" => 1, "taxable" => false], ["title" => "Raspberry Beret", "price" => 19.99, "grams" => "320", "quantity" => 2]], "tax_lines" => [["price" => 10.2, "rate" => 0.06, "title" => "State tax"], ["price" => 4.25, "rate" => 0.025, "title" => "County tax"]], "total_tax" => 14.45]]), + ), + ]); + + $order = new Order($this->test_session); + $order->line_items = [ + [ + "title" => "Red Leather Coat", + "price" => 129.99, + "grams" => "1700", + "quantity" => 1 + ], + [ + "title" => "Blue Suede Shoes", + "price" => 85.95, + "grams" => "750", + "quantity" => 1, + "taxable" => false + ], + [ + "title" => "Raspberry Beret", + "price" => 19.99, + "grams" => "320", + "quantity" => 2 + ] + ]; + $order->tax_lines = [ + [ + "price" => 10.2, + "rate" => 0.06, + "title" => "State tax" + ], + [ + "price" => 4.25, + "rate" => 0.025, + "title" => "County tax" + ] + ]; + $order->total_tax = 14.45; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_25(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:40-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_26(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => "Customer contacted us about a custom engraving on this iPod", "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:39-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["note" => "Customer contacted us about a custom engraving on this iPod"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->note = "Customer contacted us about a custom engraving on this iPod"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_27(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "colour", "value" => "red"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:51-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["note_attributes" => [["name" => "colour", "value" => "red"]]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->note_attributes = [ + [ + "name" => "colour", + "value" => "red" + ] + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_28(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "a-different@email.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "a-different@email.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:45-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["email" => "a-different@email.com"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->email = "a-different@email.com"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_29(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+15145556677", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:59-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["phone" => "+15145556677"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->phone = "+15145556677"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_30(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => true, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:36-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["buyer_accepts_marketing" => true]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->buyer_accepts_marketing = true; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_31(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:25-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => null, "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["customer" => null]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->customer = null; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_32(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "External, Inbound, Outbound", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:04:54-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["tags" => "External, Inbound, Outbound"]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->tags = "External, Inbound, Outbound"; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_33(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["order" => ["id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => null, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => null, "cancelled_at" => null, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => ["accept_language" => null, "browser_height" => null, "browser_ip" => "0.0.0.0", "browser_width" => null, "session_hash" => null, "user_agent" => null], "closed_at" => null, "confirmation_number" => null, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "current_total_additional_fees_set" => null, "current_total_discounts" => "3.33", "current_total_discounts_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "current_total_duties_set" => null, "current_total_price" => "199.65", "current_total_price_set" => ["shop_money" => ["amount" => "199.65", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.65", "currency_code" => "USD"]], "current_total_tax" => "3.98", "current_total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "customer_locale" => null, "device_id" => null, "discount_codes" => [["code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"]], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => null, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => null, "merchant_of_record_app_id" => null, "name" => "#1001", "note" => null, "note_attributes" => [["name" => "custom engraving", "value" => "Happy Birthday"], ["name" => "colour", "value" => "green"]], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => null, "original_total_duties_set" => null, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => null, "subtotal_price" => "597.00", "subtotal_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "tags" => "", "tax_exempt" => false, "tax_lines" => [["price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "channel_liable" => null]], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => ["shop_money" => ["amount" => "10.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "10.00", "currency_code" => "USD"]], "total_line_items_price" => "597.00", "total_line_items_price_set" => ["shop_money" => ["amount" => "597.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "597.00", "currency_code" => "USD"]], "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => ["shop_money" => ["amount" => "598.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "598.94", "currency_code" => "USD"]], "total_shipping_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax" => "11.94", "total_tax_set" => ["shop_money" => ["amount" => "11.94", "currency_code" => "USD"], "presentment_money" => ["amount" => "11.94", "currency_code" => "USD"]], "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-01-02T09:03:53-05:00", "user_id" => null, "billing_address" => ["first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "customer" => ["id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => null, "verified_email" => true, "multipass_identifier" => null, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => null, "consent_updated_at" => "2004-06-13T11:57:11-04:00"], "sms_marketing_consent" => ["state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-01-02T08:59:11-05:00", "consent_collected_from" => "OTHER"], "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => ["id" => 207119551, "customer_id" => 207119551, "first_name" => null, "last_name" => null, "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true]], "discount_applications" => [["target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"]], "fulfillments" => [["id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-01-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => [], "receipt" => ["testcase" => true, "authorization" => "123456"], "service" => "manual", "shipment_status" => null, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-01-02T08:59:11-05:00", "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]]], "line_items" => [["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]], ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], "payment_terms" => null, "refunds" => [["id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "user_id" => 548380009, "order_adjustments" => [], "transactions" => [["id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => null, "error_code" => null, "gateway" => "bogus", "kind" => "refund", "location_id" => null, "message" => null, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => [], "source_name" => "web", "status" => "success", "test" => false, "user_id" => null]], "refund_line_items" => [["id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.33", "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]], "discount_application_index" => 0]]]], ["id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax" => 3.98, "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => null, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "product_exists" => true, "product_id" => 632910392, "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => null, "tax_lines" => [["channel_liable" => null, "price" => "3.98", "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "rate" => 0.06, "title" => "State Tax"]], "duties" => [], "discount_allocations" => [["amount" => "3.34", "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]], "discount_application_index" => 0]]]]], "duties" => [], "additional_fees" => []]], "shipping_address" => ["first_name" => "Bob", "address1" => "123 Ship Street", "phone" => "+1(502)-459-2181", "city" => "Shipsville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => null, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"], "shipping_lines" => [["id" => 369256396, "carrier_identifier" => null, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "phone" => null, "price" => "0.00", "price_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "requested_fulfillment_service_id" => null, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["order" => ["shipping_address" => ["address1" => "123 Ship Street", "city" => "Shipsville"]]]), + ), + ]); + + $order = new Order($this->test_session); + $order->id = 450789469; + $order->shipping_address = [ + "address1" => "123 Ship Street", + "city" => "Shipsville" + ]; + $order->save(); + } + + /** + + * + * @return void + */ + public function test_34(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Order::delete( + $this->test_session, + 450789469, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/OrderRisk202404Test.php b/tests/Rest/Admin2024_04/OrderRisk202404Test.php new file mode 100644 index 00000000..7612f090 --- /dev/null +++ b/tests/Rest/Admin2024_04/OrderRisk202404Test.php @@ -0,0 +1,184 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["risk" => ["id" => 1029151490, "order_id" => 450789469, "checkout_id" => 901414060, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order came from an anonymous proxy", "merchant_message" => "This order came from an anonymous proxy"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/risks.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["risk" => ["message" => "This order came from an anonymous proxy", "recommendation" => "cancel", "score" => "1.0", "source" => "External", "cause_cancel" => true, "display" => true]]), + ), + ]); + + $order_risk = new OrderRisk($this->test_session); + $order_risk->order_id = 450789469; + $order_risk->message = "This order came from an anonymous proxy"; + $order_risk->recommendation = "cancel"; + $order_risk->score = "1.0"; + $order_risk->source = "External"; + $order_risk->cause_cancel = true; + $order_risk->display = true; + $order_risk->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["risks" => [["id" => 284138680, "order_id" => 450789469, "checkout_id" => null, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order was placed from a proxy IP", "merchant_message" => "This order was placed from a proxy IP"], ["id" => 1029151489, "order_id" => 450789469, "checkout_id" => 901414060, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order came from an anonymous proxy", "merchant_message" => "This order came from an anonymous proxy"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/risks.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + OrderRisk::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["risk" => ["id" => 284138680, "order_id" => 450789469, "checkout_id" => null, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order was placed from a proxy IP", "merchant_message" => "This order was placed from a proxy IP"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/risks/284138680.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + OrderRisk::find( + $this->test_session, + 284138680, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["risk" => ["order_id" => 450789469, "cause_cancel" => false, "message" => "After further review, this is a legitimate order", "recommendation" => "accept", "score" => "0.0", "source" => "External", "id" => 284138680, "checkout_id" => null, "display" => true, "merchant_message" => "After further review, this is a legitimate order"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/risks/284138680.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["risk" => ["message" => "After further review, this is a legitimate order", "recommendation" => "accept", "source" => "External", "cause_cancel" => false, "score" => "0.0"]]), + ), + ]); + + $order_risk = new OrderRisk($this->test_session); + $order_risk->order_id = 450789469; + $order_risk->id = 284138680; + $order_risk->message = "After further review, this is a legitimate order"; + $order_risk->recommendation = "accept"; + $order_risk->source = "External"; + $order_risk->cause_cancel = false; + $order_risk->score = "0.0"; + $order_risk->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/risks/284138680.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + OrderRisk::delete( + $this->test_session, + 284138680, + ["order_id" => "450789469"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Page202404Test.php b/tests/Rest/Admin2024_04/Page202404Test.php new file mode 100644 index 00000000..b8c6e3fd --- /dev/null +++ b/tests/Rest/Admin2024_04/Page202404Test.php @@ -0,0 +1,417 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["pages" => [["id" => 108828309, "title" => "Sample Page", "shop_id" => 548380009, "handle" => "sample", "body_html" => "

this is a sample page.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => null, "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/108828309"], ["id" => 169524623, "title" => "Store hours", "shop_id" => 548380009, "handle" => "store-hours", "body_html" => "

We never close.

", "author" => "Jobs", "created_at" => "2013-12-31T19:00:00-05:00", "updated_at" => "2013-12-31T19:00:00-05:00", "published_at" => "2014-02-01T19:00:00-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/169524623"], ["id" => 322471, "title" => "Support", "shop_id" => 548380009, "handle" => "support", "body_html" => "

Come in store for support.

", "author" => "Dennis", "created_at" => "2009-07-15T20:00:00-04:00", "updated_at" => "2009-07-16T20:00:00-04:00", "published_at" => null, "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/322471"], ["id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Page::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["pages" => [["id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"], ["id" => 169524623, "title" => "Store hours", "shop_id" => 548380009, "handle" => "store-hours", "body_html" => "

We never close.

", "author" => "Jobs", "created_at" => "2013-12-31T19:00:00-05:00", "updated_at" => "2013-12-31T19:00:00-05:00", "published_at" => "2014-02-01T19:00:00-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/169524623"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages.json?since_id=108828309", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Page::all( + $this->test_session, + [], + ["since_id" => "108828309"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["id" => 1025371371, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-01-02T09:31:40-05:00", "updated_at" => "2024-01-02T09:31:40-05:00", "published_at" => "2024-01-02T09:31:40-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371371"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

"]]), + ), + ]); + + $page = new Page($this->test_session); + $page->title = "Warranty information"; + $page->body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

"; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["id" => 1025371374, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-01-02T09:31:45-05:00", "updated_at" => "2024-01-02T09:31:45-05:00", "published_at" => "2024-01-02T09:31:45-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371374"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "metafields" => [["key" => "new", "value" => "new value", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $page = new Page($this->test_session); + $page->title = "Warranty information"; + $page->body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

"; + $page->metafields = [ + [ + "key" => "new", + "value" => "new value", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["id" => 1025371372, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-01-02T09:31:41-05:00", "updated_at" => "2024-01-02T09:31:41-05:00", "published_at" => null, "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371372"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "published" => false]]), + ), + ]); + + $page = new Page($this->test_session); + $page->title = "Warranty information"; + $page->body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

"; + $page->published = false; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 4] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Page::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Page::find( + $this->test_session, + 131092082, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["shop_id" => 548380009, "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["metafields" => [["key" => "new", "value" => "new value", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $page = new Page($this->test_session); + $page->id = 131092082; + $page->metafields = [ + [ + "key" => "new", + "value" => "new value", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["shop_id" => 548380009, "published_at" => null, "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-01-02T09:31:34-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["published" => false]]), + ), + ]); + + $page = new Page($this->test_session); + $page->id = 131092082; + $page->published = false; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["shop_id" => 548380009, "published_at" => "2024-01-02T09:31:31-05:00", "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-01-02T09:31:31-05:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["published" => true]]), + ), + ]); + + $page = new Page($this->test_session); + $page->id = 131092082; + $page->published = true; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["shop_id" => 548380009, "author" => "Christopher Gorski", "body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "handle" => "new-warranty", "title" => "New warranty", "id" => 131092082, "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-01-02T09:31:42-05:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "author" => "Christopher Gorski", "title" => "New warranty", "handle" => "new-warranty"]]), + ), + ]); + + $page = new Page($this->test_session); + $page->id = 131092082; + $page->body_html = "

Returns accepted if we receive the items 14 days after purchase.

"; + $page->author = "Christopher Gorski"; + $page->title = "New warranty"; + $page->handle = "new-warranty"; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["page" => ["shop_id" => 548380009, "body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "title" => "Terms of Services", "handle" => "tos", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-01-02T09:31:43-05:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => null, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["page" => ["body_html" => "

Returns accepted if we receive the items 14 days after purchase.

"]]), + ), + ]); + + $page = new Page($this->test_session); + $page->id = 131092082; + $page->body_html = "

Returns accepted if we receive the items 14 days after purchase.

"; + $page->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/pages/131092082.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Page::delete( + $this->test_session, + 131092082, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Payment202404Test.php b/tests/Rest/Admin2024_04/Payment202404Test.php new file mode 100644 index 00000000..fbf26fdf --- /dev/null +++ b/tests/Rest/Admin2024_04/Payment202404Test.php @@ -0,0 +1,181 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment" => ["id" => 1071573807, "unique_token" => "client-side-idempotency-token", "payment_processing_error_message" => null, "next_action" => ["redirect_url" => null], "fraudulent" => false, "transaction" => null, "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551], "checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#446514532", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "fraudulent" => false, "transaction" => ["amount" => "598.94", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => null, "status" => "success", "test" => false, "receipt" => ["testcase" => true, "authorization" => "123456"], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"]], "credit_card" => null], ["id" => 1071573807, "unique_token" => "client-side-idempotency-token", "payment_processing_error_message" => null, "fraudulent" => false, "transaction" => null, "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551]]], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-01-02T09:29:09-05:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551], "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["payment" => ["request_details" => ["ip_address" => "123.1.1.1", "accept_language" => "en-US,en;q=0.8,fr;q=0.6", "user_agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"], "amount" => "398.00", "session_id" => "global-d1c544a220fe3e0f", "unique_token" => "client-side-idempotency-token"]]), + ), + ]); + + $payment = new Payment($this->test_session); + $payment->checkout_id = "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x"; + $payment->request_details = [ + "ip_address" => "123.1.1.1", + "accept_language" => "en-US,en;q=0.8,fr;q=0.6", + "user_agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36" + ]; + $payment->amount = "398.00"; + $payment->session_id = "global-d1c544a220fe3e0f"; + $payment->unique_token = "client-side-idempotency-token"; + $payment->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "transaction" => ["amount" => "598.94", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => null, "status" => "success", "test" => false], "credit_card" => null, "checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#446514532", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "transaction" => ["amount" => "598.94", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => null, "status" => "success", "test" => false], "credit_card" => null]], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06]], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => null], "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payment::all( + $this->test_session, + ["checkout_id" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment" => ["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "next_action" => ["redirect_url" => null], "fraudulent" => false, "transaction" => ["amount" => "419.49", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => null, "created_at" => "2024-01-02T09:29:10-05:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 1068278521, "kind" => "authorization", "message" => null, "status" => "failure", "test" => false, "receipt" => [], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => null], "credit_card" => null, "checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#446514532", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "fraudulent" => false, "transaction" => ["amount" => "419.49", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => null, "created_at" => "2024-01-02T09:29:10-05:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 1068278521, "kind" => "authorization", "message" => null, "status" => "failure", "test" => false, "receipt" => [], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => null], "credit_card" => null]], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06]], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => null], "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payment::find( + $this->test_session, + 25428999, + ["checkout_id" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment" => ["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "next_action" => ["redirect_url" => null], "fraudulent" => false, "transaction" => ["amount" => "419.49", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => null, "created_at" => "2024-01-02T09:29:06-05:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 1068278520, "kind" => "authorization", "message" => null, "status" => "success", "test" => false, "receipt" => [], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => null], "credit_card" => null, "checkout" => ["completed_at" => null, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => null, "discount_code" => null, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => null, "location_id" => null, "name" => "#446514532", "note" => "", "note_attributes" => ["custom engraving" => "Happy Birthday", "colour" => "green"], "order_id" => null, "order_status_url" => null, "order" => null, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [["id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => null, "fraudulent" => false, "transaction" => ["amount" => "419.49", "amount_in" => null, "amount_out" => null, "amount_rounding" => null, "authorization" => null, "created_at" => "2024-01-02T09:29:06-05:00", "currency" => "USD", "error_code" => null, "parent_id" => null, "gateway" => "bogus", "id" => 1068278520, "kind" => "authorization", "message" => null, "status" => "success", "test" => false, "receipt" => [], "location_id" => null, "user_id" => null, "transaction_group_id" => null, "device_id" => null, "payment_details" => null], "credit_card" => null]], "phone" => null, "shopify_payments_account_id" => null, "privacy_policy_url" => null, "refund_policy_url" => null, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => null, "source_identifier" => null, "source_name" => "web", "source_url" => null, "subscription_policy_url" => null, "subtotal_price" => "398.00", "shipping_policy_url" => null, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => null, "terms_of_service_url" => null, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => null, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => null, "total_additional_fees" => null, "line_items" => [["id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []], ["id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => null, "line_price" => "199.00", "properties" => [], "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []]], "gift_cards" => [], "tax_lines" => [["price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06]], "tax_manipulations" => [], "shipping_line" => ["handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []], "shipping_rate" => ["id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"], "shipping_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "credit_card" => ["first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => null], "billing_address" => ["id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => null, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"], "applied_discount" => null, "applied_discounts" => [], "discount_violations" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payment::find( + $this->test_session, + 25428999, + ["checkout_id" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payment::count( + $this->test_session, + ["checkout_id" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/PaymentGateway202404Test.php b/tests/Rest/Admin2024_04/PaymentGateway202404Test.php new file mode 100644 index 00000000..1f77e687 --- /dev/null +++ b/tests/Rest/Admin2024_04/PaymentGateway202404Test.php @@ -0,0 +1,202 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment_gateways" => [["disabled" => true, "id" => 170508070, "name" => "Cash on Delivery (COD)", "provider_id" => 140, "sandbox" => false, "supports_network_tokenization" => null, "type" => "ManualPaymentGateway", "enabled_card_brands" => [], "processing_method" => "manual", "service_name" => "Cash on Delivery (COD)", "metadata" => [], "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00"], ["disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => null, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => ["google_pay_merchant_id" => 548380009], "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-01-02T09:02:13-05:00", "credential4" => null, "attachment" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PaymentGateway::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment_gateways" => [["disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => null, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => ["google_pay_merchant_id" => 548380009], "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-01-02T09:02:10-05:00", "credential4" => null, "attachment" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways.json?disabled=false", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PaymentGateway::all( + $this->test_session, + [], + ["disabled" => "false"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment_gateway" => ["disabled" => false, "id" => 1070028413, "name" => "authorize_net", "provider_id" => 7, "sandbox" => false, "supports_network_tokenization" => null, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club", "jcb"], "processing_method" => "direct", "service_name" => "Authorize.net", "metadata" => [], "created_at" => "2024-01-02T09:02:15-05:00", "updated_at" => "2024-01-02T09:02:15-05:00", "credential1" => "someone@example.com", "credential3" => null, "credential4" => null, "attachment" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["payment_gateway" => ["credential1" => "someone@example.com", "provider_id" => 7]]), + ), + ]); + + $payment_gateway = new PaymentGateway($this->test_session); + $payment_gateway->credential1 = "someone@example.com"; + $payment_gateway->provider_id = 7; + $payment_gateway->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment" => ["disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => null, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => ["google_pay_merchant_id" => 548380009], "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-01-02T09:02:14-05:00", "credential4" => null, "attachment" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways/431363653.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PaymentGateway::find( + $this->test_session, + 431363653, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payment_gateway" => ["disabled" => false, "id" => 170508070, "name" => "Cash on Delivery (COD)", "provider_id" => 140, "sandbox" => true, "supports_network_tokenization" => null, "type" => "ManualPaymentGateway", "enabled_card_brands" => [], "processing_method" => "manual", "service_name" => "Cash on Delivery (COD)", "metadata" => [], "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:02:13-05:00"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways/170508070.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["payment_gateway" => ["sandbox" => true]]), + ), + ]); + + $payment_gateway = new PaymentGateway($this->test_session); + $payment_gateway->id = 170508070; + $payment_gateway->sandbox = true; + $payment_gateway->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/payment_gateways/170508070.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PaymentGateway::delete( + $this->test_session, + 170508070, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/PaymentTransaction202404Test.php b/tests/Rest/Admin2024_04/PaymentTransaction202404Test.php new file mode 100644 index 00000000..da6cd098 --- /dev/null +++ b/tests/Rest/Admin2024_04/PaymentTransaction202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transactions" => [["id" => 699519475, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-50.00", "fee" => "0.00", "net" => "-50.00", "source_id" => 460709370, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2024-01-03T09:28:43-05:00", "adjustment_order_transactions" => []], ["id" => 77412310, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "50.00", "fee" => "0.00", "net" => "50.00", "source_id" => 374511569, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2024-01-03T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 1006917261, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-3.45", "fee" => "0.00", "net" => "-3.45", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 777128868, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-8.05", "fee" => "0.00", "net" => "-8.05", "source_id" => 777128868, "source_type" => "Payments::Refund", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 758509248, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-1.50", "fee" => "-0.25", "net" => "-1.75", "source_id" => 764194150, "source_type" => "charge", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 746296004, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "10.00", "fee" => "2.00", "net" => "8.00", "source_id" => 746296004, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 890672011, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 515523000, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.65", "net" => "10.85", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 482793472, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "0.45", "fee" => "0.00", "net" => "0.45", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 382557793, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "0.20", "fee" => "0.00", "net" => "0.20", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 365577382, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-3.45", "fee" => "0.00", "net" => "-3.45", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 201521674, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-2.00", "fee" => "0.00", "net" => "-2.00", "source_id" => 971443537, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 461790020, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 188711209, "type" => "capture", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-11.37", "fee" => "0.00", "net" => "-11.37", "source_id" => 188711209, "source_type" => "charge", "source_order_id" => 923751907, "source_order_transaction_id" => 972637531, "processed_at" => "2024-01-02T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 977134221, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 774282320, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 46484353, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 726130462, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-11.50", "fee" => "15.00", "net" => "-26.50", "source_id" => 598735659, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 590656313, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 585267611, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-50.00", "fee" => "0.00", "net" => "-50.00", "source_id" => 46484353, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 295058327, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "-15.00", "net" => "115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 144665135, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "2.83", "fee" => "-15.00", "net" => "17.83", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => null], ["id" => 1039379438, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-10.00", "fee" => "0.00", "net" => "-10.00", "source_id" => 98265485, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 996672915, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 996672915, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 911614749, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 31693764, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 843310825, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.63", "net" => "10.87", "source_id" => 843310825, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 841651232, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 841651232, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 777723124, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 777723124, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 744334347, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 14450113, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [["id" => 348327371, "amount" => "11.50", "order" => ["id" => 625362839, "name" => "#1001"]]]], ["id" => 717600021, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 717600021, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 645292099, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 717600021, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 637679484, "type" => "SHOPIFY_COLLECTIVE_DEBIT_REVERSAL", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1.00", "fee" => "0.00", "net" => "1.00", "source_id" => 637679484, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 620327031, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.63", "net" => "10.87", "source_id" => 620327031, "source_type" => "charge", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 524892362, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 87730317, "source_type" => "adjustment", "source_order_id" => 625362839, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [["id" => 348327371, "amount" => "11.50", "order" => ["id" => 625362839, "name" => "#1001"]]]], ["id" => 510004917, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 504962724, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 504303358, "type" => "seller_protection_credit_reversal", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 504303358, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 459441379, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 14450113, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [["id" => 348327371, "amount" => "11.50", "order" => ["id" => 625362839, "name" => "#1001"]]]], ["id" => 427940661, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "150.00", "fee" => "0.00", "net" => "150.00", "source_id" => 427940661, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 400852343, "type" => "reserve", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-42.00", "fee" => "0.00", "net" => "-42.00", "source_id" => null, "source_type" => null, "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 381560291, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-150.00", "fee" => "0.00", "net" => "-150.00", "source_id" => 381560291, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 357948134, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "10.00", "fee" => "0.46", "net" => "9.54", "source_id" => 971443537, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 461790020, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 344667176, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.50", "fee" => "0.50", "net" => "100.00", "source_id" => 291591126, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 316417004, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.50", "net" => "11.00", "source_id" => 316417004, "source_type" => "charge", "source_order_id" => 753768948, "source_order_transaction_id" => 316417004, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 294868963, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 294868963, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 268738895, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1000.00", "fee" => "0.00", "net" => "1000.00", "source_id" => 60315799, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 250467535, "type" => "reserve", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "42.00", "fee" => "0.00", "net" => "42.00", "source_id" => null, "source_type" => null, "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 217609728, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.00", "net" => "11.50", "source_id" => 930299385, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 348327371, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 193054836, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.50", "net" => "11.00", "source_id" => 193054836, "source_type" => "charge", "source_order_id" => 753768948, "source_order_transaction_id" => 192808135, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 138130604, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "150.00", "fee" => "0.00", "net" => "150.00", "source_id" => 138130604, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 117567798, "type" => "SHOPIFY_COLLECTIVE_DEBIT_REVERSAL", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1.00", "fee" => "0.00", "net" => "1.00", "source_id" => 117567798, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 105879119, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 105879119, "source_type" => "adjustment", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []], ["id" => 103606837, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 103606837, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => null, "source_order_transaction_id" => null, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => null], ["id" => 567994517, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.65", "net" => "10.85", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2014-01-21T13:05:38-05:00", "adjustment_order_transactions" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/balance/transactions.json?payout_id=623721858", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PaymentTransaction::transactions( + $this->test_session, + [], + ["payout_id" => "623721858"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Payout202404Test.php b/tests/Rest/Admin2024_04/Payout202404Test.php new file mode 100644 index 00000000..8363d625 --- /dev/null +++ b/tests/Rest/Admin2024_04/Payout202404Test.php @@ -0,0 +1,117 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payouts" => [["id" => 512467833, "status" => "failed", "date" => "2013-12-01", "currency" => "USD", "amount" => "43.12", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "45.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 39438702, "status" => "in_transit", "date" => "2013-11-01", "currency" => "USD", "amount" => "43.12", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "45.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 917000993, "status" => "failed", "date" => "2012-11-13", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 867808544, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 725076685, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 714327683, "status" => "failed", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 631321250, "status" => "scheduled", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/payouts.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payout::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payouts" => [["id" => 867808544, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 725076685, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 714327683, "status" => "failed", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 631321250, "status" => "scheduled", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]], ["id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/payouts.json?date_max=2012-11-12", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payout::all( + $this->test_session, + [], + ["date_max" => "2012-11-12"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["payout" => ["id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => ["adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shopify_payments/payouts/623721858.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Payout::find( + $this->test_session, + 623721858, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Policy202404Test.php b/tests/Rest/Admin2024_04/Policy202404Test.php new file mode 100644 index 00000000..43eb82bc --- /dev/null +++ b/tests/Rest/Admin2024_04/Policy202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["policies" => [["body" => "You have 30 days to get a refund", "created_at" => "2024-01-02T08:58:20-05:00", "updated_at" => "2024-01-02T08:58:20-05:00", "handle" => "refund-policy", "title" => "Refund policy", "url" => "https://jsmith.myshopify.com/548380009/policies/997884056"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/policies.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Policy::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/PriceRule202404Test.php b/tests/Rest/Admin2024_04/PriceRule202404Test.php new file mode 100644 index 00000000..e10b6a1c --- /dev/null +++ b/tests/Rest/Admin2024_04/PriceRule202404Test.php @@ -0,0 +1,356 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 996606716, "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "each", "allocation_limit" => 3, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2018-03-21T20:00:00-04:00", "ends_at" => null, "created_at" => "2024-01-02T09:11:05-05:00", "updated_at" => "2024-01-02T09:11:05-05:00", "entitled_product_ids" => [921728736], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [841564295], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => 2, "entitled_quantity" => 1], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "Buy2iPodsGetiPodTouchForFree", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606716"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["price_rule" => ["title" => "Buy2iPodsGetiPodTouchForFree", "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "each", "starts_at" => "2018-03-22T00:00:00-00:00", "prerequisite_collection_ids" => [841564295], "entitled_product_ids" => [921728736], "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => 2, "entitled_quantity" => 1], "allocation_limit" => 3]]), + ), + ]); + + $price_rule = new PriceRule($this->test_session); + $price_rule->title = "Buy2iPodsGetiPodTouchForFree"; + $price_rule->value_type = "percentage"; + $price_rule->value = "-100.0"; + $price_rule->customer_selection = "all"; + $price_rule->target_type = "line_item"; + $price_rule->target_selection = "entitled"; + $price_rule->allocation_method = "each"; + $price_rule->starts_at = "2018-03-22T00:00:00-00:00"; + $price_rule->prerequisite_collection_ids = [ + 841564295 + ]; + $price_rule->entitled_product_ids = [ + 921728736 + ]; + $price_rule->prerequisite_to_entitlement_quantity_ratio = [ + "prerequisite_quantity" => 2, + "entitled_quantity" => 1 + ]; + $price_rule->allocation_limit = 3; + $price_rule->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 996606713, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => null, "created_at" => "2024-01-02T09:11:01-05:00", "updated_at" => "2024-01-02T09:11:01-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606713"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["price_rule" => ["title" => "SUMMERSALE10OFF", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "starts_at" => "2017-01-19T17:59:10Z"]]), + ), + ]); + + $price_rule = new PriceRule($this->test_session); + $price_rule->title = "SUMMERSALE10OFF"; + $price_rule->target_type = "line_item"; + $price_rule->target_selection = "all"; + $price_rule->allocation_method = "across"; + $price_rule->value_type = "fixed_amount"; + $price_rule->value = "-10.0"; + $price_rule->customer_selection = "all"; + $price_rule->starts_at = "2017-01-19T17:59:10Z"; + $price_rule->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 996606715, "value_type" => "percentage", "value" => "-15.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => null, "created_at" => "2024-01-02T09:11:03-05:00", "updated_at" => "2024-01-02T09:11:03-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [841564295], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "15OFFCOLLECTION", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606715"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["price_rule" => ["title" => "15OFFCOLLECTION", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "across", "value_type" => "percentage", "value" => "-15.0", "customer_selection" => "all", "entitled_collection_ids" => [841564295], "starts_at" => "2017-01-19T17:59:10Z"]]), + ), + ]); + + $price_rule = new PriceRule($this->test_session); + $price_rule->title = "15OFFCOLLECTION"; + $price_rule->target_type = "line_item"; + $price_rule->target_selection = "entitled"; + $price_rule->allocation_method = "across"; + $price_rule->value_type = "percentage"; + $price_rule->value = "-15.0"; + $price_rule->customer_selection = "all"; + $price_rule->entitled_collection_ids = [ + 841564295 + ]; + $price_rule->starts_at = "2017-01-19T17:59:10Z"; + $price_rule->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 996606714, "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "shipping_line", "target_selection" => "all", "allocation_method" => "each", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => 20, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => null, "created_at" => "2024-01-02T09:11:02-05:00", "updated_at" => "2024-01-02T09:11:02-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => ["greater_than_or_equal_to" => "50.0"], "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "FREESHIPPING", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606714"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["price_rule" => ["title" => "FREESHIPPING", "target_type" => "shipping_line", "target_selection" => "all", "allocation_method" => "each", "value_type" => "percentage", "value" => "-100.0", "usage_limit" => 20, "customer_selection" => "all", "prerequisite_subtotal_range" => ["greater_than_or_equal_to" => "50.0"], "starts_at" => "2017-01-19T17:59:10Z"]]), + ), + ]); + + $price_rule = new PriceRule($this->test_session); + $price_rule->title = "FREESHIPPING"; + $price_rule->target_type = "shipping_line"; + $price_rule->target_selection = "all"; + $price_rule->allocation_method = "each"; + $price_rule->value_type = "percentage"; + $price_rule->value = "-100.0"; + $price_rule->usage_limit = 20; + $price_rule->customer_selection = "all"; + $price_rule->prerequisite_subtotal_range = [ + "greater_than_or_equal_to" => "50.0" + ]; + $price_rule->starts_at = "2017-01-19T17:59:10Z"; + $price_rule->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rules" => [["id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-01-08T08:59:11-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"], ["id" => 106886544, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2023-12-31T08:59:11-05:00", "ends_at" => "2024-01-04T08:59:11-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "TENOFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/106886544"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PriceRule::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rules" => [["id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-01-08T08:59:11-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules.json?since_id=106886545", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PriceRule::all( + $this->test_session, + [], + ["since_id" => "106886545"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-01-08T08:59:11-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:11:00-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "WINTER SALE", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["price_rule" => ["title" => "WINTER SALE"]]), + ), + ]); + + $price_rule = new PriceRule($this->test_session); + $price_rule->id = 507328175; + $price_rule->title = "WINTER SALE"; + $price_rule->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["price_rule" => ["id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => null, "once_per_customer" => false, "usage_limit" => null, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-01-08T08:59:11-05:00", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => null, "prerequisite_quantity_range" => null, "prerequisite_shipping_price_range" => null, "prerequisite_to_entitlement_quantity_ratio" => ["prerequisite_quantity" => null, "entitled_quantity" => null], "prerequisite_to_entitlement_purchase" => ["prerequisite_amount" => null], "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PriceRule::find( + $this->test_session, + 507328175, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/507328175.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PriceRule::delete( + $this->test_session, + 507328175, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/price_rules/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + PriceRule::count( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Product202404Test.php b/tests/Rest/Admin2024_04/Product202404Test.php new file mode 100644 index 00000000..9ae79ef2 --- /dev/null +++ b/tests/Rest/Admin2024_04/Product202404Test.php @@ -0,0 +1,1077 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], "image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], ["id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => null, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [["id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"]], "options" => [["id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]]], "images" => [], "image" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json?ids=632910392%2C921728736", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + ["ids" => "632910392,921728736"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], "image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], ["id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => null, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [["id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"]], "options" => [["id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]]], "images" => [], "image" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => null, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [["id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"]], "options" => [["id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]]], "images" => [], "image" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json?since_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + ["since_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], "image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json?collection_id=841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + ["collection_id" => "841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], "image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], ["id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => null, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [["id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"]], "options" => [["id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]]], "images" => [], "image" => null]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json?presentment_currencies=USD", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + ["presentment_currencies" => "USD"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["products" => [["id" => 632910392, "title" => "IPod Nano - 8GB", "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]]], ["id" => 921728736, "title" => "IPod Touch 8GB", "images" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json?fields=id%2Cimages%2Ctitle", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::all( + $this->test_session, + [], + ["fields" => "id,images,title"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/count.json?collection_id=841564295", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::count( + $this->test_session, + [], + ["collection_id" => "841564295"], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]], "image" => ["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::find( + $this->test_session, + 632910392, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "images" => [["id" => 850703190, "alt" => null, "position" => 1, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []], ["id" => 562641783, "alt" => null, "position" => 2, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]], ["id" => 378407906, "alt" => null, "position" => 3, "product_id" => 632910392, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json?fields=id%2Cimages%2Ctitle", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::find( + $this->test_session, + 632910392, + [], + ["fields" => "id,images,title"], + ); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:37-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:47-05:00", "published_at" => null, "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["published" => false]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->published = false; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:12-05:00", "published_at" => "2024-01-02T09:00:12-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["published" => true]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->published = true; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "Updated Product Title", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:15-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "2000.00", "sku" => "Updating the Product SKU", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:15-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "2000.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Updated Product Title", "variants" => [["id" => 808950810, "price" => "2000.00", "sku" => "Updating the Product SKU"], ["id" => 49148385], ["id" => 39072856], ["id" => 457924702]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->title = "Updated Product Title"; + $product->variants = [ + [ + "id" => 808950810, + "price" => "2000.00", + "sku" => "Updating the Product SKU" + ], + [ + "id" => 49148385 + ], + [ + "id" => 39072856 + ], + [ + "id" => 457924702 + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"], ["id" => 1001473903, "product_id" => 632910392, "position" => 4, "created_at" => "2024-01-02T09:00:11-05:00", "updated_at" => "2024-01-02T09:00:11-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20240102-28582-50v17p.gif?v=1704204011", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473903"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["images" => [["id" => 850703190], ["id" => 562641783], ["id" => 378407906], ["src" => "http://example.com/rails_logo.gif"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->images = [ + [ + "id" => 850703190 + ], + [ + "id" => 562641783 + ], + [ + "id" => 378407906 + ], + [ + "src" => "http://example.com/rails_logo.gif" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:03-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:03-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["images" => []]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->images = []; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:56-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 378407906, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:56-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 850703190, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:56-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]], "image" => ["id" => 378407906, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:56-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["images" => [["id" => 850703190, "position" => 3], ["id" => 562641783, "position" => 2], ["id" => 378407906, "position" => 1]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->images = [ + [ + "id" => 850703190, + "position" => 3 + ], + [ + "id" => 562641783, + "position" => 2 + ], + [ + "id" => 378407906, + "position" => 1 + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:08-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Black", "Green", "Red", "Pink"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["variants" => [["id" => 457924702], ["id" => 39072856], ["id" => 49148385], ["id" => 808950810]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->variants = [ + [ + "id" => 457924702 + ], + [ + "id" => 39072856 + ], + [ + "id" => 49148385 + ], + [ + "id" => 808950810 + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["metafields_global_title_tag" => "Brand new title", "metafields_global_description_tag" => "Brand new description"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->metafields_global_title_tag = "Brand new title"; + $product->metafields_global_description_tag = "Brand new description"; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:48-05:00", "published_at" => null, "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "draft", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["status" => "draft"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->status = "draft"; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T09:00:24-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Barnes & Noble, John's Fav", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["tags" => "Barnes & Noble, John's Fav"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->tags = "Barnes & Noble, John's Fav"; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_22(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 632910392, "title" => "New product title", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-01-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-01-02T08:59:43-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => null, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"]], "options" => [["id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]], "images" => [["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"], ["id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"], ["id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"]], "image" => ["id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "alt" => null, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "New product title"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->id = 632910392; + $product->title = "New product title"; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_23(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Product::delete( + $this->test_session, + 632910392, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_24(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481042, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:32-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:32-05:00", "published_at" => null, "template_suffix" => null, "published_scope" => "web", "tags" => "", "status" => "draft", "admin_graphql_api_id" => "gid://shopify/Product/1072481042", "variants" => [["id" => 1070325019, "product_id" => 1072481042, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:32-05:00", "updated_at" => "2024-01-02T08:59:32-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325019, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325019"]], "options" => [["id" => 1064576481, "product_id" => 1072481042, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "status" => "draft"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->status = "draft"; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_25(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481044, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:36-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:36-05:00", "published_at" => "2024-01-02T08:59:36-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481044", "variants" => [["id" => 1070325021, "product_id" => 1072481044, "title" => "First", "price" => "10.00", "sku" => "123", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "First", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:36-05:00", "updated_at" => "2024-01-02T08:59:36-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325021, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "10.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325021"], ["id" => 1070325022, "product_id" => 1072481044, "title" => "Second", "price" => "20.00", "sku" => "123", "position" => 2, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Second", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:36-05:00", "updated_at" => "2024-01-02T08:59:36-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325022, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "20.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325022"]], "options" => [["id" => 1064576485, "product_id" => 1072481044, "name" => "Title", "position" => 1, "values" => ["First", "Second"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "variants" => [["option1" => "First", "price" => "10.00", "sku" => "123"], ["option1" => "Second", "price" => "20.00", "sku" => "123"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->variants = [ + [ + "option1" => "First", + "price" => "10.00", + "sku" => "123" + ], + [ + "option1" => "Second", + "price" => "20.00", + "sku" => "123" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_26(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481048, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:53-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:54-05:00", "published_at" => "2024-01-02T08:59:53-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481048", "variants" => [["id" => 1070325026, "product_id" => 1072481048, "title" => "Blue / 155", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Blue", "option2" => "155", "option3" => null, "created_at" => "2024-01-02T08:59:53-05:00", "updated_at" => "2024-01-02T08:59:53-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325026, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325026"], ["id" => 1070325027, "product_id" => 1072481048, "title" => "Black / 159", "price" => "0.00", "sku" => "", "position" => 2, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Black", "option2" => "159", "option3" => null, "created_at" => "2024-01-02T08:59:53-05:00", "updated_at" => "2024-01-02T08:59:53-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325027, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325027"]], "options" => [["id" => 1064576492, "product_id" => 1072481048, "name" => "Color", "position" => 1, "values" => ["Blue", "Black"]], ["id" => 1064576493, "product_id" => 1072481048, "name" => "Size", "position" => 2, "values" => ["155", "159"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "variants" => [["option1" => "Blue", "option2" => "155"], ["option1" => "Black", "option2" => "159"]], "options" => [["name" => "Color", "values" => ["Blue", "Black"]], ["name" => "Size", "values" => ["155", "159"]]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->variants = [ + [ + "option1" => "Blue", + "option2" => "155" + ], + [ + "option1" => "Black", + "option2" => "159" + ] + ]; + $product->options = [ + [ + "name" => "Color", + "values" => [ + "Blue", + "Black" + ] + ], + [ + "name" => "Size", + "values" => [ + "155", + "159" + ] + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_27(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481050, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:58-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:58-05:00", "published_at" => "2024-01-02T08:59:58-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "Barnes & Noble, Big Air, John's Fav", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481050", "variants" => [["id" => 1070325029, "product_id" => 1072481050, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:58-05:00", "updated_at" => "2024-01-02T08:59:58-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325029, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325029"]], "options" => [["id" => 1064576495, "product_id" => 1072481050, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "tags" => ["Barnes & Noble", "Big Air", "John's Fav"]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->tags = [ + "Barnes & Noble", + "Big Air", + "John's Fav" + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_28(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481053, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T09:00:09-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T09:00:10-05:00", "published_at" => "2024-01-02T09:00:09-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481053", "variants" => [["id" => 1070325033, "product_id" => 1072481053, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:00:09-05:00", "updated_at" => "2024-01-02T09:00:09-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325033, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325033"]], "options" => [["id" => 1064576499, "product_id" => 1072481053, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [["id" => 1001473902, "product_id" => 1072481053, "position" => 1, "created_at" => "2024-01-02T09:00:09-05:00", "updated_at" => "2024-01-02T09:00:09-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20240102-28582-q9zyr0.gif?v=1704204009", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473902"]], "image" => ["id" => 1001473902, "product_id" => 1072481053, "position" => 1, "created_at" => "2024-01-02T09:00:09-05:00", "updated_at" => "2024-01-02T09:00:09-05:00", "alt" => null, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20240102-28582-q9zyr0.gif?v=1704204009", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473902"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "images" => [["src" => "http://example.com/rails_logo.gif"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->images = [ + [ + "src" => "http://example.com/rails_logo.gif" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_29(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481054, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T09:00:19-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T09:00:20-05:00", "published_at" => "2024-01-02T09:00:19-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481054", "variants" => [["id" => 1070325034, "product_id" => 1072481054, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:00:19-05:00", "updated_at" => "2024-01-02T09:00:19-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325034, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325034"]], "options" => [["id" => 1064576500, "product_id" => 1072481054, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [["id" => 1001473904, "product_id" => 1072481054, "position" => 1, "created_at" => "2024-01-02T09:00:19-05:00", "updated_at" => "2024-01-02T09:00:19-05:00", "alt" => null, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204019", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473904"]], "image" => ["id" => 1001473904, "product_id" => 1072481054, "position" => 1, "created_at" => "2024-01-02T09:00:19-05:00", "updated_at" => "2024-01-02T09:00:19-05:00", "alt" => null, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204019", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473904"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "images" => [["attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->images = [ + [ + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_30(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481047, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:46-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:46-05:00", "published_at" => null, "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481047", "variants" => [["id" => 1070325025, "product_id" => 1072481047, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:46-05:00", "updated_at" => "2024-01-02T08:59:46-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325025, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325025"]], "options" => [["id" => 1064576491, "product_id" => 1072481047, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "published" => false]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->published = false; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_31(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481052, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T09:00:00-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T09:00:00-05:00", "published_at" => "2024-01-02T09:00:00-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481052", "variants" => [["id" => 1070325030, "product_id" => 1072481052, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:00:00-05:00", "updated_at" => "2024-01-02T09:00:00-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325030, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325030"]], "options" => [["id" => 1064576498, "product_id" => 1072481052, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $product->save(); + } + + /** + + * + * @return void + */ + public function test_32(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product" => ["id" => 1072481049, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-01-02T08:59:57-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-01-02T08:59:57-05:00", "published_at" => "2024-01-02T08:59:57-05:00", "template_suffix" => null, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481049", "variants" => [["id" => 1070325028, "product_id" => 1072481049, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => null, "option1" => "Default Title", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:57-05:00", "updated_at" => "2024-01-02T08:59:57-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325028, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325028"]], "options" => [["id" => 1064576494, "product_id" => 1072481049, "name" => "Title", "position" => 1, "values" => ["Default Title"]]], "images" => [], "image" => null]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product" => ["title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "metafields_global_title_tag" => "Product SEO Title", "metafields_global_description_tag" => "Product SEO Description"]]), + ), + ]); + + $product = new Product($this->test_session); + $product->title = "Burton Custom Freestyle 151"; + $product->body_html = "Good snowboard!"; + $product->vendor = "Burton"; + $product->product_type = "Snowboard"; + $product->metafields_global_title_tag = "Product SEO Title"; + $product->metafields_global_description_tag = "Product SEO Description"; + $product->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/ProductListing202404Test.php b/tests/Rest/Admin2024_04/ProductListing202404Test.php new file mode 100644 index 00000000..cf5c5776 --- /dev/null +++ b/tests/Rest/Admin2024_04/ProductListing202404Test.php @@ -0,0 +1,201 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product_listings" => [["product_id" => 632910392, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just \$149, little speaks volumes.

", "handle" => "ipod-nano", "product_type" => "Cult Products", "title" => "IPod Nano - 8GB", "vendor" => "Apple", "available" => true, "tags" => "Emotive, Flash Memory, MP3, Music", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [["id" => 808950810, "title" => "Pink", "option_values" => [["option_id" => 594680422, "name" => "Color", "value" => "Pink"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008PINK", "barcode" => "1234_pink", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 10, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => 562641783, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"], ["id" => 49148385, "title" => "Red", "option_values" => [["option_id" => 594680422, "name" => "Color", "value" => "Red"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008RED", "barcode" => "1234_red", "taxable" => true, "position" => 2, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 20, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"], ["id" => 39072856, "title" => "Green", "option_values" => [["option_id" => 594680422, "name" => "Color", "value" => "Green"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "barcode" => "1234_green", "taxable" => true, "position" => 3, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 30, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"], ["id" => 457924702, "title" => "Black", "option_values" => [["option_id" => 594680422, "name" => "Color", "value" => "Black"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 4, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 40, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"]], "images" => [["id" => 850703190, "created_at" => "2024-01-02T09:28:43-05:00", "position" => 1, "updated_at" => "2024-01-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "variant_ids" => [], "width" => 123, "height" => 456], ["id" => 562641783, "created_at" => "2024-01-02T09:28:43-05:00", "position" => 2, "updated_at" => "2024-01-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "variant_ids" => [808950810], "width" => 123, "height" => 456], ["id" => 378407906, "created_at" => "2024-01-02T09:28:43-05:00", "position" => 3, "updated_at" => "2024-01-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "variant_ids" => [], "width" => 123, "height" => 456]], "options" => [["id" => 594680422, "name" => "Color", "product_id" => 632910392, "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]]]], ["product_id" => 921728736, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [["id" => 447654529, "title" => "Black", "option_values" => [["option_id" => 891236591, "name" => "Title", "value" => "Black"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"]], "images" => [], "options" => [["id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductListing::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product_ids" => [921728736, 632910392]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings/product_ids.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductListing::product_ids( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductListing::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product_listing" => ["product_id" => 921728736, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [["id" => 447654529, "title" => "Black", "option_values" => [["option_id" => 891236591, "name" => "Title", "value" => "Black"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"]], "images" => [], "options" => [["id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings/921728736.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductListing::find( + $this->test_session, + 921728736, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["product_listing" => ["product_id" => 921728736, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [["id" => 447654529, "title" => "Black", "option_values" => [["option_id" => 891236591, "name" => "Title", "value" => "Black"]], "price" => "199.00", "formatted_price" => "\$199.00", "compare_at_price" => null, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => null, "created_at" => "2024-01-02T09:28:43-05:00", "updated_at" => "2024-01-02T09:28:43-05:00"]], "images" => [], "options" => [["id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings/921728736.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["product_listing" => []]), + ), + ]); + + $product_listing = new ProductListing($this->test_session); + $product_listing->product_id = 921728736; + $product_listing->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/product_listings/921728736.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductListing::delete( + $this->test_session, + 921728736, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ProductResourceFeedback202404Test.php b/tests/Rest/Admin2024_04/ProductResourceFeedback202404Test.php new file mode 100644 index 00000000..3645118c --- /dev/null +++ b/tests/Rest/Admin2024_04/ProductResourceFeedback202404Test.php @@ -0,0 +1,123 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => ["created_at" => "2024-01-02T17:14:48-05:00", "updated_at" => "2024-01-02T17:14:48-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-01-02T17:13:35-05:00", "messages" => ["Needs at least one image."], "feedback_generated_at" => "2024-01-02T17:14:47-05:00", "state" => "requires_action"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/resource_feedback.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["resource_feedback" => ["state" => "requires_action", "messages" => ["Needs at least one image."], "resource_updated_at" => "2024-01-02T17:13:35-05:00", "feedback_generated_at" => "2024-01-02T22:14:47.628840Z"]]), + ), + ]); + + $product_resource_feedback = new ProductResourceFeedback($this->test_session); + $product_resource_feedback->product_id = 632910392; + $product_resource_feedback->state = "requires_action"; + $product_resource_feedback->messages = [ + "Needs at least one image." + ]; + $product_resource_feedback->resource_updated_at = "2024-01-02T17:13:35-05:00"; + $product_resource_feedback->feedback_generated_at = "2024-01-02T22:14:47.628840Z"; + $product_resource_feedback->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => ["created_at" => "2024-01-02T17:14:44-05:00", "updated_at" => "2024-01-02T17:14:44-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-01-02T17:13:35-05:00", "messages" => [], "feedback_generated_at" => "2024-01-02T17:14:40-05:00", "state" => "success"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/resource_feedback.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["resource_feedback" => ["state" => "success", "resource_updated_at" => "2024-01-02T17:13:35-05:00", "feedback_generated_at" => "2024-01-02T22:14:40.429446Z"]]), + ), + ]); + + $product_resource_feedback = new ProductResourceFeedback($this->test_session); + $product_resource_feedback->product_id = 632910392; + $product_resource_feedback->state = "success"; + $product_resource_feedback->resource_updated_at = "2024-01-02T17:13:35-05:00"; + $product_resource_feedback->feedback_generated_at = "2024-01-02T22:14:40.429446Z"; + $product_resource_feedback->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => [["created_at" => "2024-01-02T17:14:48-05:00", "updated_at" => "2024-01-02T17:14:48-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-01-02T17:13:35-05:00", "messages" => ["Needs at least one image."], "feedback_generated_at" => "2024-01-02T16:14:48-05:00", "state" => "requires_action"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/resource_feedback.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ProductResourceFeedback::all( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Province202404Test.php b/tests/Rest/Admin2024_04/Province202404Test.php new file mode 100644 index 00000000..593e3431 --- /dev/null +++ b/tests/Rest/Admin2024_04/Province202404Test.php @@ -0,0 +1,174 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["provinces" => [["id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.07, "tax_percentage" => 7.0], ["id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => null, "tax_type" => "harmonized", "shipping_zone_id" => null, "tax" => 0.15, "tax_percentage" => 15.0], ["id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0], ["id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427/provinces.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Province::all( + $this->test_session, + ["country_id" => "879921427"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["provinces" => [["id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.1, "tax_percentage" => 10.0], ["id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.08, "tax_percentage" => 8.0], ["id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => null, "tax_type" => null, "shipping_zone_id" => null, "tax" => 0.0, "tax_percentage" => 0.0]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427/provinces.json?since_id=536137098", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Province::all( + $this->test_session, + ["country_id" => "879921427"], + ["since_id" => "536137098"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 13] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427/provinces/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Province::count( + $this->test_session, + ["country_id" => "879921427"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["province" => ["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427/provinces/224293623.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Province::find( + $this->test_session, + 224293623, + ["country_id" => "879921427"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["province" => ["country_id" => 879921427, "id" => 224293623, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => null, "tax" => 0.09, "tax_percentage" => 9.0]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/countries/879921427/provinces/224293623.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["province" => ["tax" => 0.09]]), + ), + ]); + + $province = new Province($this->test_session); + $province->country_id = 879921427; + $province->id = 224293623; + $province->tax = 0.09; + $province->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/RecurringApplicationCharge202404Test.php b/tests/Rest/Admin2024_04/RecurringApplicationCharge202404Test.php new file mode 100644 index 00000000..ec09f93c --- /dev/null +++ b/tests/Rest/Admin2024_04/RecurringApplicationCharge202404Test.php @@ -0,0 +1,294 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 1029266950, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => null, "status" => "pending", "created_at" => "2024-01-02T09:03:13-05:00", "updated_at" => "2024-01-02T09:03:13-05:00", "activated_on" => null, "return_url" => "http://super-duper.shopifyapps.com/", "test" => null, "cancelled_on" => null, "trial_days" => 5, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266950", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266950/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAZeWT06EmF1dG9fYWN0aXZhdGVU--10e4cc794e258a92ce408a14d56159396a4a7e62", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["recurring_application_charge" => ["name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "trial_days" => 5]]), + ), + ]); + + $recurring_application_charge = new RecurringApplicationCharge($this->test_session); + $recurring_application_charge->name = "Super Duper Plan"; + $recurring_application_charge->price = 10.0; + $recurring_application_charge->return_url = "http://super-duper.shopifyapps.com"; + $recurring_application_charge->trial_days = 5; + $recurring_application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 1029266949, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => null, "status" => "pending", "created_at" => "2024-01-02T09:03:11-05:00", "updated_at" => "2024-01-02T09:03:11-05:00", "activated_on" => null, "return_url" => "http://super-duper.shopifyapps.com/", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266949", "capped_amount" => "100.00", "balance_used" => 0.0, "balance_remaining" => 100.0, "risk_level" => 0, "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266949/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAVeWT06EmF1dG9fYWN0aXZhdGVU--ec2463fef56abcad97cd87a24c39ee695c4aeb22", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["recurring_application_charge" => ["name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "capped_amount" => 100, "terms" => "\$1 for 1000 emails"]]), + ), + ]); + + $recurring_application_charge = new RecurringApplicationCharge($this->test_session); + $recurring_application_charge->name = "Super Duper Plan"; + $recurring_application_charge->price = 10.0; + $recurring_application_charge->return_url = "http://super-duper.shopifyapps.com"; + $recurring_application_charge->capped_amount = 100; + $recurring_application_charge->terms = "\$1 for 1000 emails"; + $recurring_application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 1029266948, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => null, "status" => "pending", "created_at" => "2024-01-02T09:03:10-05:00", "updated_at" => "2024-01-02T09:03:10-05:00", "activated_on" => null, "return_url" => "http://super-duper.shopifyapps.com/", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266948", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266948/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAReWT06EmF1dG9fYWN0aXZhdGVU--de081eb5ef1fe3012eb6b7f43057870467729a4f", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["recurring_application_charge" => ["name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com"]]), + ), + ]); + + $recurring_application_charge = new RecurringApplicationCharge($this->test_session); + $recurring_application_charge->name = "Super Duper Plan"; + $recurring_application_charge->price = 10.0; + $recurring_application_charge->return_url = "http://super-duper.shopifyapps.com"; + $recurring_application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 1029266953, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => null, "status" => "pending", "created_at" => "2024-01-02T09:03:19-05:00", "updated_at" => "2024-01-02T09:03:19-05:00", "activated_on" => null, "return_url" => "http://super-duper.shopifyapps.com/", "test" => true, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266953", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266953/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAleWT06EmF1dG9fYWN0aXZhdGVU--5878008de70662d012993dbb8875bfcf1b0b327b", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["recurring_application_charge" => ["name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "test" => true]]), + ), + ]); + + $recurring_application_charge = new RecurringApplicationCharge($this->test_session); + $recurring_application_charge->name = "Super Duper Plan"; + $recurring_application_charge->price = 10.0; + $recurring_application_charge->return_url = "http://super-duper.shopifyapps.com"; + $recurring_application_charge->test = true; + $recurring_application_charge->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charges" => [["id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-01-02", "status" => "accepted", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:03:16-05:00", "activated_on" => null, "return_url" => "http://yourapp.example.org", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "currency" => "USD"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + RecurringApplicationCharge::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charges" => [["id" => 1029266952, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => null, "status" => "pending", "created_at" => "2024-01-02T09:03:16-05:00", "updated_at" => "2024-01-02T09:03:16-05:00", "activated_on" => null, "return_url" => "http://super-duper.shopifyapps.com/", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266952", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266952/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAheWT06EmF1dG9fYWN0aXZhdGVU--1f06bad6088a1df145a6f064bdef65096748a768", "currency" => "USD"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges.json?since_id=455696195", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + RecurringApplicationCharge::all( + $this->test_session, + [], + ["since_id" => "455696195"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-01-02", "status" => "pending", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "activated_on" => null, "return_url" => "http://yourapp.example.org", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => null, "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/455696195/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBENfKRs6EmF1dG9fYWN0aXZhdGVU--b5f90d04779cc5242b396e4054f2e650c5dace1c", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + RecurringApplicationCharge::find( + $this->test_session, + 455696195, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + RecurringApplicationCharge::delete( + $this->test_session, + 455696195, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["recurring_application_charge" => ["id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => null, "status" => "active", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:03:10-05:00", "activated_on" => "2024-01-02", "return_url" => "http://yourapp.example.org", "test" => null, "cancelled_on" => null, "trial_days" => 0, "trial_ends_on" => "2024-01-02", "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "capped_amount" => "100.00", "balance_used" => 0.0, "balance_remaining" => 100.0, "risk_level" => 0, "update_capped_amount_url" => "https://jsmith.myshopify.com/admin/charges/755357713/455696195/RecurringApplicationCharge/confirm_update_capped_amount?signature=BAh7BzoHaWRpBENfKRs6EmF1dG9fYWN0aXZhdGVG--6f69b8fcb4b3c7b73ce45ab3a9543b35b026b1b5", "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195/customize.json?recurring_application_charge%5Bcapped_amount%5D=200", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $recurring_application_charge = new RecurringApplicationCharge($this->test_session); + $recurring_application_charge->id = 455696195; + $recurring_application_charge->customize( + ["recurring_application_charge" => ["capped_amount" => "200"]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Redirect202404Test.php b/tests/Rest/Admin2024_04/Redirect202404Test.php new file mode 100644 index 00000000..1e06531c --- /dev/null +++ b/tests/Rest/Admin2024_04/Redirect202404Test.php @@ -0,0 +1,315 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirects" => [["id" => 950115854, "path" => "/ibook", "target" => "/products/macbook"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects.json?since_id=668809255", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Redirect::all( + $this->test_session, + [], + ["since_id" => "668809255"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirects" => [["id" => 304339089, "path" => "/products.php", "target" => "/products"], ["id" => 668809255, "path" => "/leopard", "target" => "/pages/macosx"], ["id" => 950115854, "path" => "/ibook", "target" => "/products/macbook"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Redirect::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Redirect::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["id" => 668809255, "path" => "/leopard", "target" => "/pages/macosx"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/668809255.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Redirect::find( + $this->test_session, + 668809255, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["path" => "/powermac", "target" => "/pages/macpro", "id" => 950115854]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/950115854.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["redirect" => ["path" => "/powermac", "target" => "/pages/macpro"]]), + ), + ]); + + $redirect = new Redirect($this->test_session); + $redirect->id = 950115854; + $redirect->path = "/powermac"; + $redirect->target = "/pages/macpro"; + $redirect->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["path" => "/tiger", "target" => "/pages/macosx", "id" => 668809255]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/668809255.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["redirect" => ["path" => "/tiger"]]), + ), + ]); + + $redirect = new Redirect($this->test_session); + $redirect->id = 668809255; + $redirect->path = "/tiger"; + $redirect->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["target" => "/pages/macpro", "path" => "/leopard", "id" => 668809255]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/668809255.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["redirect" => ["target" => "/pages/macpro"]]), + ), + ]); + + $redirect = new Redirect($this->test_session); + $redirect->id = 668809255; + $redirect->target = "/pages/macpro"; + $redirect->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects/668809255.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Redirect::delete( + $this->test_session, + 668809255, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["id" => 984542200, "path" => "/ipod", "target" => "/pages/itunes"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["redirect" => ["path" => "/ipod", "target" => "/pages/itunes"]]), + ), + ]); + + $redirect = new Redirect($this->test_session); + $redirect->path = "/ipod"; + $redirect->target = "/pages/itunes"; + $redirect->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["redirect" => ["id" => 984542199, "path" => "/forums", "target" => "http://forums.apple.com/"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/redirects.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["redirect" => ["path" => "http://www.apple.com/forums", "target" => "http://forums.apple.com"]]), + ), + ]); + + $redirect = new Redirect($this->test_session); + $redirect->path = "http://www.apple.com/forums"; + $redirect->target = "http://forums.apple.com"; + $redirect->save(); + } + +} diff --git a/tests/Rest/Admin2024_04/Refund202404Test.php b/tests/Rest/Admin2024_04/Refund202404Test.php new file mode 100644 index 00000000..e5528fa4 --- /dev/null +++ b/tests/Rest/Admin2024_04/Refund202404Test.php @@ -0,0 +1,267 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refunds" => [["id" => 509562969, "order_id" => 450789469, "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "user_id" => 548380009, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "refund_line_items" => [["id" => 104689539, "quantity" => 1, "line_item_id" => 703073504, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.66, "total_tax" => 3.98, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "variant_id" => 457924702, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008BLACK", "variant_title" => "black", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - black", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.33", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]], ["id" => 709875399, "quantity" => 1, "line_item_id" => 466157049, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.67, "total_tax" => 3.98, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.34", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]]], "transactions" => [["id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "receipt" => [], "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"]], "order_adjustments" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Refund::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["id" => 929361466, "order_id" => 450789469, "created_at" => "2024-01-02T09:01:02-05:00", "note" => "wrong size", "user_id" => null, "processed_at" => "2024-01-02T09:01:02-05:00", "restock" => false, "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "admin_graphql_api_id" => "gid://shopify/Refund/929361466", "refund_line_items" => [["location_id" => null, "restock_type" => "no_restock", "quantity" => 1, "id" => 1058498311, "line_item_id" => 518995019, "subtotal" => 0.0, "total_tax" => 0.0, "subtotal_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "line_item" => ["id" => 518995019, "variant_id" => 49148385, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008RED", "variant_title" => "red", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - red", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.33", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]]], "transactions" => [["id" => 1068278483, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T09:01:02-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 801038806, "processed_at" => "2024-01-02T09:01:02-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "receipt" => [], "amount" => "41.94", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278483"]], "order_adjustments" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["currency" => "USD", "notify" => true, "note" => "wrong size", "shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 518995019, "quantity" => 1, "restock_type" => "return", "location_id" => 487838322]], "transactions" => [["parent_id" => 801038806, "amount" => 41.94, "kind" => "refund", "gateway" => "bogus"]]]]), + ), + ]); + + $refund = new Refund($this->test_session); + $refund->order_id = 450789469; + $refund->currency = "USD"; + $refund->notify = true; + $refund->note = "wrong size"; + $refund->shipping = [ + "full_refund" => true + ]; + $refund->refund_line_items = [ + [ + "line_item_id" => 518995019, + "quantity" => 1, + "restock_type" => "return", + "location_id" => 487838322 + ] + ]; + $refund->transactions = [ + [ + "parent_id" => 801038806, + "amount" => 41.94, + "kind" => "refund", + "gateway" => "bogus" + ] + ]; + $refund->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["id" => 929361467, "order_id" => 450789469, "created_at" => "2024-01-02T09:01:05-05:00", "note" => null, "user_id" => null, "processed_at" => "2024-01-02T09:01:05-05:00", "restock" => false, "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "admin_graphql_api_id" => "gid://shopify/Refund/929361467", "refund_line_items" => [], "transactions" => [["id" => 1068278484, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T09:01:05-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 801038806, "processed_at" => "2024-01-02T09:01:05-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "receipt" => [], "amount" => "5.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278484"]], "order_adjustments" => [["id" => 1030976842, "order_id" => 450789469, "refund_id" => 929361467, "amount" => "-5.00", "tax_amount" => "0.00", "kind" => "shipping_refund", "reason" => "Shipping refund", "amount_set" => ["shop_money" => ["amount" => "-5.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "-5.00", "currency_code" => "USD"]], "tax_amount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["currency" => "USD", "shipping" => ["amount" => 5.0], "transactions" => [["parent_id" => 801038806, "amount" => 5.0, "kind" => "refund", "gateway" => "bogus"]]]]), + ), + ]); + + $refund = new Refund($this->test_session); + $refund->order_id = 450789469; + $refund->currency = "USD"; + $refund->shipping = [ + "amount" => 5.0 + ]; + $refund->transactions = [ + [ + "parent_id" => 801038806, + "amount" => 5.0, + "kind" => "refund", + "gateway" => "bogus" + ] + ]; + $refund->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["id" => 509562969, "order_id" => 450789469, "created_at" => "2024-01-02T08:59:11-05:00", "note" => "it broke during shipping", "user_id" => 548380009, "processed_at" => "2024-01-02T08:59:11-05:00", "restock" => true, "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "refund_line_items" => [["id" => 104689539, "quantity" => 1, "line_item_id" => 703073504, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.66, "total_tax" => 3.98, "subtotal_set" => ["shop_money" => ["amount" => "195.66", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.66", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 703073504, "variant_id" => 457924702, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008BLACK", "variant_title" => "black", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - black", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.33", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.33", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.33", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]], ["id" => 709875399, "quantity" => 1, "line_item_id" => 466157049, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.67, "total_tax" => 3.98, "subtotal_set" => ["shop_money" => ["amount" => "195.67", "currency_code" => "USD"], "presentment_money" => ["amount" => "195.67", "currency_code" => "USD"]], "total_tax_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]], "line_item" => ["id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => null, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [["name" => "Custom Engraving Front", "value" => "Happy Birthday"], ["name" => "Custom Engraving Back", "value" => "Merry Christmas"]], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => null, "price_set" => ["shop_money" => ["amount" => "199.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "199.00", "currency_code" => "USD"]], "total_discount_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "discount_allocations" => [["amount" => "3.34", "discount_application_index" => 0, "amount_set" => ["shop_money" => ["amount" => "3.34", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.34", "currency_code" => "USD"]]]], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [["title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => null, "price_set" => ["shop_money" => ["amount" => "3.98", "currency_code" => "USD"], "presentment_money" => ["amount" => "3.98", "currency_code" => "USD"]]]]]]], "transactions" => [["id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "receipt" => [], "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"]], "order_adjustments" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds/509562969.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Refund::find( + $this->test_session, + 509562969, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["shipping" => ["amount" => "2.00", "tax" => "0.00", "maximum_refundable" => "5.00"], "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "refund_line_items" => [], "transactions" => [["order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "2.00", "currency" => "USD", "maximum_refundable" => "41.94"]], "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds/calculate.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["currency" => "USD", "shipping" => ["amount" => 2.0]]]), + ), + ]); + + $refund = new Refund($this->test_session); + $refund->order_id = 450789469; + $refund->calculate( + [], + ["refund" => ["currency" => "USD", "shipping" => ["amount" => 2.0]]], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["shipping" => ["amount" => "5.00", "tax" => "0.00", "maximum_refundable" => "5.00"], "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "refund_line_items" => [["quantity" => 1, "line_item_id" => 518995019, "location_id" => null, "restock_type" => "no_restock", "price" => "199.00", "subtotal" => "195.67", "total_tax" => "3.98", "discounted_price" => "199.00", "discounted_total_price" => "199.00", "total_cart_discount_amount" => "3.33"]], "transactions" => [["order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "41.94", "currency" => "USD", "maximum_refundable" => "41.94"]], "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds/calculate.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["currency" => "USD", "shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"]]]]), + ), + ]); + + $refund = new Refund($this->test_session); + $refund->order_id = 450789469; + $refund->calculate( + [], + ["refund" => ["currency" => "USD", "shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"]]]], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["refund" => ["shipping" => ["amount" => "5.00", "tax" => "0.00", "maximum_refundable" => "5.00"], "duties" => [], "total_duties_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "additional_fees" => [], "total_additional_fees_set" => ["shop_money" => ["amount" => "0.00", "currency_code" => "USD"], "presentment_money" => ["amount" => "0.00", "currency_code" => "USD"]], "return" => null, "refund_line_items" => [["quantity" => 1, "line_item_id" => 518995019, "location_id" => null, "restock_type" => "no_restock", "price" => "199.00", "subtotal" => "195.67", "total_tax" => "3.98", "discounted_price" => "199.00", "discounted_total_price" => "199.00", "total_cart_discount_amount" => "3.33"]], "transactions" => [["order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "41.94", "currency" => "USD", "maximum_refundable" => "41.94"]], "currency" => "USD"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/refunds/calculate.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["refund" => ["shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"]]]]), + ), + ]); + + $refund = new Refund($this->test_session); + $refund->order_id = 450789469; + $refund->calculate( + [], + ["refund" => ["shipping" => ["full_refund" => true], "refund_line_items" => [["line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"]]]], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ResourceFeedback202404Test.php b/tests/Rest/Admin2024_04/ResourceFeedback202404Test.php new file mode 100644 index 00000000..527e83f4 --- /dev/null +++ b/tests/Rest/Admin2024_04/ResourceFeedback202404Test.php @@ -0,0 +1,119 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => ["created_at" => "2024-01-02T17:14:16-05:00", "updated_at" => "2024-01-02T17:14:16-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => null, "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-01-02T17:14:15-05:00", "state" => "requires_action"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/resource_feedback.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["resource_feedback" => ["state" => "requires_action", "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-01-02T22:14:15.870447Z"]]), + ), + ]); + + $resource_feedback = new ResourceFeedback($this->test_session); + $resource_feedback->state = "requires_action"; + $resource_feedback->messages = [ + "is not connected. Connect your account to use this sales channel." + ]; + $resource_feedback->feedback_generated_at = "2024-01-02T22:14:15.870447Z"; + $resource_feedback->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => ["created_at" => "2024-01-02T17:14:15-05:00", "updated_at" => "2024-01-02T17:14:15-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => null, "messages" => [], "feedback_generated_at" => "2024-01-02T17:14:14-05:00", "state" => "success"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/resource_feedback.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["resource_feedback" => ["state" => "success", "feedback_generated_at" => "2024-01-02T22:14:14.748024Z"]]), + ), + ]); + + $resource_feedback = new ResourceFeedback($this->test_session); + $resource_feedback->state = "success"; + $resource_feedback->feedback_generated_at = "2024-01-02T22:14:14.748024Z"; + $resource_feedback->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["resource_feedback" => [["created_at" => "2024-01-02T17:14:15-05:00", "updated_at" => "2024-01-02T17:14:15-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => null, "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-01-02T16:14:15-05:00", "state" => "requires_action"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/resource_feedback.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ResourceFeedback::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ScriptTag202404Test.php b/tests/Rest/Admin2024_04/ScriptTag202404Test.php new file mode 100644 index 00000000..9da44667 --- /dev/null +++ b/tests/Rest/Admin2024_04/ScriptTag202404Test.php @@ -0,0 +1,258 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tags" => [["id" => 421379493, "src" => "https://js.example.org/bar.js", "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "display_scope" => "all", "cache" => false], ["id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "display_scope" => "all", "cache" => false]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tags" => [["id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "display_scope" => "all", "cache" => false]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags.json?since_id=421379493", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::all( + $this->test_session, + [], + ["since_id" => "421379493"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tags" => [["id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "display_scope" => "all", "cache" => false]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags.json?src=https%3A%2F%2Fjs.example.org%2Ffoo.js", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::all( + $this->test_session, + [], + ["src" => "https://js.example.org/foo.js"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tag" => ["id" => 870402687, "src" => "https://example.com/my_script.js", "event" => "onload", "created_at" => "2024-01-02T09:08:32-05:00", "updated_at" => "2024-01-02T09:08:32-05:00", "display_scope" => "all", "cache" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["script_tag" => ["event" => "onload", "src" => "https://example.com/my_script.js"]]), + ), + ]); + + $script_tag = new ScriptTag($this->test_session); + $script_tag->event = "onload"; + $script_tag->src = "https://example.com/my_script.js"; + $script_tag->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 2] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tag" => ["id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "display_scope" => "all", "cache" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags/596726825.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::find( + $this->test_session, + 596726825, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["script_tag" => ["src" => "https://somewhere-else.com/another.js", "cache" => false, "id" => 596726825, "event" => "onload", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:08:37-05:00", "display_scope" => "all"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags/596726825.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["script_tag" => ["src" => "https://somewhere-else.com/another.js"]]), + ), + ]); + + $script_tag = new ScriptTag($this->test_session); + $script_tag->id = 596726825; + $script_tag->src = "https://somewhere-else.com/another.js"; + $script_tag->save(); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/script_tags/596726825.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ScriptTag::delete( + $this->test_session, + 596726825, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/ShippingZone202404Test.php b/tests/Rest/Admin2024_04/ShippingZone202404Test.php new file mode 100644 index 00000000..58756ad5 --- /dev/null +++ b/tests/Rest/Admin2024_04/ShippingZone202404Test.php @@ -0,0 +1,60 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shipping_zones" => [["id" => 44570466, "name" => "Downtown Ottawa", "profile_id" => "gid://shopify/DeliveryProfile/690933842", "location_group_id" => "gid://shopify/DeliveryLocationGroup/694323328", "admin_graphql_api_id" => "gid://shopify/DeliveryZone/44570466", "countries" => [["id" => 359115488, "name" => "Colombia", "tax" => 0.15, "code" => "CO", "tax_name" => "VAT", "shipping_zone_id" => 44570466, "provinces" => []], ["id" => 879921427, "name" => "Canada", "tax" => 0.05, "code" => "CA", "tax_name" => "GST", "shipping_zone_id" => 44570466, "provinces" => [["id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax" => 0.09, "tax_name" => "HST", "tax_type" => "compounded", "tax_percentage" => 9.0, "shipping_zone_id" => 44570466], ["id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax" => 0.08, "tax_name" => null, "tax_type" => null, "tax_percentage" => 8.0, "shipping_zone_id" => 44570466]]], ["id" => 817138619, "name" => "United States", "tax" => 0.0, "code" => "US", "tax_name" => "Federal Tax", "shipping_zone_id" => 44570466, "provinces" => [["id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax" => 0.065, "tax_name" => null, "tax_type" => null, "tax_percentage" => 6.5, "shipping_zone_id" => 44570466], ["id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax" => 0.04, "tax_name" => null, "tax_type" => null, "tax_percentage" => 4.0, "shipping_zone_id" => 44570466]]]], "weight_based_shipping_rates" => [["id" => 522512552, "name" => "Free Under 5kg", "price" => "0.00", "shipping_zone_id" => 44570466, "weight_low" => 0.0, "weight_high" => 5.0]], "price_based_shipping_rates" => [["id" => 64051, "name" => "Free Shipping", "price" => "0.00", "shipping_zone_id" => 44570466, "min_order_subtotal" => null, "max_order_subtotal" => "450"]], "carrier_shipping_rate_providers" => [["id" => 615128020, "carrier_service_id" => 260046840, "flat_modifier" => "", "percent_modifier" => null, "service_filter" => ["*" => "+"], "shipping_zone_id" => 44570466]]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shipping_zones.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + ShippingZone::all( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Shop202404Test.php b/tests/Rest/Admin2024_04/Shop202404Test.php new file mode 100644 index 00000000..de94d291 --- /dev/null +++ b/tests/Rest/Admin2024_04/Shop202404Test.php @@ -0,0 +1,88 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shop" => ["id" => 548380009, "name" => "John Smith Test Store", "email" => "j.smith@example.com", "domain" => "shop.apple.com", "province" => "California", "country" => "US", "address1" => "1 Infinite Loop", "zip" => "95014", "city" => "Cupertino", "source" => null, "phone" => "1231231234", "latitude" => 45.45, "longitude" => -75.43, "primary_locale" => "en", "address2" => "Suite 100", "created_at" => "2007-12-31T19:00:00-05:00", "updated_at" => "2024-01-02T09:00:54-05:00", "country_code" => "US", "country_name" => "United States", "currency" => "USD", "customer_email" => "customers@apple.com", "timezone" => "(GMT-05:00) Eastern Time (US & Canada)", "iana_timezone" => "America/New_York", "shop_owner" => "John Smith", "money_format" => "\${{amount}}", "money_with_currency_format" => "\${{amount}} USD", "weight_unit" => "lb", "province_code" => "CA", "taxes_included" => null, "auto_configure_tax_inclusivity" => null, "tax_shipping" => null, "county_taxes" => true, "plan_display_name" => "Shopify Plus", "plan_name" => "enterprise", "has_discounts" => true, "has_gift_cards" => true, "myshopify_domain" => "jsmith.myshopify.com", "google_apps_domain" => null, "google_apps_login_enabled" => null, "money_in_emails_format" => "\${{amount}}", "money_with_currency_in_emails_format" => "\${{amount}} USD", "eligible_for_payments" => true, "requires_extra_payments_agreement" => false, "password_enabled" => false, "has_storefront" => true, "finances" => true, "primary_location_id" => 655441491, "checkout_api_supported" => true, "multi_location_enabled" => true, "setup_required" => false, "pre_launch_enabled" => false, "enabled_presentment_currencies" => ["USD"], "transactional_sms_disabled" => false, "marketing_sms_consent_enabled_at_checkout" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shop.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Shop::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["shop" => ["province" => "California", "country" => "US", "address1" => "1 Infinite Loop", "city" => "Cupertino", "address2" => "Suite 100"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/shop.json?fields=address1%2Caddress2%2Ccity%2Cprovince%2Ccountry", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Shop::all( + $this->test_session, + [], + ["fields" => "address1,address2,city,province,country"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/SmartCollection202404Test.php b/tests/Rest/Admin2024_04/SmartCollection202404Test.php new file mode 100644 index 00000000..d6a1dc26 --- /dev/null +++ b/tests/Rest/Admin2024_04/SmartCollection202404Test.php @@ -0,0 +1,683 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collections" => [["id" => 1063001321, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-01-02T09:29:35-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:35-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "title", "relation" => "starts_with", "condition" => "iPod"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001321"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json?since_id=482865238", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::all( + $this->test_session, + [], + ["since_id" => "482865238"], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collections" => [["id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collections" => [["id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::all( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collections" => [["id" => 1063001316, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:29:25-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:25-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001316"], ["id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json?ids=482865238%2C1063001316", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::all( + $this->test_session, + [], + ["ids" => "482865238,1063001316"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/count.json?product_id=632910392", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::count( + $this->test_session, + [], + ["product_id" => "632910392"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "products_count" => 2, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::find( + $this->test_session, + 482865238, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "id" => 482865238, "published_at" => null, "updated_at" => "2024-01-02T09:29:34-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["published" => false]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->published = false; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "id" => 482865238, "published_at" => "2024-01-02T09:29:21-05:00", "updated_at" => "2024-01-02T09:29:21-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["published" => true]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->published = true; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["body_html" => "

The best selling ipod ever

", "handle" => "smart-ipods", "updated_at" => "2024-01-02T09:29:29-05:00", "id" => 482865238, "sort_order" => "manual", "title" => "Smart iPods", "disjunctive" => false, "template_suffix" => null, "published_at" => "2008-02-01T19:00:00-05:00", "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["image" => "", "updated_at" => "2024-01-02T09:29:28-05:00", "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238"]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->image = ""; + $smart_collection->updated_at = "2024-01-02T09:29:28-05:00"; + $smart_collection->title = "Smart iPods"; + $smart_collection->handle = "smart-ipods"; + $smart_collection->body_html = "

The best selling ipod ever

"; + $smart_collection->published_at = "2008-02-01T19:00:00-05:00"; + $smart_collection->sort_order = "manual"; + $smart_collection->template_suffix = null; + $smart_collection->disjunctive = false; + $smart_collection->rules = [ + [ + "column" => "type", + "relation" => "equals", + "condition" => "Cult Products" + ] + ]; + $smart_collection->published_scope = "web"; + $smart_collection->admin_graphql_api_id = "gid://shopify/Collection/482865238"; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["updated_at" => "2024-01-02T09:29:45-05:00", "id" => 482865238, "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:29:45-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704205785"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["image" => ["attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "alt" => "Rails logo"]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->image = [ + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", + "alt" => "Rails logo" + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["updated_at" => "2024-01-02T09:29:43-05:00", "id" => 482865238, "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["alt" => "Rails logo", "created_at" => "2024-01-02T09:29:42-05:00", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20240102-28582-qpb548.gif?v=1704205783"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["image" => ["alt" => "Rails logo"]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->image = [ + "alt" => "Rails logo" + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_13(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["body_html" => "

5000 songs in your pocket

", "title" => "Smart iPods", "handle" => "smart-ipods", "id" => 482865238, "updated_at" => "2024-01-02T09:29:43-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "type", "relation" => "equals", "condition" => "Cult Products"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => ["created_at" => "2024-01-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["body_html" => "

5000 songs in your pocket

"]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->body_html = "

5000 songs in your pocket

"; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_14(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + SmartCollection::delete( + $this->test_session, + 482865238, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_15(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 1063001311, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:29:19-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:19-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001311", "image" => ["created_at" => "2024-01-02T09:29:19-05:00", "alt" => "iPod", "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704205759"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["title" => "Macbooks", "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "image" => ["attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n", "alt" => "iPod"]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->title = "Macbooks"; + $smart_collection->rules = [ + [ + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + ] + ]; + $smart_collection->image = [ + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n", + "alt" => "iPod" + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_16(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 1063001327, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:29:48-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:48-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001327", "image" => ["created_at" => "2024-01-02T09:29:48-05:00", "alt" => "Rails Logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20240102-28582-5fqs02.gif?v=1704205788"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["title" => "Macbooks", "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "image" => ["src" => "http://example.com/rails_logo.gif", "alt" => "Rails Logo"]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->title = "Macbooks"; + $smart_collection->rules = [ + [ + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + ] + ]; + $smart_collection->image = [ + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails Logo" + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_17(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 1063001326, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:29:46-05:00", "body_html" => null, "published_at" => null, "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001326"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["title" => "Macbooks", "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published" => false]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->title = "Macbooks"; + $smart_collection->rules = [ + [ + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + ] + ]; + $smart_collection->published = false; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_18(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 1063001313, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-01-02T09:29:21-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:21-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "title", "relation" => "starts_with", "condition" => "iPod"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001313"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["title" => "IPods", "rules" => [["column" => "title", "relation" => "starts_with", "condition" => "iPod"]]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->title = "IPods"; + $smart_collection->rules = [ + [ + "column" => "title", + "relation" => "starts_with", + "condition" => "iPod" + ] + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_19(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["smart_collection" => ["id" => 1063001325, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-01-02T09:29:41-05:00", "body_html" => null, "published_at" => "2024-01-02T09:29:41-05:00", "sort_order" => "best-selling", "template_suffix" => null, "disjunctive" => false, "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001325"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["smart_collection" => ["title" => "Macbooks", "rules" => [["column" => "vendor", "relation" => "equals", "condition" => "Apple"]]]]), + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->title = "Macbooks"; + $smart_collection->rules = [ + [ + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + ] + ]; + $smart_collection->save(); + } + + /** + + * + * @return void + */ + public function test_20(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238/order.json?products%5B%5D=921728736&products%5B%5D=632910392", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->order( + ["products" => ["921728736", "632910392"]], + ); + } + + /** + + * + * @return void + */ + public function test_21(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/smart_collections/482865238/order.json?sort_order=alpha-desc", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + $smart_collection = new SmartCollection($this->test_session); + $smart_collection->id = 482865238; + $smart_collection->order( + ["sort_order" => "alpha-desc"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/StorefrontAccessToken202404Test.php b/tests/Rest/Admin2024_04/StorefrontAccessToken202404Test.php new file mode 100644 index 00000000..47fc2ff1 --- /dev/null +++ b/tests/Rest/Admin2024_04/StorefrontAccessToken202404Test.php @@ -0,0 +1,116 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["storefront_access_token" => ["access_token" => "7090105cc04395f77b17ccb255355d0d", "access_scope" => "unauthenticated_read_product_listings", "created_at" => "2024-01-02T09:30:10-05:00", "id" => 1003304090, "admin_graphql_api_id" => "gid://shopify/StorefrontAccessToken/1003304090", "title" => "Test"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/storefront_access_tokens.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["storefront_access_token" => ["title" => "Test"]]), + ), + ]); + + $storefront_access_token = new StorefrontAccessToken($this->test_session); + $storefront_access_token->title = "Test"; + $storefront_access_token->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["storefront_access_tokens" => [["access_token" => "378d95641257a4ab3feff967ee234f4d", "access_scope" => "unauthenticated_read_product_listings", "created_at" => "2024-01-02T09:28:43-05:00", "id" => 755357713, "admin_graphql_api_id" => "gid://shopify/StorefrontAccessToken/755357713", "title" => "API Client Extension"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/storefront_access_tokens.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + StorefrontAccessToken::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/storefront_access_tokens/755357713.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + StorefrontAccessToken::delete( + $this->test_session, + 755357713, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/TenderTransaction202404Test.php b/tests/Rest/Admin2024_04/TenderTransaction202404Test.php new file mode 100644 index 00000000..7216502c --- /dev/null +++ b/tests/Rest/Admin2024_04/TenderTransaction202404Test.php @@ -0,0 +1,200 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222837, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"], ["id" => 1011222836, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222829, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json?since_id=1011222828", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + ["since_id" => "1011222828"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222830, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"], ["id" => 1011222831, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json?order=processed_at+ASC", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + ["order" => "processed_at ASC"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222833, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json?processed_at_min=2005-08-06+10%3A22%3A51+-0400", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + ["processed_at_min" => "2005-08-06 10:22:51 -0400"], + ); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222826, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json?processed_at_max=2005-08-06+10%3A22%3A51+-0400", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + ["processed_at_max" => "2005-08-06 10:22:51 -0400"], + ); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["tender_transactions" => [["id" => 1011222834, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => null, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => null, "payment_method" => "credit_card"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/tender_transactions.json?processed_at_max=2005-08-05+10%3A22%3A51+-0400", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + TenderTransaction::all( + $this->test_session, + [], + ["processed_at_max" => "2005-08-05 10:22:51 -0400"], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Theme202404Test.php b/tests/Rest/Admin2024_04/Theme202404Test.php new file mode 100644 index 00000000..871ae257 --- /dev/null +++ b/tests/Rest/Admin2024_04/Theme202404Test.php @@ -0,0 +1,203 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["themes" => [["id" => 828155753, "name" => "Comfort", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "role" => "main", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/828155753"], ["id" => 976877075, "name" => "Preview of Parallax", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "role" => "demo", "theme_store_id" => 688, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/976877075"], ["id" => 752253240, "name" => "Sandbox", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "role" => "unpublished", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Theme::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["theme" => ["id" => 1049083723, "name" => "Lemongrass", "created_at" => "2024-01-02T08:58:34-05:00", "updated_at" => "2024-01-02T08:58:34-05:00", "role" => "unpublished", "theme_store_id" => null, "previewable" => false, "processing" => true, "admin_graphql_api_id" => "gid://shopify/Theme/1049083723"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["theme" => ["name" => "Lemongrass", "src" => "http://themes.shopify.com/theme.zip", "role" => "main"]]), + ), + ]); + + $theme = new Theme($this->test_session); + $theme->name = "Lemongrass"; + $theme->src = "http://themes.shopify.com/theme.zip"; + $theme->role = "main"; + $theme->save(); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["theme" => ["id" => 828155753, "name" => "Comfort", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "role" => "main", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/828155753"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/828155753.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Theme::find( + $this->test_session, + 828155753, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["theme" => ["role" => "main", "id" => 752253240, "name" => "Sandbox", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:58:30-05:00", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/752253240.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["theme" => ["role" => "main"]]), + ), + ]); + + $theme = new Theme($this->test_session); + $theme->id = 752253240; + $theme->role = "main"; + $theme->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["theme" => ["name" => "Experimental", "role" => "unpublished", "id" => 752253240, "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:58:31-05:00", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/752253240.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["theme" => ["name" => "Experimental"]]), + ), + ]); + + $theme = new Theme($this->test_session); + $theme->id = 752253240; + $theme->name = "Experimental"; + $theme->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["id" => 752253240, "name" => "Sandbox", "created_at" => "2024-01-02T08:56:04-05:00", "updated_at" => "2024-01-02T08:56:04-05:00", "role" => "unpublished", "theme_store_id" => null, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/themes/752253240.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Theme::delete( + $this->test_session, + 752253240, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Transaction202404Test.php b/tests/Rest/Admin2024_04/Transaction202404Test.php new file mode 100644 index 00000000..fc4791ce --- /dev/null +++ b/tests/Rest/Admin2024_04/Transaction202404Test.php @@ -0,0 +1,268 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transactions" => [["id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"], ["id" => 389404469, "order_id" => 450789469, "kind" => "authorization", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-01T11:57:11-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => null, "processed_at" => "2005-08-01T11:57:11-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => ["testcase" => true, "authorization" => "123456"], "currency_exchange_adjustment" => null, "amount" => "598.94", "currency" => "USD", "payment_id" => "#1001.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/389404469"], ["id" => 801038806, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-05T10:22:51-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2005-08-05T10:22:51-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "250.94", "currency" => "USD", "payment_id" => "#1001.2", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/801038806"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Transaction::all( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transactions" => [["id" => 1068278466, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T08:57:35-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2024-01-02T08:57:35-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "338.0", "currency" => "USD"], "shop_money" => ["amount" => "338.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278466"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json?since_id=801038806", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Transaction::all( + $this->test_session, + ["order_id" => "450789469"], + ["since_id" => "801038806"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transaction" => ["id" => 1068278465, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T08:57:35-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2024-01-02T08:57:35-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "588.94", "currency" => "USD"], "shop_money" => ["amount" => "588.94", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278465"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["transaction" => ["currency" => "USD", "amount" => "10.00", "kind" => "capture", "parent_id" => 389404469]]), + ), + ]); + + $transaction = new Transaction($this->test_session); + $transaction->order_id = 450789469; + $transaction->currency = "USD"; + $transaction->amount = "10.00"; + $transaction->kind = "capture"; + $transaction->parent_id = 389404469; + $transaction->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transaction" => ["id" => 1068278482, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T08:57:55-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2024-01-02T08:57:55-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "598.94", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "0.0", "currency" => "USD"], "shop_money" => ["amount" => "0.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278482"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["transaction" => ["kind" => "capture", "authorization" => "authorization-key"]]), + ), + ]); + + $transaction = new Transaction($this->test_session); + $transaction->order_id = 450789469; + $transaction->kind = "capture"; + $transaction->authorization = "authorization-key"; + $transaction->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transaction" => ["id" => 1068278479, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T08:57:52-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2024-01-02T08:57:52-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "588.94", "currency" => "USD"], "shop_money" => ["amount" => "588.94", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278479"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["transaction" => ["currency" => "USD", "amount" => "10.00", "kind" => "capture", "parent_id" => 389404469, "test" => true]]), + ), + ]); + + $transaction = new Transaction($this->test_session); + $transaction->order_id = 450789469; + $transaction->currency = "USD"; + $transaction->amount = "10.00"; + $transaction->kind = "capture"; + $transaction->parent_id = 389404469; + $transaction->test = true; + $transaction->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transaction" => ["id" => 1068278475, "order_id" => 450789469, "kind" => "void", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-01-02T08:57:48-05:00", "test" => true, "authorization" => null, "location_id" => null, "user_id" => null, "parent_id" => 389404469, "processed_at" => "2024-01-02T08:57:48-05:00", "device_id" => null, "error_code" => null, "source_name" => "755357713", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => [], "currency_exchange_adjustment" => null, "amount" => "0.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "0.0", "currency" => "USD"], "shop_money" => ["amount" => "0.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278475"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["transaction" => ["currency" => "USD", "amount" => "10.00", "kind" => "void", "parent_id" => 389404469]]), + ), + ]); + + $transaction = new Transaction($this->test_session); + $transaction->order_id = 450789469; + $transaction->currency = "USD"; + $transaction->amount = "10.00"; + $transaction->kind = "void"; + $transaction->parent_id = 389404469; + $transaction->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 3] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Transaction::count( + $this->test_session, + ["order_id" => "450789469"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["transaction" => ["id" => 389404469, "order_id" => 450789469, "kind" => "authorization", "gateway" => "bogus", "status" => "success", "message" => null, "created_at" => "2005-08-01T11:57:11-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => null, "user_id" => null, "parent_id" => null, "processed_at" => "2005-08-01T11:57:11-04:00", "device_id" => null, "error_code" => null, "source_name" => "web", "payment_details" => ["credit_card_bin" => null, "avs_result_code" => null, "cvv_result_code" => null, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => null, "credit_card_name" => null, "credit_card_wallet" => null, "credit_card_expiration_month" => null, "credit_card_expiration_year" => null, "payment_method_name" => "visa"], "receipt" => ["testcase" => true, "authorization" => "123456"], "currency_exchange_adjustment" => null, "amount" => "598.94", "currency" => "USD", "authorization_expires_at" => null, "extended_authorization_attributes" => [], "payment_id" => "#1001.1", "total_unsettled_set" => ["presentment_money" => ["amount" => "348.0", "currency" => "USD"], "shop_money" => ["amount" => "348.0", "currency" => "USD"]], "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/389404469"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/orders/450789469/transactions/389404469.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Transaction::find( + $this->test_session, + 389404469, + ["order_id" => "450789469"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/UsageCharge202404Test.php b/tests/Rest/Admin2024_04/UsageCharge202404Test.php new file mode 100644 index 00000000..814c59c4 --- /dev/null +++ b/tests/Rest/Admin2024_04/UsageCharge202404Test.php @@ -0,0 +1,118 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["usage_charge" => ["id" => 1034618213, "description" => "Super Mega Plan 1000 emails", "price" => "1.00", "created_at" => "2024-01-02T09:31:50-05:00", "currency" => "USD", "balance_used" => 11.0, "balance_remaining" => 89.0, "risk_level" => 0]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195/usage_charges.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["usage_charge" => ["description" => "Super Mega Plan 1000 emails", "price" => "1.00"]]), + ), + ]); + + $usage_charge = new UsageCharge($this->test_session); + $usage_charge->recurring_application_charge_id = 455696195; + $usage_charge->description = "Super Mega Plan 1000 emails"; + $usage_charge->price = "1.00"; + $usage_charge->save(); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["usage_charges" => [["id" => 1034618206, "description" => "Super Mega Plan Add-ons", "price" => "10.00", "created_at" => "2024-01-02T09:31:46-05:00", "currency" => "USD", "balance_used" => 10.0, "balance_remaining" => 90.0, "risk_level" => 0]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195/usage_charges.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + UsageCharge::all( + $this->test_session, + ["recurring_application_charge_id" => "455696195"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["usage_charge" => ["id" => 1034618211, "description" => "Super Mega Plan Add-ons", "price" => "10.00", "created_at" => "2024-01-02T09:31:49-05:00", "currency" => "USD", "balance_used" => 10.0, "balance_remaining" => 90.0, "risk_level" => 0]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/recurring_application_charges/455696195/usage_charges/1034618211.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + UsageCharge::find( + $this->test_session, + 1034618211, + ["recurring_application_charge_id" => "455696195"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/User202404Test.php b/tests/Rest/Admin2024_04/User202404Test.php new file mode 100644 index 00000000..1d872839 --- /dev/null +++ b/tests/Rest/Admin2024_04/User202404Test.php @@ -0,0 +1,117 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["users" => [["id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => null, "screen_name" => null, "phone" => null, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => null, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false], ["id" => 930143300, "first_name" => "John", "email" => "j.limited@example.com", "url" => "www.example.com", "im" => null, "screen_name" => null, "phone" => null, "last_name" => "Limited", "account_owner" => false, "receive_announcements" => 1, "bio" => null, "permissions" => [], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/930143300", "tfa_enabled?" => false]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/users.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + User::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["user" => ["id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => null, "screen_name" => null, "phone" => null, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => null, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/users/548380009.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + User::find( + $this->test_session, + 548380009, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["user" => ["id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => null, "screen_name" => null, "phone" => null, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => null, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/users/current.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + User::current( + $this->test_session, + [], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Variant202404Test.php b/tests/Rest/Admin2024_04/Variant202404Test.php new file mode 100644 index 00000000..18ca6918 --- /dev/null +++ b/tests/Rest/Admin2024_04/Variant202404Test.php @@ -0,0 +1,388 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variants" => [["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"], ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::all( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variants" => [["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"], ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json?since_id=49148385", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::all( + $this->test_session, + ["product_id" => "632910392"], + ["since_id" => "49148385"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variants" => [["id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => ["amount" => "249.00", "currency_code" => "USD"]], ["price" => ["amount" => "249.00", "currency_code" => "CAD"], "compare_at_price" => ["amount" => "312.00", "currency_code" => "CAD"]]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"], ["id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => ["amount" => "249.00", "currency_code" => "USD"]], ["price" => ["amount" => "249.00", "currency_code" => "CAD"], "compare_at_price" => ["amount" => "312.00", "currency_code" => "CAD"]]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"], ["id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => null, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => ["amount" => "249.00", "currency_code" => "USD"]], ["price" => ["amount" => "249.00", "currency_code" => "CAD"], "compare_at_price" => ["amount" => "312.00", "currency_code" => "CAD"]]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"], ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => ["amount" => "249.00", "currency_code" => "USD"]], ["price" => ["amount" => "249.00", "currency_code" => "CAD"], "compare_at_price" => ["amount" => "312.00", "currency_code" => "CAD"]]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json?presentment_currencies=USD%2CCAD", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::all( + $this->test_session, + ["product_id" => "632910392"], + ["presentment_currencies" => "USD,CAD"], + ); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 1070325039, "product_id" => 632910392, "title" => "Yellow", "price" => "1.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Yellow", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:12:05-05:00", "updated_at" => "2024-01-02T09:12:05-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325039, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "1.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325039"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["option1" => "Yellow", "price" => "1.00"]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->product_id = 632910392; + $variant->option1 = "Yellow"; + $variant->price = "1.00"; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 1070325040, "product_id" => 632910392, "title" => "Blue", "price" => "0.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Blue", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:12:09-05:00", "updated_at" => "2024-01-02T09:12:09-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => null, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325040, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325040"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["option1" => "Blue", "metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->product_id = 632910392; + $variant->option1 = "Blue"; + $variant->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 1070325042, "product_id" => 632910392, "title" => "Purple", "price" => "0.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Purple", "option2" => null, "option3" => null, "created_at" => "2024-01-02T09:12:12-05:00", "updated_at" => "2024-01-02T09:12:12-05:00", "taxable" => true, "barcode" => null, "grams" => 0, "image_id" => 850703190, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325042, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [["price" => ["amount" => "0.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325042"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["image_id" => 850703190, "option1" => "Purple"]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->product_id = 632910392; + $variant->image_id = 850703190; + $variant->option1 = "Purple"; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 4] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::count( + $this->test_session, + ["product_id" => "632910392"], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "tax_code" => "DA040000", "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/808950810.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::find( + $this->test_session, + 808950810, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/808950810.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["metafields" => [["key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"]]]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->id = 808950810; + $variant->metafields = [ + [ + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + ] + ]; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:12:07-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "199.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/808950810.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["image_id" => 562641783]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->id = 808950810; + $variant->image_id = 562641783; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_11(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["variant" => ["id" => 808950810, "product_id" => 632910392, "title" => "Not Pink", "price" => "99.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => null, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Not Pink", "option2" => null, "option3" => null, "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:12:15-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [["price" => ["amount" => "99.00", "currency_code" => "USD"], "compare_at_price" => null]], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/variants/808950810.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["variant" => ["option1" => "Not Pink", "price" => "99.00"]]), + ), + ]); + + $variant = new Variant($this->test_session); + $variant->id = 808950810; + $variant->option1 = "Not Pink"; + $variant->price = "99.00"; + $variant->save(); + } + + /** + + * + * @return void + */ + public function test_12(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/products/632910392/variants/808950810.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Variant::delete( + $this->test_session, + 808950810, + ["product_id" => "632910392"], + [], + ); + } + +} diff --git a/tests/Rest/Admin2024_04/Webhook202404Test.php b/tests/Rest/Admin2024_04/Webhook202404Test.php new file mode 100644 index 00000000..46a1760c --- /dev/null +++ b/tests/Rest/Admin2024_04/Webhook202404Test.php @@ -0,0 +1,321 @@ +test_session = new Session("session_id", "test-shop.myshopify.io", true, "1234"); + $this->test_session->setAccessToken("this_is_a_test_token"); + } + + /** + + * + * @return void + */ + public function test_1(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhooks" => [["id" => 4759306, "address" => "https://apple.com", "topic" => "orders/create", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []], ["id" => 892403750, "address" => "https://example.org/fully_loaded_1", "topic" => "orders/cancelled", "created_at" => "2021-12-01T05:23:43-05:00", "updated_at" => "2021-12-01T05:23:43-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []], ["id" => 901431826, "address" => "https://apple.com/uninstall", "topic" => "app/uninstalled", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []], ["id" => 1014196360, "address" => "https://example.org/app_uninstalled", "topic" => "app/uninstalled", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::all( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_2(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhooks" => [["id" => 1014196360, "address" => "https://example.org/app_uninstalled", "topic" => "app/uninstalled", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks.json?since_id=901431826", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::all( + $this->test_session, + [], + ["since_id" => "901431826"], + ); + } + + /** + + * + * @return void + */ + public function test_3(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhook" => ["id" => 6883828544, "address" => "pubsub://projectName:topicName", "topic" => "customers/update", "created_at" => "2024-01-02T09:06:06-05:00", "updated_at" => "2024-01-02T09:06:06-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["webhook" => ["address" => "pubsub://projectName:topicName", "topic" => "customers/update", "format" => "json"]]), + ), + ]); + + $webhook = new Webhook($this->test_session); + $webhook->address = "pubsub://projectName:topicName"; + $webhook->topic = "customers/update"; + $webhook->format = "json"; + $webhook->save(); + } + + /** + + * + * @return void + */ + public function test_4(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhook" => ["id" => 6883828534, "address" => "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source", "topic" => "customers/update", "created_at" => "2024-01-02T09:05:41-05:00", "updated_at" => "2024-01-02T09:05:41-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["webhook" => ["address" => "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source", "topic" => "customers/update", "format" => "json"]]), + ), + ]); + + $webhook = new Webhook($this->test_session); + $webhook->address = "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source"; + $webhook->topic = "customers/update"; + $webhook->format = "json"; + $webhook->save(); + } + + /** + + * + * @return void + */ + public function test_5(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhook" => ["id" => 6883828554, "address" => "https://example.hostname.com/", "topic" => "orders/create", "created_at" => "2024-01-02T09:06:30-05:00", "updated_at" => "2024-01-02T09:06:30-05:00", "format" => "json", "fields" => ["id", "note"], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks.json", + "POST", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["webhook" => ["topic" => "orders/create", "address" => "https://example.hostname.com/", "format" => "json", "fields" => ["id", "note"]]]), + ), + ]); + + $webhook = new Webhook($this->test_session); + $webhook->topic = "orders/create"; + $webhook->address = "https://example.hostname.com/"; + $webhook->format = "json"; + $webhook->fields = [ + "id", + "note" + ]; + $webhook->save(); + } + + /** + + * + * @return void + */ + public function test_6(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 1] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks/count.json?topic=orders%2Fcreate", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::count( + $this->test_session, + [], + ["topic" => "orders/create"], + ); + } + + /** + + * + * @return void + */ + public function test_7(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["count" => 4] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks/count.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::count( + $this->test_session, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_8(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhook" => ["id" => 4759306, "address" => "https://apple.com", "topic" => "orders/create", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks/4759306.json", + "GET", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::find( + $this->test_session, + 4759306, + [], + [], + ); + } + + /** + + * + * @return void + */ + public function test_9(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + ["webhook" => ["id" => 4759306, "address" => "https://somewhere-else.com/", "topic" => "orders/create", "created_at" => "2024-01-02T08:59:11-05:00", "updated_at" => "2024-01-02T09:08:15-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []]] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks/4759306.json", + "PUT", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + json_encode(["webhook" => ["address" => "https://somewhere-else.com/"]]), + ), + ]); + + $webhook = new Webhook($this->test_session); + $webhook->id = 4759306; + $webhook->address = "https://somewhere-else.com/"; + $webhook->save(); + } + + /** + + * + * @return void + */ + public function test_10(): void + { + $this->mockTransportRequests([ + new MockRequest( + $this->buildMockHttpResponse(200, json_encode( + [] + )), + "https://test-shop.myshopify.io/admin/api/2024-04/webhooks/4759306.json", + "DELETE", + null, + [ + "X-Shopify-Access-Token: this_is_a_test_token", + ], + ), + ]); + + Webhook::delete( + $this->test_session, + 4759306, + [], + [], + ); + } + +} From a08deea9566ac4d37168f78450d7aacfa6c98a89 Mon Sep 17 00:00:00 2001 From: Paulo Margarido <64600052+paulomarg@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:36:17 -0400 Subject: [PATCH 10/10] Preparing for release v5.4.0 --- CHANGELOG.md | 2 ++ src/version.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7f11ded..7b0d5d08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## Unreleased +## v5.4.0 - 2024-04-08 + - [#333](https://github.com/Shopify/shopify-api-php/pull/333) [Minor] Adding support for 2024-04 API version ## v5.3.0 - 2024-01-10 diff --git a/src/version.php b/src/version.php index 9e136d27..2a058606 100644 --- a/src/version.php +++ b/src/version.php @@ -1,5 +1,5 @@