markTestSkipped('GraphQlStateDiff class is not available on this version of Magento.'); } $this->graphQlStateDiff = new GraphQlStateDiff($this); parent::setUp(); } /** * @inheritDoc */ protected function tearDown(): void { $this->graphQlStateDiff->tearDown(); $this->graphQlStateDiff = null; parent::tearDown(); } /** * @magentoDataFixture Magento/Customer/_files/customer.php * @magentoDataFixture Magento/Customer/_files/customer_address.php * @dataProvider customerDataProvider * @return void */ public function testCustomerState( string $query, array $variables, array $variables2, array $authInfo, string $operationName, string $expected, ) : void { if ($operationName === 'createCustomer') { $emails = [$variables['email'], $variables2['email']]; $this->clearCustomerBeforeTest($emails); } $this->graphQlStateDiff-> testState($query, $variables, $variables2, $authInfo, $operationName, $expected, $this); } /** * @param array $emails * @return void */ private function clearCustomerBeforeTest(array $emails): void { $customerRepository = $this->graphQlStateDiff->getTestObjectManager() ->get(CustomerRepositoryInterface::class); $registry = $this->graphQlStateDiff->getTestObjectManager()->get(Registry::class); $registry->register('isSecureArea', true); foreach ($emails as $email) { try { $customer = $customerRepository->get($email); $customerRepository->delete($customer); } catch (NoSuchEntityException $e) { // Customer does not exist } } $registry->unregister('isSecureArea', false); } /** * * @magentoDataFixture Magento/Checkout/_files/quote_with_virtual_product_saved.php * @magentoDataFixture Magento/Customer/_files/customer.php * @magentoDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testMergeCarts(): void { $cartId1 = $this->graphQlStateDiff->getCartIdHash('test_order_with_virtual_product_without_address'); $cartId2 = $this->graphQlStateDiff->getCartIdHash('test_quote'); $query = $this->getCartMergeMutation(); $this->graphQlStateDiff->testState( $query, ['cartId1' => $cartId1, 'cartId2' => $cartId2], [], ['email' => 'customer@example.com', 'password' => 'password'], 'mergeCarts', '"data":{"mergeCarts":', $this ); } /** * @magentoDataFixture Magento/Customer/_files/customer.php * @return void */ public function testRequestPasswordResetEmail(): void { $query = $this->getRequestPasswordResetEmailMutation(); $this->graphQlStateDiff->testState( $query, ['email' => 'customer@example.com'], [], [], 'requestPasswordResetEmail', '"data":{"requestPasswordResetEmail":', $this ); } /** * @magentoDataFixture Magento/Customer/_files/customer.php * @return void */ public function testResetPassword(): void { $query = $this->getResetPasswordMutation(); $email = 'customer@example.com'; $this->graphQlStateDiff->testState( $query, ['email' => $email, 'newPassword' => 'new_password123', 'resetPasswordToken' => $this->graphQlStateDiff->getResetPasswordToken($email)], [], [], 'resetPassword', '"data":{"resetPassword":', $this ); } /** * @magentoDataFixture Magento/Customer/_files/customer.php * @return void */ public function testChangePassword(): void { $query = $this->getChangePasswordMutation(); $this->graphQlStateDiff->testState( $query, ['currentPassword' => 'password', 'newPassword' => 'new_password123'], ['currentPassword' => 'new_password123', 'newPassword' => 'password_new123'], [['email'=>'customer@example.com', 'password' => 'password'], ['email'=>'customer@example.com', 'password' => 'new_password123']], 'changeCustomerPassword', '"data":{"changeCustomerPassword":', $this ); } /** * @magentoDataFixture Magento/Customer/_files/customer_without_addresses.php * @return void */ public function testCreateCustomerAddress(): void { $query = $this->getCreateCustomerAddressMutation(); $this->graphQlStateDiff->testState( $query, [], [], ['email' => 'customer@example.com', 'password' => 'password'], 'createCustomerAddress', '"data":{"createCustomerAddress":', $this ); } /** * Queries, variables, operation names, and expected responses for test * * @return array[] * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function customerDataProvider(): array { return [ 'Create Customer' => [ <<<'QUERY' mutation($firstname: String!, $lastname: String!, $email: String!, $password: String!) { createCustomerV2( input: { firstname: $firstname, lastname: $lastname, email: $email, password: $password } ) { customer { created_at prefix firstname middlename lastname suffix email default_billing default_shipping date_of_birth taxvat is_subscribed gender allow_remote_shopping_assistance } } } QUERY, [ 'firstname' => 'John', 'lastname' => 'Doe', 'email' => 'email1@example.com', 'password' => 'Password-1', ], [ 'firstname' => 'John', 'lastname' => 'Doe', 'email' => 'email2@adobe.com', 'password' => 'Password-2', ], [], 'createCustomer', '"email":"', ], 'Update Customer' => [ <<<'QUERY' mutation($allow: Boolean!) { updateCustomerV2( input: { allow_remote_shopping_assistance: $allow } ) { customer { allow_remote_shopping_assistance } } } QUERY, ['allow' => true], ['allow' => false], ['email' => 'customer@example.com', 'password' => 'password'], 'updateCustomer', 'allow_remote_shopping_assistance' ], 'Update Customer Address' => [ <<<'QUERY' mutation($addressId: Int!, $city: String!) { updateCustomerAddress(id: $addressId, input: { region: { region: "Alberta" region_id: 66 region_code: "AB" } country_code: CA street: ["Line 1 Street","Line 2"] company: "Company Name" telephone: "123456789" fax: "123123123" postcode: "7777" city: $city firstname: "Adam" lastname: "Phillis" middlename: "A" prefix: "Mr." suffix: "Jr." vat_id: "1" default_shipping: true default_billing: true }) { id customer_id region { region region_id region_code } country_code street company telephone fax postcode city firstname lastname middlename prefix suffix vat_id default_shipping default_billing } } QUERY, ['addressId' => 1, 'city' => 'New York'], ['addressId' => 1, 'city' => 'Austin'], ['email' => 'customer@example.com', 'password' => 'password'], 'updateCustomerAddress', 'city' ], 'Update Customer Email' => [ <<<'QUERY' mutation($email: String!, $password: String!) { updateCustomerEmail( email: $email password: $password ) { customer { email } } } QUERY, ['email' => 'customer2@example.com', 'password' => 'password'], ['email' => 'customer@example.com', 'password' => 'password'], [ ['email' => 'customer@example.com', 'password' => 'password'], ['email' => 'customer2@example.com', 'password' => 'password'], ], 'updateCustomerEmail', 'email', ], 'Generate Customer Token' => [ <<<'QUERY' mutation($email: String!, $password: String!) { generateCustomerToken(email: $email, password: $password) { token } } QUERY, ['email' => 'customer@example.com', 'password' => 'password'], ['email' => 'customer@example.com', 'password' => 'password'], [], 'generateCustomerToken', 'token' ], 'Get Customer' => [ <<<'QUERY' query { customer { created_at date_of_birth default_billing default_shipping date_of_birth email firstname gender id is_subscribed lastname middlename prefix suffix taxvat } } QUERY, [], [], ['email' => 'customer@example.com', 'password' => 'password'], 'getCustomer', '"data":{"customer":{"created_at"' ], ]; } private function getCartMergeMutation(): string { return <<<'QUERY' mutation($cartId1: String!, $cartId2: String!) { mergeCarts( source_cart_id: $cartId1 destination_cart_id: $cartId2 ) { items { quantity product { sku } } } } QUERY; } private function getRequestPasswordResetEmailMutation(): string { return <<<'QUERY' mutation($email: String!) { requestPasswordResetEmail(email: $email) } QUERY; } private function getResetPasswordMutation() { return <<<'QUERY' mutation($email: String!, $newPassword: String!, $resetPasswordToken: String!) { resetPassword( email: $email resetPasswordToken: $resetPasswordToken newPassword: $newPassword ) } QUERY; } private function getChangePasswordMutation() { return <<<'QUERY' mutation($currentPassword: String!, $newPassword: String!) { changeCustomerPassword( currentPassword: $currentPassword newPassword: $newPassword ) { id email firstname lastname } } QUERY; } private function getCreateCustomerAddressMutation(): string { return <<<'QUERY' mutation { createCustomerAddress( input: { region: { region: "Alberta" region_id: 66 region_code: "AB" } country_code: CA street: ["Line 1 Street","Line 2"] company: "Company Name" telephone: "123456789" fax: "123123123" postcode: "7777" city: "New York" firstname: "Adam" lastname: "Phillis" middlename: "A" prefix: "Mr." suffix: "Jr." vat_id: "1" default_shipping: true default_billing: true } ) { id customer_id region { region region_id region_code } country_code street company telephone fax postcode city firstname lastname middlename prefix suffix vat_id default_shipping default_billing } } QUERY; } }