customerTokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class); $this->addressRepository = Bootstrap::getObjectManager()->get(AddressRepositoryInterface::class); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddress() { $newAddress = [ 'region' => [ 'region' => 'Arizona', 'region_id' => 4, 'region_code' => 'AZ' ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'fax' => '123123123', 'postcode' => '7777', 'city' => 'City Name', 'firstname' => 'Adam', 'lastname' => 'Phillis', 'middlename' => 'A', 'prefix' => 'Mr.', 'suffix' => 'Jr.', 'vat_id' => '1', 'default_shipping' => true, 'default_billing' => false ]; $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); $this->assertArrayHasKey('createCustomerAddress', $response); $this->assertArrayHasKey('customer_id', $response['createCustomerAddress']); $this->assertNull($response['createCustomerAddress']['customer_id']); $this->assertArrayHasKey('id', $response['createCustomerAddress']); $address = $this->addressRepository->getById($response['createCustomerAddress']['id']); $this->assertEquals($address->getId(), $response['createCustomerAddress']['id']); $address->setCustomerId(null); $this->assertCustomerAddressesFields($address, $response['createCustomerAddress']); $this->assertCustomerAddressesFields($address, $newAddress); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressWithNoRegionId() { $newAddress = [ 'region' => [ 'region' => 'Arizona', 'region_id' => 4, 'region_code' => 'AZ' ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'fax' => '123123123', 'postcode' => '7777', 'city' => 'City Name', 'firstname' => 'Adam', 'lastname' => 'Phillis', 'middlename' => 'A', 'prefix' => 'Mr.', 'suffix' => 'Jr.', 'vat_id' => '1', 'default_shipping' => true, 'default_billing' => false ]; $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); $this->assertArrayHasKey('createCustomerAddress', $response); $this->assertArrayHasKey('customer_id', $response['createCustomerAddress']); $this->assertNull($response['createCustomerAddress']['customer_id']); $this->assertArrayHasKey('id', $response['createCustomerAddress']); $address = $this->addressRepository->getById($response['createCustomerAddress']['id']); $this->assertEquals($address->getId(), $response['createCustomerAddress']['id']); $address->setCustomerId(null); $this->assertCustomerAddressesFields($address, $response['createCustomerAddress']); $this->assertCustomerAddressesFields($address, $newAddress); } /** * Test case for deprecated `country_id` field. * * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressWithCountryId() { $newAddress = [ 'region' => [ 'region' => 'Arizona', 'region_id' => 4, 'region_code' => 'AZ' ], 'country_id' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'fax' => '123123123', 'postcode' => '7777', 'city' => 'City Name', 'firstname' => 'Adam', 'lastname' => 'Phillis', 'middlename' => 'A', 'prefix' => 'Mr.', 'suffix' => 'Jr.', 'vat_id' => '1', 'default_shipping' => true, 'default_billing' => false ]; $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); $this->assertArrayHasKey('createCustomerAddress', $response); $this->assertEquals($newAddress['country_id'], $response['createCustomerAddress']['country_id']); } /** */ public function testCreateCustomerAddressIfUserIsNotAuthorized() { $this->expectException(\Exception::class); $this->expectExceptionMessage('The current customer isn\'t authorized.'); $mutation = <<graphQlMutation($mutation); } /** * Verify customers with valid credentials create new address * with missing required Firstname attribute * * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php */ public function testCreateCustomerAddressWithMissingAttribute() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Required parameters are missing: firstname'); $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php */ public function testCreateCustomerAddressWithMissingInput() { $this->expectException(\Exception::class); $this->expectExceptionMessage('"input" value should be specified'); $userName = 'customer@example.com'; $password = 'password'; $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressWithRedundantStreetLine() { $newAddress = [ 'region' => [ 'region' => 'Arizona', 'region_id' => 4, 'region_code' => 'AZ' ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2', 'Line 3'], 'company' => 'Company name', 'telephone' => '123456789', 'fax' => '123123123', 'postcode' => '7777', 'city' => 'City Name', 'firstname' => 'Adam', 'lastname' => 'Phillis', 'middlename' => 'A', 'prefix' => 'Mr.', 'suffix' => 'Jr.', 'vat_id' => '1', 'default_shipping' => true, 'default_billing' => false ]; $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoConfigFixture default_store general/country/optional_zip_countries UA * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressWithOptionalZipCode() { $newAddress = [ 'country_code' => 'UA', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'fax' => '123123123', 'city' => 'City Name', 'firstname' => 'Adam', 'lastname' => 'Phillis', 'middlename' => 'A', 'prefix' => 'Mr.', 'suffix' => 'Jr.', 'vat_id' => '1', 'default_shipping' => true, 'default_billing' => false ]; $mutation = <<graphQlMutation( $mutation, [], '', $this->getCustomerAuthHeaders($userName, $password) ); $this->assertNotEmpty($response['createCustomerAddress']['id']); } /** * Create new address with invalid input * * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @dataProvider invalidInputDataProvider * @param string $input * @param $exceptionMessage * @throws Exception */ public function testCreateCustomerAddressWithInvalidInput($input, $exceptionMessage) { $mutation = <<graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressRegionCodeWithoutRegionId() { $newAddress = [ 'region' => [ 'region_code' => 'NY', ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'postcode' => '10019', 'city' => 'Manhattan', 'firstname' => 'Adam', 'lastname' => 'Phillis' ]; $mutation = <<expectExceptionMessage('A region_id is required for the specified country code'); $this->graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressRegionCodeWithRegionIdForNoRegionRequiredCountry() { $newAddress = [ 'region' => [ 'region_code' => 'NY', 'region_id' => 43, ], 'country_code' => 'GB', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'postcode' => '10019', 'city' => 'London', 'firstname' => 'Adams', 'lastname' => 'Phillips' ]; $mutation = <<expectExceptionMessage('The region_id does not match the selected country or region'); $this->graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressRegionCodeWithWrongRegionIdForRegionRequiredCountry() { $newAddress = [ 'region' => [ 'region_code' => 'NY', 'region_id' => 53, ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'postcode' => '10019', 'city' => 'London', 'firstname' => 'Adams', 'lastname' => 'Phillips' ]; $mutation = <<expectExceptionMessage('The region_id does not match the selected country or region'); $this->graphQlMutation($mutation, [], '', $this->getCustomerAuthHeaders($userName, $password)); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreateCustomerAddressRegionCodeWithOutRegionIdForNoRegionRequiredCountry() { $newAddress = [ 'region' => [ 'region_code' => 'some', 'region' => 'some region' ], 'country_code' => 'GB', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'postcode' => '10019', 'city' => 'London', 'firstname' => 'Adams', 'lastname' => 'Phillips' ]; $mutation = <<graphQlMutation( $mutation, [], '', $this->getCustomerAuthHeaders($userName, $password) ); $this->assertEquals("some region", $response["createCustomerAddress"]["region"]["region"]); $this->assertEquals("some", $response["createCustomerAddress"]["region"]["region_code"]); } /** * @return array */ public function invalidInputDataProvider() { return [ ['', 'Syntax Error: Expected Name, found )'], ['input: ""', 'Expected value of type "CustomerAddressInput", found "".'], ['input: "foo"', 'Expected value of type "CustomerAddressInput", found "foo".'] ]; } /** * Verify the fields for Customer address * * @param AddressInterface $address * @param array $actualResponse * @param string $countryFieldName */ private function assertCustomerAddressesFields( AddressInterface $address, array $actualResponse ): void { /** @var $addresses */ $assertionMap = [ ['response_field' => 'country_code', 'expected_value' => $address->getCountryId()], ['response_field' => 'street', 'expected_value' => $address->getStreet()], ['response_field' => 'company', 'expected_value' => $address->getCompany()], ['response_field' => 'telephone', 'expected_value' => $address->getTelephone()], ['response_field' => 'fax', 'expected_value' => $address->getFax()], ['response_field' => 'postcode', 'expected_value' => $address->getPostcode()], ['response_field' => 'city', 'expected_value' => $address->getCity()], ['response_field' => 'firstname', 'expected_value' => $address->getFirstname()], ['response_field' => 'lastname', 'expected_value' => $address->getLastname()], ['response_field' => 'middlename', 'expected_value' => $address->getMiddlename()], ['response_field' => 'prefix', 'expected_value' => $address->getPrefix()], ['response_field' => 'suffix', 'expected_value' => $address->getSuffix()], ['response_field' => 'vat_id', 'expected_value' => $address->getVatId()], ['response_field' => 'default_shipping', 'expected_value' => (bool)$address->isDefaultShipping()], ['response_field' => 'default_billing', 'expected_value' => (bool)$address->isDefaultBilling()], ]; $this->assertResponseFields($actualResponse, $assertionMap); $this->assertIsArray([$actualResponse['region']], "region field must be of an array type."); $assertionRegionMap = [ ['response_field' => 'region', 'expected_value' => $address->getRegion()->getRegion()], ['response_field' => 'region_code', 'expected_value' => $address->getRegion()->getRegionCode()], ['response_field' => 'region_id', 'expected_value' => $address->getRegion()->getRegionId()] ]; $this->assertResponseFields($actualResponse['region'], $assertionRegionMap); } /** * @param string $email * @param string $password * @return array */ private function getCustomerAuthHeaders(string $email, string $password): array { $customerToken = $this->customerTokenService->createCustomerAccessToken($email, $password); return ['Authorization' => 'Bearer ' . $customerToken]; } }