Completed
Pull Request — master (#11)
by Laurens
02:02
created

PurchaseClientTest::assertPurchase()   C

Complexity

Conditions 8
Paths 44

Size

Total Lines 65
Code Lines 51

Duplication

Lines 6
Ratio 9.23 %

Importance

Changes 0
Metric Value
dl 6
loc 65
rs 6.7651
c 0
b 0
f 0
cc 8
eloc 51
nc 44
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\IzettleApi\Tests\Integration\Client;
6
7
use DateTime;
8
use GuzzleHttp\Client as GuzzleClient;
9
use GuzzleHttp\Handler\MockHandler;
10
use GuzzleHttp\HandlerStack;
11
use GuzzleHttp\Psr7\Response;
12
use LauLamanApps\IzettleApi\API\Purchase\AbstractPayment;
13
use LauLamanApps\IzettleApi\API\Purchase\Payment\CardPayment;
14
use LauLamanApps\IzettleApi\API\Purchase\Payment\CashPayment;
15
use LauLamanApps\IzettleApi\API\Purchase\Product;
16
use LauLamanApps\IzettleApi\API\Purchase\Purchase;
17
use LauLamanApps\IzettleApi\API\Purchase\PurchaseHistory;
18
use LauLamanApps\IzettleApi\Client\AccessToken;
19
use LauLamanApps\IzettleApi\ClientFactory;
20
use LauLamanApps\IzettleApi\GuzzleIzettleClient;
21
use LauLamanApps\IzettleApi\IzettleClientInterface;
22
use PHPUnit\Framework\TestCase;
23
use Ramsey\Uuid\Uuid;
24
25
/**
26
 * @medium
27
 */
28
final class PurchaseClientTest extends TestCase
29
{
30
    /**
31
     * @test
32
     */
33
    public function getPurchaseHistory(): void
34
    {
35
        $json = file_get_contents(dirname(__FILE__) . '/files/PurchaseClient/getPurchaseHistory.json');
36
        $data = json_decode($json, true);
37
        $iZettleClient = $this->getGuzzleIzettleClient(200, $json);
38
        $purchaseClient = ClientFactory::getPurchaseClient($iZettleClient);
39
40
        $purchaseHistory = $purchaseClient->getPurchaseHistory();
41
42
        self::assertInstanceOf(PurchaseHistory::class, $purchaseHistory);
43
44
        $index = 0;
45
        foreach ($purchaseHistory->getPurchases() as $purchase) {
46
            $this->assertPurchase($purchase, $data['purchases'][$index]);
47
            $index++;
48
        }
49
    }
50
51
    /**
52
     * @test
53
     */
54
    public function getPurchase(): void
55
    {
56
        $json = file_get_contents(dirname(__FILE__) . '/files/PurchaseClient/getPurchase.json');
57
        $data = json_decode($json, true);
58
        $iZettleClient = $this->getGuzzleIzettleClient(200, $json);
59
        $purchaseClient = ClientFactory::getPurchaseClient($iZettleClient);
60
61
        $purchase = $purchaseClient->getPurchase(Uuid::uuid1());
62
63
        $this->assertPurchase($purchase, $data);
64
    }
65
66
    /**
67
     * @test
68
     * @expectedException \LauLamanApps\IzettleApi\Client\Exceptions\PurchaseNotFoundException
69
     */
70
    public function getPurchase_404ShouldThrowException(): void
71
    {
72
        $iZettleClient = $this->getGuzzleIzettleClient(404, '');
73
        $purchaseClient = ClientFactory::getPurchaseClient($iZettleClient);
74
75
        $purchaseHistory = $purchaseClient->getPurchase(Uuid::uuid1());
76
77
        self::assertInstanceOf(Purchase::class, $purchaseHistory);
78
    }
79
80
    private function assertPurchase($purchase, $data): void
81
    {
82
        self::assertInstanceOf(Purchase::class, $purchase);
83
        self::assertSame($data['purchaseUUID'], $purchase->getUuid());
84
        self::assertSame($data['purchaseUUID1'], (string) $purchase->getUuid1());
85
        self::assertSame($data["amount"], (int) $purchase->getAmount()->getAmount());
86
        self::assertSame($data["vatAmount"], (int) $purchase->getVatAmount()->getAmount());
87
        self::assertSame($data["country"], $purchase->getCountry());
88
        self::assertSame($data["currency"], $purchase->getAmount()->getCurrency()->getCode());
89
        self::assertEquals(new DateTime($data["timestamp"]), $purchase->getTimestamp());
90
        self::assertSame($data["gpsCoordinates"]['latitude'], $purchase->getCoordinates()->getLatitude());
91
        self::assertSame($data["gpsCoordinates"]['longitude'], $purchase->getCoordinates()->getLongitude());
92
        self::assertSame((float) $data["gpsCoordinates"]['accuracyMeters'], $purchase->getCoordinates()->getAccuracyMeters());
93
        self::assertSame($data["purchaseNumber"], $purchase->getPurchaseNumber());
94
        self::assertSame($data["userDisplayName"], $purchase->getUser()->getDisplayName());
95
        self::assertSame($data["userId"], $purchase->getUser()->getId());
96
        self::assertSame($data["organizationId"], $purchase->getOrganizationId());
97
98
        foreach ($purchase->getProducts() as $index => $product) {
99
            self::assertInstanceOf(Product::class, $product);
100
            self::assertSame($data["products"][$index]['quantity'], (string)$product->getQuantity());
101
            self::assertSame((float) $data["products"][$index]['vatPercentage'], $product->getVatPercentage());
102
            self::assertSame($data["products"][$index]['unitPrice'], (int) $product->getUnitPrice()->getAmount());
103
            self::assertSame($data["products"][$index]['rowTaxableAmount'], (int) $product->getRowTaxableAmount()->getAmount());
104
            self::assertSame($data["products"][$index]['name'], $product->getName());
105
            self::assertSame($data["products"][$index]['variantName'], $product->getVariantName());
106
            self::assertSame($data["products"][$index]['autoGenerated'], $product->isAutoGenerated());
107
            self::assertSame($data["products"][$index]['libraryProduct'], $product->isLibraryProduct());
108
        }
109
110
        foreach ($purchase->getPayments() as $index => $payment) {
111
            self::assertInstanceOf(AbstractPayment::class, $payment);
112
            self::assertSame($data["payments"][$index]['uuid'], (string) $payment->getUuid());
113
            self::assertSame($data["payments"][$index]['amount'], (int) $payment->getAmount()->getAmount());
114
            if ($payment instanceof CashPayment) {
115
                self::assertSame($data['payments'][$index]['attributes']['handedAmount'], (int) $payment->getHandedAmount()->getAmount());
116
            }
117
            if ($payment instanceof CardPayment) {
118
                self::assertSame($data['payments'][$index]['attributes']['cardPaymentEntryMode'], $payment->getCardPaymentEntryMode());
119
                self::assertSame($data['payments'][$index]['attributes']['maskedPan'], $payment->getMaskedPan());
120
                self::assertSame($data['payments'][$index]['attributes']['referenceNumber'], $payment->getReferenceNumber());
121
                self::assertSame($data['payments'][$index]['attributes']['nrOfInstallments'], $payment->getNrOfInstallments());
122
                self::assertSame($data['payments'][$index]['attributes']['cardType'], $payment->getCardType());
123
                self::assertSame($data['payments'][$index]['attributes']['terminalVerificationResults'], $payment->getTerminalVerificationResults());
124 View Code Duplication
                if (array_key_exists('applicationIdentifier', $data['payments'][$index]['attributes'])) {
125
                    self::assertSame($data['payments'][$index]['attributes']['applicationIdentifier'], $payment->getApplicationIdentifier());
126
                }
127 View Code Duplication
                if (array_key_exists('applicationName', $data['payments'][$index]['attributes'])) {
128
                    self::assertSame($data['payments'][$index]['attributes']['applicationName'], $payment->getApplicationName());
129
                }
130
            }
131
        }
132
133
        self::assertSame($data["receiptCopyAllowed"], $purchase->isReceiptCopyAllowed());
134
        self::assertSame($data["published"], $purchase->getPublished());
135
136
        foreach ($purchase->getPayments() as $index => $payment) {
137
            self::assertInstanceOf(AbstractPayment::class, $payment);
138
            self::assertSame($data["payments"][$index]['uuid'], (string) $payment->getUuid());
139
            self::assertSame($data["payments"][$index]['amount'], (int) $payment->getAmount()->getAmount());
140
        }
141
142
        self::assertSame($data["refund"], $purchase->isRefund());
143
        self::assertSame($data["refunded"], $purchase->isRefunded());
144
    }
145
146
    private function getGuzzleIzettleClient(int $status, string $body): IzettleClientInterface
147
    {
148
        $mock = new MockHandler([new Response($status, [], $body)]);
149
        $handler = HandlerStack::create($mock);
150
151
        return new GuzzleIzettleClient(new GuzzleClient(['handler' => $handler]), $this->getAccessToken());
152
    }
153
154
    private function getAccessToken() : AccessToken
155
    {
156
        return new AccessToken('', new DateTime('+ 1 day'), '');
157
    }
158
}
159