Passed
Push — master ( 9ff768...b736eb )
by Laurens
02:33
created

DiscountParserTest::createFromResponse()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 26
Code Lines 19

Duplication

Lines 7
Ratio 26.92 %

Importance

Changes 0
Metric Value
dl 7
loc 26
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 19
nc 3
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\IzettleApi\Tests\Unit\Client\Product;
6
7
use DateTime;
8
use LauLamanApps\IzettleApi\API\ImageCollection;
9
use LauLamanApps\IzettleApi\API\Product\Discount;
10
use LauLamanApps\IzettleApi\Client\Product\DiscountParser;
11
use Mockery;
12
use Money\Money;
13
use PHPUnit\Framework\TestCase;
14
use Psr\Http\Message\ResponseInterface;
15
use Ramsey\Uuid\Uuid;
16
17
/**
18
 * @small
19
 */
20
final class DiscountParserTest extends TestCase
21
{
22
    /**
23
     * @test
24
     * @dataProvider getProductResponseData
25
     */
26
    public function createFromResponse(ResponseInterface $response, $data)
27
    {
28
        /** @var Discount[] $discounts */
29
        $discounts = DiscountParser::createFromResponse($response);
30
31
        foreach ($discounts as $index => $discount) {
32
            self::assertInstanceOf(Discount::class, $discount);
33
            self::assertSame($data[$index]['uuid'], (string) $discount->getUuid());
34
            self::assertSame($data[$index]['name'], $discount->getName());
35
            self::assertSame($data[$index]['description'], $discount->getDescription());
36
            self::assertInstanceOf(ImageCollection::class, $discount->getImageCollection());
37
            self::assertSame($data[$index]['externalReference'], $discount->getExternalReference());
38
            self::assertSame($data[$index]['etag'], $discount->getEtag());
39
            self::assertEquals(new DateTime($data[$index]['updated']), $discount->getUpdatedAt());
40
            self::assertSame($data[$index]['updatedBy'], (string) $discount->getUpdatedBy());
41
            self::assertEquals(new DateTime($data[$index]['created']), $discount->getCreatedAt());
42
43 View Code Duplication
            if ($data[$index]['amount']) {
44
                self::assertInstanceOf(Money::class, $discount->getAmount());
45
                self::assertSame((string) $data[$index]['amount']['amount'], $discount->getAmount()->getAmount());
46
                self::assertSame($data[$index]['amount']['currencyId'], $discount->getAmount()->getCurrency()->getCode());
47
            } else {
48
                self::assertSame((float) $data[$index]['percentage'], $discount->getPercentage());
49
            }
50
        }
51
    }
52
53
    public function getProductResponseData(): array
54
    {
55
        $data1 = [[
56
            'uuid' => (string) Uuid::uuid1(),
57
            'name' => 'Some Product',
58
            'description' => 'description',
59
            'imageLookupKeys' => [
60
                'nice-image.jpeg',
61
            ],
62
            'amount' => ['amount' => 1000, 'currencyId' => 'EUR'],
63
            'percentage' => null,
64
            'externalReference' => 'externalReference',
65
            'etag' => 'B1C54B44DB967F4240B59AFA30B1AC5E',
66
            'updated' => '2017-12-06T13:21:59.722+0000',
67
            'updatedBy' => (string) Uuid::uuid1(),
68
            'created' => '2017-12-21T13:12:49.272+0000',
69
        ]];
70
71
        $mock1 = Mockery::mock(ResponseInterface::class);
72
        $mock1->shouldReceive('getBody')->andReturnSelf();
73
        $mock1->shouldReceive('getContents')->andReturn(json_encode(
74
            $data1
75
        ));
76
77
        $data2 = [
78
            [
79
                'uuid' => (string) Uuid::uuid1(),
80
                'name' => 'discount1',
81
                'description' => 'descriptionq',
82
                'imageLookupKeys' => [
83
                    'image1.jpeg',
84
                ],
85
                'amount' => ['amount' => 100, 'currencyId' => 'EUR'],
86
                'percentage' => null,
87
                'externalReference' => 'externalReference',
88
                'etag' => '93D4F5F748933923890C91056A6F0230',
89
                'updated' => '2017-12-06T13:21:59.722+0000',
90
                'updatedBy' => (string) Uuid::uuid1(),
91
                'created' => '2017-12-21T13:12:49.272+0000',
92
            ],
93
            [
94
                'uuid' => (string) Uuid::uuid1(),
95
                'name' => 'discount2',
96
                'description' => 'description2',
97
                'imageLookupKeys' => [
98
                    'image2.jpeg',
99
                ],
100
                'amount' => null,
101
                'percentage' => '10',
102
                'externalReference' => 'externalReference2',
103
                'etag' => '35D7775289BC0A05E580BE3B466C927B',
104
                'updated' => '2017-12-06T13:21:59.722+0000',
105
                'updatedBy' => (string) Uuid::uuid1(),
106
                'created' => '2017-12-21T13:12:49.272+0000',
107
            ]
108
        ];
109
110
        $mock2 = Mockery::mock(ResponseInterface::class);
111
        $mock2->shouldReceive('getBody')->andReturnSelf();
112
        $mock2->shouldReceive('getContents')->andReturn(json_encode(
113
            $data2
114
        ));
115
116
        return [
117
            'single discount' => [ $mock1, $data1 ],
118
            'multiple discount' => [ $mock2, $data2 ],
119
        ];
120
    }
121
}
122