Completed
Push — master ( 0f74a6...eca3e7 )
by Kamil
20:39
created

OrderItemsTaxesApplicatorSpec::let()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
dl 0
loc 8
rs 9.4285
c 1
b 0
f 1
nc 1
cc 1
eloc 6
nop 4
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace spec\Sylius\Component\Core\Taxation\Applicator;
13
14
use Doctrine\Common\Collections\Collection;
15
use PhpSpec\ObjectBehavior;
16
use Prophecy\Argument;
17
use Sylius\Component\Core\Distributor\IntegerDistributorInterface;
18
use Sylius\Component\Addressing\Model\ZoneInterface;
19
use Sylius\Component\Core\Model\AdjustmentInterface;
20
use Sylius\Component\Core\Model\OrderInterface;
21
use Sylius\Component\Core\Model\OrderItemInterface;
22
use Sylius\Component\Core\Model\OrderItemUnitInterface;
23
use Sylius\Component\Core\Model\ProductVariantInterface;
24
use Sylius\Component\Core\Taxation\Applicator\OrderItemsTaxesApplicator;
25
use Sylius\Component\Core\Taxation\Applicator\OrderTaxesApplicatorInterface;
26
use Sylius\Component\Order\Factory\AdjustmentFactoryInterface;
27
use Sylius\Component\Taxation\Calculator\CalculatorInterface;
28
use Sylius\Component\Taxation\Model\TaxRateInterface;
29
use Sylius\Component\Taxation\Resolver\TaxRateResolverInterface;
30
31
/**
32
 * @mixin OrderItemsTaxesApplicator
33
 *
34
 * @author Mateusz Zalewski <[email protected]>
35
 * @author Mark McKelvie <[email protected]>
36
 */
37
class OrderItemsTaxesApplicatorSpec extends ObjectBehavior
38
{
39
    function let(
40
        CalculatorInterface $calculator,
41
        AdjustmentFactoryInterface $adjustmentsFactory,
42
        IntegerDistributorInterface $distributor,
43
        TaxRateResolverInterface $taxRateResolver
44
    ) {
45
        $this->beConstructedWith($calculator, $adjustmentsFactory, $distributor, $taxRateResolver);
46
    }
47
48
    function it_is_initializable()
49
    {
50
        $this->shouldHaveType('Sylius\Component\Core\Taxation\Applicator\OrderItemsTaxesApplicator');
51
    }
52
53
    function it_implements_order_shipment_taxes_applicator_interface()
54
    {
55
        $this->shouldImplement(OrderTaxesApplicatorInterface::class);
56
    }
57
58
    function it_applies_taxes_on_units_based_on_item_total_and_rate(
59
        $adjustmentsFactory,
60
        $calculator,
61
        $distributor,
62
        $taxRateResolver,
63
        AdjustmentInterface $taxAdjustment1,
64
        AdjustmentInterface $taxAdjustment2,
65
        Collection $items,
66
        Collection $units,
67
        OrderInterface $order,
68
        OrderItemInterface $orderItem,
69
        OrderItemUnitInterface $unit1,
70
        OrderItemUnitInterface $unit2,
71
        ProductVariantInterface $productVariant,
72
        TaxRateInterface $taxRate,
73
        ZoneInterface $zone
74
    ) {
75
        $order->getItems()->willReturn($items);
76
77
        $items->count()->willReturn(1);
78
        $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()]));
79
80
        $orderItem->getQuantity()->willReturn(2);
81
82
        $orderItem->getVariant()->willReturn($productVariant);
83
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn($taxRate);
84
85
        $orderItem->getTotal()->willReturn(1000);
86
        $calculator->calculate(1000, $taxRate)->willReturn(100);
87
88
        $taxRate->getLabel()->willReturn('Simple tax (10%)');
89
        $taxRate->isIncludedInPrice()->willReturn(false);
90
91
        $orderItem->getUnits()->willReturn($units);
92
        $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()]));
