Issues (3641)

Shared/Money/Builder/MoneyBuilderTest.php (2 issues)

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerTest\Shared\Money\Builder;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\Transfer\CurrencyTransfer;
12
use Generated\Shared\Transfer\MoneyTransfer;
13
use Money\Money;
14
use Spryker\Shared\Money\Builder\MoneyBuilder;
15
use Spryker\Shared\Money\Builder\MoneyBuilderInterface;
16
use Spryker\Shared\Money\Converter\DecimalToIntegerConverter;
17
use Spryker\Shared\Money\Exception\InvalidAmountArgumentException;
18
use Spryker\Shared\Money\Mapper\MoneyToTransferMapperInterface;
19
20
/**
21
 * Auto-generated group annotations
22
 *
23
 * @group SprykerTest
24
 * @group Shared
25
 * @group Money
26
 * @group Builder
27
 * @group MoneyBuilderTest
28
 * Add your own group annotations below this line
29
 */
30
class MoneyBuilderTest extends Unit
31
{
32
    /**
33
     * @var string
34
     */
35
    public const DEFAULT_CURRENCY = 'EUR';
36
37
    /**
38
     * @var int
39
     */
40
    public const AMOUNT_INTEGER = 1000;
41
42
    public const AMOUNT_FLOAT = 10.00;
43
44
    /**
45
     * @var string
46
     */
47
    public const AMOUNT_STRING = '1000';
48
49
    /**
50
     * @var string
51
     */
52
    public const OTHER_CURRENCY = 'USD';
53
54
    /**
55
     * @return void
56
     */
57
    public function testConstruct(): void
58
    {
59
        $moneyBuilder = $this->getMoneyBuilder();
60
        $this->assertInstanceOf(MoneyBuilderInterface::class, $moneyBuilder);
61
    }
62
63
    /**
64
     * @return void
65
     */
66
    public function testFromIntegerWithoutCurrencyShouldReturnMoneyTransferWithDefaultCurrency(): void
67
    {
68
        $moneyBuilder = $this->getMoneyBuilder();
69
70
        $moneyTransfer = $moneyBuilder->fromInteger(static::AMOUNT_INTEGER);
71
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
72
        $this->assertSame(static::DEFAULT_CURRENCY, $moneyTransfer->getCurrency()->getCode());
73
    }
74
75
    /**
76
     * @return void
77
     */
78
    public function testFromIntegerWithCurrencyShouldReturnMoneyTransfer(): void
79
    {
80
        $moneyBuilder = $this->getMoneyBuilder();
81
82
        $moneyTransfer = $moneyBuilder->fromInteger(static::AMOUNT_INTEGER, static::OTHER_CURRENCY);
83
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
84
        $this->assertSame(static::OTHER_CURRENCY, $moneyTransfer->getCurrency()->getCode());
85
    }
86
87
    /**
88
     * @return void
89
     */
90
    public function testFromIntegerWithoutIntegerShouldThrowException(): void
91
    {
92
        $this->expectException(InvalidAmountArgumentException::class);
93
94
        $moneyBuilder = $this->getMoneyBuilder();
95
        $moneyBuilder->fromInteger(static::AMOUNT_STRING);
0 ignored issues
show
static::AMOUNT_STRING of type string is incompatible with the type integer expected by parameter $amount of Spryker\Shared\Money\Bui...yBuilder::fromInteger(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

95
        $moneyBuilder->fromInteger(/** @scrutinizer ignore-type */ static::AMOUNT_STRING);
Loading history...
96
    }
97
98
    /**
99
     * @return void
100
     */
101
    public function testFromFloatWithoutCurrencyShouldReturnMoneyTransferWithDefaultCurrency(): void
102
    {
103
        $moneyBuilder = $this->getMoneyBuilder();
104
105
        $moneyTransfer = $moneyBuilder->fromFloat(static::AMOUNT_FLOAT);
106
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
107
        $this->assertSame(static::DEFAULT_CURRENCY, $moneyTransfer->getCurrency()->getCode());
108
    }
109
110
    /**
111
     * @return void
112
     */
113
    public function testFromFloatWithCurrencyShouldReturnMoneyTransfer(): void
114
    {
115
        $moneyBuilder = $this->getMoneyBuilder();
116
117
        $moneyTransfer = $moneyBuilder->fromFloat(static::AMOUNT_FLOAT, static::OTHER_CURRENCY);
118
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
119
        $this->assertSame(static::OTHER_CURRENCY, $moneyTransfer->getCurrency()->getCode());
120
    }
121
122
    /**
123
     * @return void
124
     */
125
    public function testFromFloatWithoutFloatShouldThrowException(): void
126
    {
127
        $this->expectException(InvalidAmountArgumentException::class);
128
129
        $moneyBuilder = $this->getMoneyBuilder();
130
        $moneyBuilder->fromFloat(static::AMOUNT_STRING);
0 ignored issues
show
static::AMOUNT_STRING of type string is incompatible with the type double expected by parameter $amount of Spryker\Shared\Money\Bui...neyBuilder::fromFloat(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

130
        $moneyBuilder->fromFloat(/** @scrutinizer ignore-type */ static::AMOUNT_STRING);
Loading history...
131
    }
132
133
    /**
134
     * @return void
135
     */
136
    public function testFromStringWithoutCurrencyShouldReturnMoneyTransferWithDefaultCurrency(): void
137
    {
138
        $moneyBuilder = $this->getMoneyBuilder();
139
140
        $moneyTransfer = $moneyBuilder->fromString(static::AMOUNT_STRING);
141
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
142
        $this->assertSame(static::DEFAULT_CURRENCY, $moneyTransfer->getCurrency()->getCode());
143
    }
144
145
    /**
146
     * @return void
147
     */
148
    public function testFromStringWithCurrencyShouldReturnMoneyTransfer(): void
149
    {
150
        $moneyBuilder = $this->getMoneyBuilder();
151
152
        $moneyTransfer = $moneyBuilder->fromString(static::AMOUNT_STRING, static::OTHER_CURRENCY);
153
        $this->assertSame(static::AMOUNT_STRING, $moneyTransfer->getAmount());
154
        $this->assertSame(static::OTHER_CURRENCY, $moneyTransfer->getCurrency()->getCode());
155
    }
156
157
    /**
158
     * @return void
159
     */
160
    public function testFromStringWithoutStringShouldThrowException(): void
161
    {
162
        $this->expectException(InvalidAmountArgumentException::class);
163
164
        $moneyBuilder = $this->getMoneyBuilder();
165
        $moneyBuilder->fromString(static::AMOUNT_INTEGER);
166
    }
167
168
    /**
169
     * @return void
170
     */
171
    public function testFromStringWithInvalidStringShouldThrowException(): void
172
    {
173
        $this->expectException(InvalidAmountArgumentException::class);
174
175
        $moneyBuilder = $this->getMoneyBuilder();
176
        $moneyBuilder->fromString(static::AMOUNT_STRING . '.00');
177
    }
178
179
    /**
180
     * @return \Spryker\Shared\Money\Mapper\MoneyToTransferMapperInterface|\PHPUnit\Framework\MockObject\MockObject
181
     */
182
    protected function getMoneyToTransferConverterMock(): MoneyToTransferMapperInterface
183
    {
184
        $moneyToTransferConverterMock = $this->getMockBuilder(MoneyToTransferMapperInterface::class)->getMock();
185
        $moneyToTransferConverterMock->method('convert')->willReturnCallback([$this, 'convert']);
186
187
        return $moneyToTransferConverterMock;
188
    }
189
190
    /**
191
     * @param \Money\Money $money
192
     *
193
     * @return \Generated\Shared\Transfer\MoneyTransfer
194
     */
195
    public function convert(Money $money): MoneyTransfer
196
    {
197
        $moneyTransfer = new MoneyTransfer();
198
        $moneyTransfer->setAmount($money->getAmount());
199
200
        $isoCodeTransfer = new CurrencyTransfer();
201
        $isoCodeTransfer->setCode($money->getCurrency()->getCode());
202
        $moneyTransfer->setCurrency($isoCodeTransfer);
203
204
        return $moneyTransfer;
205
    }
206
207
    /**
208
     * @return \Spryker\Shared\Money\Builder\MoneyBuilderInterface
209
     */
210
    protected function getMoneyBuilder(): MoneyBuilderInterface
211
    {
212
        return new MoneyBuilder($this->getMoneyToTransferConverterMock(), new DecimalToIntegerConverter(), static::DEFAULT_CURRENCY);
213
    }
214
}
215