Skip to content

Commit

Permalink
Changes the mandatory parameters to update subscription route
Browse files Browse the repository at this point in the history
It's not mandatory to send all parameters to the update. It's possible to change,
for instance, only the plan_id without to alter the card or the payment method.
To implement it, we use the "memento pattern" instead to make a new request of the early data subscription.

Changes the "plan_id" parameter name. Use "plan_id" instead of "plan" because the body
of request with "plan" is not accepted by API in the route PUT /subscriptions/:id.

Create methods to load the card, plan and payment method with specific validations
to be attached in the body of the request.

Changes unit tests and creates behaviour tests.
  • Loading branch information
ThamaraHessel committed Jun 26, 2017
1 parent 6263175 commit c2e2a0d
Show file tree
Hide file tree
Showing 8 changed files with 284 additions and 83 deletions.
63 changes: 55 additions & 8 deletions lib/Subscription/Request/SubscriptionUpdate.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,76 @@ class SubscriptionUpdate implements RequestInterface
protected $subscription;

/**
* @var Subscription $subscription
* @var Subscription $subscriptionMemento
*/
protected $subscriptionMemento;

/**
* @param Subscription $subscription
* @param Subscription $subscriptionMemento
*/
public function __construct(Subscription $subscription)
public function __construct(Subscription $subscription, Subscription $subscriptionMemento)
{
$this->subscription = $subscription;
$this->subscriptionMemento = $subscriptionMemento;
}

/**
* @return array
*/
public function getPayload()
{
$payload = [
'plan' => $this->subscription->getPlan()->getId(),
'payment_method' => $this->subscription->getPaymentMethod()
];
$payload = new \ArrayObject();
$this->loadCard($payload);
$this->loadPlanId($payload);
$this->loadPaymentMethod($payload);

return $payload->getArrayCopy();
}

/**
* @param ArrayObject $payload
* @return ArrayObject $payload
*/
protected function loadCard(\ArrayObject $payload)
{
$card = $this->subscription->getCard();

if ($card instanceof \PagarMe\Sdk\Card\Card) {
$payload['card_id'] = $this->subscription->getCard()->getId();
$payload->offsetSet('card_id', $card->getId());
}
}

/**
* @param ArrayObject $payload
* @return ArrayObject $payload
*/
protected function loadPlanId(\ArrayObject $payload)
{
$newPlan = $this->subscription->getPlan();
$mementoPlan = $this->subscriptionMemento->getPlan();

if (!$newPlan instanceof \PagarMe\Sdk\Plan\Plan || !$mementoPlan instanceof \PagarMe\Sdk\Plan\Plan) {
return $payload;
}

if ($newPlan->getId() != $mementoPlan->getId()) {
$payload->offsetSet('plan_id', $newPlan->getId());
}
}

/**
* @param ArrayObject $payload
* @return ArrayObject $payload
*/
protected function loadPaymentMethod(\ArrayObject $payload)
{
$newPaymentMethod = $this->subscription->getPaymentMethod();
$mementoPaymentMethod = $this->subscriptionMemento->getPaymentMethod();

return $payload;
if ($newPaymentMethod != $mementoPaymentMethod) {
$payload->offsetSet('payment_method', $newPaymentMethod);
}
}

/**
Expand Down
17 changes: 15 additions & 2 deletions lib/Subscription/SubscriptionBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ trait SubscriptionBuilder
{
use \PagarMe\Sdk\Transaction\TransactionBuilder;

/**
/**
* @var SubscriptonMemento $subscriptionMemento
*/
public $subscriptionMemento;

/**
* @param array $subscriptionData
* @return Subscription
*/
Expand Down Expand Up @@ -42,6 +47,14 @@ private function buildSubscription($subscriptionData)
);
}

return new Subscription(get_object_vars($subscriptionData));
$subscription = new Subscription(get_object_vars($subscriptionData));
$this->subscriptionMemento = new SubscriptionMemento($subscription);

return $subscription;
}

public function getSubscriptionMemento()
{
return $this->subscriptionMemento;
}
}
8 changes: 6 additions & 2 deletions lib/Subscription/SubscriptionHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public function getList($page = null, $count = null)
return $subscriptions;
}

/**
/*
* @param Subscription $subscription
*/
public function cancel(Subscription $subscription)
Expand All @@ -120,7 +120,11 @@ public function cancel(Subscription $subscription)
*/
public function update(Subscription $subscription)
{
$request = new SubscriptionUpdate($subscription);
$subscriptionMemento = clone $subscription;
$this->getSubscriptionMemento()->getPlan($subscriptionMemento);
$this->getSubscriptionMemento()->getPaymentMethod($subscriptionMemento);

$request = new SubscriptionUpdate($subscription, $subscriptionMemento);

$response = $this->client->send($request);

Expand Down
102 changes: 102 additions & 0 deletions lib/Subscription/SubscriptionMemento.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

namespace PagarMe\Sdk\Subscription;

use PagarMe\Sdk\Card\Card;
use PagarMe\Sdk\Plan\Plan;

class SubscriptionMemento
{
/**
* @var int $id
*/
private $id;

/**
* @var Card $card
*/
private $card;

/**
* @var Plan $plan
*/
private $plan;

/**
* @var string $paymentMethod
*/
private $paymentMethod;

/**
* @param Subscription $subscription
*/
public function __construct(Subscription $subscription)
{
$this->setCard($subscription);
$this->setPlan($subscription);
$this->setPaymentMethod($subscription);
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function getId(Subscription $subscription)
{
$subscription->setId($this->id);
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function getCard(Subscription $subscription)
{
$subscription->setCard($this->card);
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function setCard(Subscription $subscription)
{
$this->card = $subscription->getCard();
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function getPlan(Subscription $subscription)
{
$subscription->setPlan($this->plan);
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function setPlan(Subscription $subscription)
{
$this->plan = $subscription->getPlan();
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function getPaymentMethod(Subscription $subscription)
{
$subscription->setPaymentMethod($this->paymentMethod);
}

/**
* @param Subscription $subscription
* @codeCoverageIgnore
*/
public function setPaymentMethod(Subscription $subscription)
{
$this->paymentMethod = $subscription->getPaymentMethod();
}
}
13 changes: 13 additions & 0 deletions tests/acceptance/SubscriptionContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,17 @@ public function transactionsMustBeReturned()
$this->transactions
);
}

/**
* @When I change the subscription plan
*/
public function iChangeTheSubscriptionPlan()
{
$this->aValidPlan();
$this->subscription->setPlan($this->plan);
$this->subscription = self::getPagarMe()
->subscription()
->update($this->subscription);
$this->iQueryForTheSubscription();
}
}
5 changes: 5 additions & 0 deletions tests/acceptance/features/subscription.feature
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,8 @@ Feature: Subscription
Given a previous created subscription
When I query the transactions of this subscription
Then transactions must be returned

Scenario: Update the plan of the subscription
Given previous created subscriptions
When I change the subscription plan
Then the same subscription must be returned

0 comments on commit c2e2a0d

Please sign in to comment.