93
94
        $distributor->distribute(100, 2)->willReturn([50, 50]);
95
96
        $adjustmentsFactory
97
            ->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, 'Simple tax (10%)', 50, false)
98
            ->willReturn($taxAdjustment1, $taxAdjustment2)
99
        ;
100
101
        $unit1->addAdjustment($taxAdjustment1)->shouldBeCalled();
102
        $unit2->addAdjustment($taxAdjustment2)->shouldBeCalled();
103
104
        $this->apply($order, $zone);
105
    }
106
107
    function it_does_nothing_if_order_item_has_no_units(
108
        $taxRateResolver,
109
        Collection $items,
110
        \Iterator $iterator,
111
        OrderInterface $order,
112
        OrderItemInterface $orderItem,
113
        ZoneInterface $zone
114
    ) {
115
        $order->getItems()->willReturn($items);
116
117
        $items->count()->willReturn(1);
118
        $items->getIterator()->willReturn($iterator);
119
        $iterator->rewind()->shouldBeCalled();
120
        $iterator->valid()->willReturn(true, false)->shouldBeCalled();
121
        $iterator->current()->willReturn($orderItem);
122
        $iterator->next()->shouldBeCalled();
123
124
        $orderItem->getQuantity()->willReturn(0);
125
        $taxRateResolver->resolve(Argument::any())->shouldNotBeCalled();
126
127
        $this->apply($order, $zone);
128
    }
129
130
    function it_does_nothing_if_tax_rate_cannot_be_resolved(
131
        $taxRateResolver,
132
        Collection $items,
133
        \Iterator $iterator,
134
        OrderInterface $order,
135
        OrderItemInterface $orderItem,
136
        ProductVariantInterface $productVariant,
137
        ZoneInterface $zone
138
    ) {
139
        $order->getItems()->willReturn($items);
140
141
        $items->count()->willReturn(1);
142
        $items->getIterator()->willReturn($iterator);
143
        $iterator->rewind()->shouldBeCalled();
144
        $iterator->valid()->willReturn(true, false)->shouldBeCalled();
145
        $iterator->current()->willReturn($orderItem);
146
        $iterator->next()->shouldBeCalled();
147
148
        $orderItem->getQuantity()->willReturn(5);
149
150
        $orderItem->getVariant()->willReturn($productVariant);
151
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn(null);
152
153
        $orderItem->getUnits()->shouldNotBeCalled();
154
155
        $this->apply($order, $zone);
156
    }
157
158
    function it_does_not_apply_taxes_with_amount_0(
159
        $adjustmentsFactory,
160
        $calculator,
161
        $distributor,
162
        $taxRateResolver,
163
        Collection $items,
164
        Collection $units,
165
        OrderInterface $order,
166
        OrderItemInterface $orderItem,
167
        OrderItemUnitInterface $unit1,
168
        OrderItemUnitInterface $unit2,
169
        ProductVariantInterface $productVariant,
170
        TaxRateInterface $taxRate,
171
        ZoneInterface $zone
172
    ) {
173
        $order->getItems()->willReturn($items);
174
175
        $items->count()->willReturn(1);
176
        $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()]));
177
178
        $orderItem->getQuantity()->willReturn(2);
179
        $orderItem->getVariant()->willReturn($productVariant);
180
181
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn($taxRate);
182
183
        $orderItem->getTotal()->willReturn(1000);
184
        $calculator->calculate(1000, $taxRate)->willReturn(0);
185
186
        $taxRate->getLabel()->willReturn('Simple tax (0%)');
187
        $taxRate->isIncludedInPrice()->willReturn(false);
188
189
        $orderItem->getUnits()->willReturn($units);
190
        $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()]));
191
192
        $distributor->distribute(0, 2)->willReturn([0, 0]);
193
194
        $adjustmentsFactory->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, 'Simple tax (0%)', 0, false)->shouldNotBeCalled();
195
196
        $this->apply($order, $zone);
197
    }
198
}
199