mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-14 17:10:53 +00:00
[API] Subscribing to newsletter on account register
This commit is contained in:
parent
fa4c1d30dd
commit
dc202a69a4
8 changed files with 84 additions and 7 deletions
|
|
@ -7,7 +7,7 @@ Feature: Subscribing to the newsletter during registration
|
||||||
Background:
|
Background:
|
||||||
Given the store operates on a single channel in "United States"
|
Given the store operates on a single channel in "United States"
|
||||||
|
|
||||||
@ui
|
@ui @api
|
||||||
Scenario: Subscribing to the newsletter during registration
|
Scenario: Subscribing to the newsletter during registration
|
||||||
When I want to register a new account
|
When I want to register a new account
|
||||||
And I specify the first name as "Saul"
|
And I specify the first name as "Saul"
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,10 @@ declare(strict_types=1);
|
||||||
namespace Sylius\Behat\Context\Api\Shop;
|
namespace Sylius\Behat\Context\Api\Shop;
|
||||||
|
|
||||||
use Behat\Behat\Context\Context;
|
use Behat\Behat\Context\Context;
|
||||||
|
use Sylius\Behat\Client\ApiClientInterface;
|
||||||
|
use Sylius\Behat\Client\ResponseCheckerInterface;
|
||||||
|
use Sylius\Behat\Service\SharedStorageInterface;
|
||||||
|
use Sylius\Component\Core\Model\CustomerInterface;
|
||||||
use Symfony\Component\BrowserKit\AbstractBrowser;
|
use Symfony\Component\BrowserKit\AbstractBrowser;
|
||||||
use Webmozart\Assert\Assert;
|
use Webmozart\Assert\Assert;
|
||||||
|
|
||||||
|
|
@ -22,15 +26,32 @@ final class RegistrationContext implements Context
|
||||||
/** @var AbstractBrowser */
|
/** @var AbstractBrowser */
|
||||||
private $client;
|
private $client;
|
||||||
|
|
||||||
|
/** @var ApiClientInterface */
|
||||||
|
private $customerClient;
|
||||||
|
|
||||||
/** @var LoginContext */
|
/** @var LoginContext */
|
||||||
private $loginContext;
|
private $loginContext;
|
||||||
|
|
||||||
|
/** @var SharedStorageInterface */
|
||||||
|
private $sharedStorage;
|
||||||
|
|
||||||
|
/** @var ResponseCheckerInterface */
|
||||||
|
private $responseChecker;
|
||||||
|
|
||||||
private $content = [];
|
private $content = [];
|
||||||
|
|
||||||
public function __construct(AbstractBrowser $client, LoginContext $loginContext)
|
public function __construct(
|
||||||
{
|
AbstractBrowser $client,
|
||||||
|
ApiClientInterface $customerClient,
|
||||||
|
LoginContext $loginContext,
|
||||||
|
SharedStorageInterface $sharedStorage,
|
||||||
|
ResponseCheckerInterface $responseChecker
|
||||||
|
) {
|
||||||
$this->client = $client;
|
$this->client = $client;
|
||||||
|
$this->customerClient = $customerClient;
|
||||||
$this->loginContext = $loginContext;
|
$this->loginContext = $loginContext;
|
||||||
|
$this->sharedStorage = $sharedStorage;
|
||||||
|
$this->responseChecker = $responseChecker;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -86,6 +107,33 @@ final class RegistrationContext implements Context
|
||||||
$this->content['phoneNumber'] = $phoneNumber;
|
$this->content['phoneNumber'] = $phoneNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @When I subscribe to the newsletter
|
||||||
|
*/
|
||||||
|
public function iSubscribeToTheNewsletter(): void
|
||||||
|
{
|
||||||
|
$this->content['subscribedToNewsletter'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @When I verify my account using link sent to :customer
|
||||||
|
*/
|
||||||
|
public function iVerifyMyAccount(CustomerInterface $customer): void
|
||||||
|
{
|
||||||
|
$this->sharedStorage->set('customer', $customer);
|
||||||
|
|
||||||
|
$token = $customer->getUser()->getEmailVerificationToken();
|
||||||
|
|
||||||
|
$this->client->request(
|
||||||
|
'PATCH',
|
||||||
|
\sprintf('/api/v2/shop/account-verification-requests/%s', $token),
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
['HTTP_ACCEPT' => 'application/ld+json', 'CONTENT_TYPE' => 'application/merge-patch+json'],
|
||||||
|
json_encode([], \JSON_THROW_ON_ERROR)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @When I confirm this password
|
* @When I confirm this password
|
||||||
*/
|
*/
|
||||||
|
|
@ -201,6 +249,18 @@ final class RegistrationContext implements Context
|
||||||
// Intentionally left blank
|
// Intentionally left blank
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Then I should be subscribed to the newsletter
|
||||||
|
*/
|
||||||
|
public function iShouldBeSubscribedToTheNewsletter(): void
|
||||||
|
{
|
||||||
|
$customer = $this->sharedStorage->get('customer');
|
||||||
|
|
||||||
|
$response = $this->customerClient->show((string) $customer->getId());
|
||||||
|
|
||||||
|
Assert::true($this->responseChecker->getResponseContent($response)['subscribedToNewsletter']);
|
||||||
|
}
|
||||||
|
|
||||||
private function assertFieldValidationMessage(string $path, string $message): void
|
private function assertFieldValidationMessage(string $path, string $message): void
|
||||||
{
|
{
|
||||||
$decodedResponse = json_decode($this->client->getResponse()->getContent(), true, 512, \JSON_THROW_ON_ERROR);
|
$decodedResponse = json_decode($this->client->getResponse()->getContent(), true, 512, \JSON_THROW_ON_ERROR);
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,10 @@
|
||||||
|
|
||||||
<service id="sylius.behat.context.api.shop.registration" class="Sylius\Behat\Context\Api\Shop\RegistrationContext">
|
<service id="sylius.behat.context.api.shop.registration" class="Sylius\Behat\Context\Api\Shop\RegistrationContext">
|
||||||
<argument type="service" id="test.client" />
|
<argument type="service" id="test.client" />
|
||||||
|
<argument type="service" id="sylius.behat.api_platform_client.shop.account" />
|
||||||
<argument type="service" id="sylius.behat.context.api.shop.login" />
|
<argument type="service" id="sylius.behat.context.api.shop.login" />
|
||||||
|
<argument type="service" id="sylius.behat.shared_storage" />
|
||||||
|
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
<service id="sylius.behat.context.api.shop.order" class="Sylius\Behat\Context\Api\Shop\OrderContext">
|
<service id="sylius.behat.context.api.shop.order" class="Sylius\Behat\Context\Api\Shop\OrderContext">
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,12 @@ class RegisterShopUser implements ChannelCodeAwareInterface, LocaleCodeAwareInte
|
||||||
*/
|
*/
|
||||||
public $password;
|
public $password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
* @psalm-immutable
|
||||||
|
*/
|
||||||
|
public $subscribedToNewsletter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|null
|
* @var string|null
|
||||||
* @psalm-immutable
|
* @psalm-immutable
|
||||||
|
|
@ -59,12 +65,14 @@ class RegisterShopUser implements ChannelCodeAwareInterface, LocaleCodeAwareInte
|
||||||
string $lastName,
|
string $lastName,
|
||||||
string $email,
|
string $email,
|
||||||
string $password,
|
string $password,
|
||||||
|
bool $subscribedToNewsletter,
|
||||||
?string $phoneNumber = null
|
?string $phoneNumber = null
|
||||||
) {
|
) {
|
||||||
$this->firstName = $firstName;
|
$this->firstName = $firstName;
|
||||||
$this->lastName = $lastName;
|
$this->lastName = $lastName;
|
||||||
$this->email = $email;
|
$this->email = $email;
|
||||||
$this->password = $password;
|
$this->password = $password;
|
||||||
|
$this->subscribedToNewsletter = $subscribedToNewsletter;
|
||||||
$this->phoneNumber = $phoneNumber;
|
$this->phoneNumber = $phoneNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ final class RegisterShopUserHandler implements MessageHandlerInterface
|
||||||
|
|
||||||
$customer->setFirstName($command->firstName);
|
$customer->setFirstName($command->firstName);
|
||||||
$customer->setLastName($command->lastName);
|
$customer->setLastName($command->lastName);
|
||||||
|
$customer->setSubscribedToNewsletter($command->subscribedToNewsletter);
|
||||||
$customer->setPhoneNumber($command->phoneNumber);
|
$customer->setPhoneNumber($command->phoneNumber);
|
||||||
$customer->setUser($user);
|
$customer->setUser($user);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,5 +28,8 @@
|
||||||
<attribute name="password">
|
<attribute name="password">
|
||||||
<group>shop:customer:create</group>
|
<group>shop:customer:create</group>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
<attribute name="subscribedToNewsletter">
|
||||||
|
<group>shop:customer:create</group>
|
||||||
|
</attribute>
|
||||||
</class>
|
</class>
|
||||||
</serializer>
|
</serializer>
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@
|
||||||
<group>shop:customer:update</group>
|
<group>shop:customer:update</group>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
|
||||||
<attribute name="subscribedToNewsletter" >
|
<attribute name="subscribedToNewsletter">
|
||||||
<group>shop:customer:read</group>
|
<group>shop:customer:read</group>
|
||||||
<group>shop:customer:update</group>
|
<group>shop:customer:update</group>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ final class RegisterShopUserHandlerSpec extends ObjectBehavior
|
||||||
GeneratorInterface $generator,
|
GeneratorInterface $generator,
|
||||||
MessageBusInterface $commandBus
|
MessageBusInterface $commandBus
|
||||||
): void {
|
): void {
|
||||||
$command = new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', '+13104322400');
|
$command = new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', true,'+13104322400');
|
||||||
$command->setChannelCode('CHANNEL_CODE');
|
$command->setChannelCode('CHANNEL_CODE');
|
||||||
$command->setLocaleCode('en_US');
|
$command->setLocaleCode('en_US');
|
||||||
|
|
||||||
|
|
@ -79,6 +79,7 @@ final class RegisterShopUserHandlerSpec extends ObjectBehavior
|
||||||
|
|
||||||
$customer->setFirstName('Will')->shouldBeCalled();
|
$customer->setFirstName('Will')->shouldBeCalled();
|
||||||
$customer->setLastName('Smith')->shouldBeCalled();
|
$customer->setLastName('Smith')->shouldBeCalled();
|
||||||
|
$customer->setSubscribedToNewsletter(true)->shouldBeCalled();
|
||||||
$customer->setPhoneNumber('+13104322400')->shouldBeCalled();
|
$customer->setPhoneNumber('+13104322400')->shouldBeCalled();
|
||||||
$customer->setUser($shopUser)->shouldBeCalled();
|
$customer->setUser($shopUser)->shouldBeCalled();
|
||||||
|
|
||||||
|
|
@ -116,7 +117,7 @@ final class RegisterShopUserHandlerSpec extends ObjectBehavior
|
||||||
ChannelInterface $channel,
|
ChannelInterface $channel,
|
||||||
MessageBusInterface $commandBus
|
MessageBusInterface $commandBus
|
||||||
): void {
|
): void {
|
||||||
$command = new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', '+13104322400');
|
$command = new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', true, '+13104322400');
|
||||||
$command->setChannelCode('CHANNEL_CODE');
|
$command->setChannelCode('CHANNEL_CODE');
|
||||||
$command->setLocaleCode('en_US');
|
$command->setLocaleCode('en_US');
|
||||||
|
|
||||||
|
|
@ -129,6 +130,7 @@ final class RegisterShopUserHandlerSpec extends ObjectBehavior
|
||||||
|
|
||||||
$customer->setFirstName('Will')->shouldBeCalled();
|
$customer->setFirstName('Will')->shouldBeCalled();
|
||||||
$customer->setLastName('Smith')->shouldBeCalled();
|
$customer->setLastName('Smith')->shouldBeCalled();
|
||||||
|
$customer->setSubscribedToNewsletter(true)->shouldBeCalled();
|
||||||
$customer->setPhoneNumber('+13104322400')->shouldBeCalled();
|
$customer->setPhoneNumber('+13104322400')->shouldBeCalled();
|
||||||
$customer->setUser($shopUser)->shouldBeCalled();
|
$customer->setUser($shopUser)->shouldBeCalled();
|
||||||
|
|
||||||
|
|
@ -169,7 +171,7 @@ final class RegisterShopUserHandlerSpec extends ObjectBehavior
|
||||||
|
|
||||||
$this
|
$this
|
||||||
->shouldThrow(\DomainException::class)
|
->shouldThrow(\DomainException::class)
|
||||||
->during('__invoke', [new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', '+13104322400')])
|
->during('__invoke', [new RegisterShopUser('Will', 'Smith', 'WILL.SMITH@example.com', 'iamrobot', true, '+13104322400')])
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue