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

OrderItemUnitsTaxesApplicatorSpec   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 7

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 7
lcom 0
cbo 7
dl 0
loc 161
rs 10
c 1
b 0
f 1

7 Methods

Rating   Name   Duplication   Size   Complexity  
A let() 0 7 1
A it_is_initializable() 0 4 1
A it_implements_order_shipment_taxes_applicator_interface() 0 4 1
A it_applies_taxes_on_units_based_on_item_total_and_rate() 0 52 1
A it_does_nothing_if_order_item_has_no_units() 0 22 1
B it_does_nothing_if_tax_rate_cannot_be_resolved() 0 24 1
B it_does_not_apply_taxes_with_amount_0() 0 39 1
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\Addressing\Model\ZoneInterface;
18
use Sylius\Component\Core\Model\AdjustmentInterface;
19
use Sylius\Component\Core\Model\OrderInterface;
20
use Sylius\Component\Core\Model\OrderItemInterface;
21
use Sylius\Component\Core\Model\OrderItemUnitInterface;
22
use Sylius\Component\Core\Model\ProductVariantInterface;
23
use Sylius\Component\Core\Taxation\Applicator\OrderItemUnitsTaxesApplicator;
24
use Sylius\Component\Core\Taxation\Applicator\OrderTaxesApplicatorInterface;
25
use Sylius\Component\Order\Factory\AdjustmentFactoryInterface;
26
use Sylius\Component\Taxation\Calculator\CalculatorInterface;
27
use Sylius\Component\Taxation\Model\TaxRateInterface;
28
use Sylius\Component\Taxation\Resolver\TaxRateResolverInterface;
29
30
/**
31
 * @mixin OrderItemUnitsTaxesApplicator
32
 *
33
 * @author Mark McKelvie <[email protected]>
34
 */
35
class OrderItemUnitsTaxesApplicatorSpec extends ObjectBehavior
36
{
37
    function let(
38
        CalculatorInterface $calculator,
39
        AdjustmentFactoryInterface $adjustmentsFactory,
40
        TaxRateResolverInterface $taxRateResolver
41
    ) {
42
        $this->beConstructedWith($calculator, $adjustmentsFactory, $taxRateResolver);
43
    }
44
45
    function it_is_initializable()
46
    {
47
        $this->shouldHaveType('Sylius\Component\Core\Taxation\Applicator\OrderItemUnitsTaxesApplicator');
48
    }
49
50
    function it_implements_order_shipment_taxes_applicator_interface()
51
    {
52
        $this->shouldImplement(OrderTaxesApplicatorInterface::class);
53
    }
54
55
    function it_applies_taxes_on_units_based_on_item_total_and_rate(
56
        $adjustmentsFactory,
57
        $calculator,
58
        $taxRateResolver,
59
        AdjustmentInterface $taxAdjustment1,
60
        AdjustmentInterface $taxAdjustment2,
61
        Collection $items,
62
        Collection $units,
63
        OrderInterface $order,
64
        OrderItemInterface $orderItem,
65
        OrderItemUnitInterface $unit1,
66
        OrderItemUnitInterface $unit2,
67
        ProductVariantInterface $productVariant,
68
        TaxRateInterface $taxRate,
69
        ZoneInterface $zone
70
    ) {
71
        $order->getItems()->willReturn($items);
72
73
        $items->count()->willReturn(1);
74
        $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()]));
75
76
        $orderItem->getQuantity()->willReturn(2);
77
78
        $orderItem->getVariant()->willReturn($productVariant);
79
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn($taxRate);
80
81
        $taxRate->getLabel()->willReturn('Simple tax (10%)');
82
        $taxRate->isIncludedInPrice()->willReturn(false);
83
84
        $orderItem->getUnits()->willReturn($units);
85
        $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()]));
86
87
        $unit1->getTotal()->willReturn(1000);
88
        $calculator->calculate(1000, $taxRate)->willReturn(100);
89
90
        $unit2->getTotal()->willReturn(900);
91
        $calculator->calculate(900, $taxRate)->willReturn(90);
92
93
        $adjustmentsFactory
94
            ->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, 'Simple tax (10%)', 100, false)
95
            ->willReturn($taxAdjustment1)
96
        ;
97
        $adjustmentsFactory
98
            ->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, 'Simple tax (10%)', 90, false)
99
            ->willReturn($taxAdjustment2)
100
        ;
101
102
        $unit1->addAdjustment($taxAdjustment1)->shouldBeCalled();
103
        $unit2->addAdjustment($taxAdjustment2)->shouldBeCalled();
104
105
        $this->apply($order, $zone);
106
    }
107
108
    function it_does_nothing_if_order_item_has_no_units(
109
        $taxRateResolver,
110
        Collection $items,
111
        \Iterator $iterator,
112
        OrderInterface $order,
113
        OrderItemInterface $orderItem,
114
        ZoneInterface $zone
115
    ) {
116
        $order->getItems()->willReturn($items);
117
118
        $items->count()->willReturn(1);
119
        $items->getIterator()->willReturn($iterator);
120
        $iterator->rewind()->shouldBeCalled();
121
        $iterator->valid()->willReturn(true, false)->shouldBeCalled();
122
        $iterator->current()->willReturn($orderItem);
123
        $iterator->next()->shouldBeCalled();
124
125
        $orderItem->getQuantity()->willReturn(0);
126
        $taxRateResolver->resolve(Argument::any())->shouldNotBeCalled();
127
128
        $this->apply($order, $zone);
129
    }
130
131
    function it_does_nothing_if_tax_rate_cannot_be_resolved(
132
        $calculator,
133
        $taxRateResolver,
134
        Collection $items,
135
        OrderInterface $order,
136
        OrderItemInterface $orderItem,
137
        ProductVariantInterface $productVariant,
138
        ZoneInterface $zone
139
    ) {
140
        $order->getItems()->willReturn($items);
141
142
        $items->count()->willReturn(1);
143
        $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()]));
144
145
        $orderItem->getQuantity()->willReturn(1);
146
147
        $orderItem->getVariant()->willReturn($productVariant);
148
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn(null);
149
150
        $orderItem->getUnits()->shouldNotBeCalled();
151
        $calculator->calculate(Argument::cetera())->shouldNotBeCalled();
152
153
        $this->apply($order, $zone);
154
    }
155
156
    function it_does_not_apply_taxes_with_amount_0(
157
        $adjustmentsFactory,
158
        $calculator,
159
        $taxRateResolver,
160
        Collection $items,
161
        Collection $units,
162
        OrderInterface $order,
163
        OrderItemInterface $orderItem,
164
        OrderItemUnitInterface $unit1,
165
        OrderItemUnitInterface $unit2,
166
        ProductVariantInterface $productVariant,
167
        TaxRateInterface $taxRate,
168
        ZoneInterface $zone
169
    ) {
170
        $order->getItems()->willReturn($items);
171
172
        $items->count()->willReturn(2);
173
        $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()]));
174
175
        $orderItem->getQuantity()->willReturn(2);
176
177
        $orderItem->getVariant()->willReturn($productVariant);
178
        $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn($taxRate);
179
180
        $orderItem->getUnits()->willReturn($units);
181
        $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()]));
182
183
        $unit1->getTotal()->willReturn(1000);
184
        $calculator->calculate(1000, $taxRate)->willReturn(0);
185
186
        $unit2->getTotal()->willReturn(900);
187
        $calculator->calculate(900, $taxRate)->willReturn(0);
188
189
        $adjustmentsFactory->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, Argument::cetera())->shouldNotBeCalled();
190
        $unit1->addAdjustment(Argument::any())->shouldNotBeCalled();
191
        $unit2->addAdjustment(Argument::any())->shouldNotBeCalled();
192
193
        $this->apply($order, $zone);
194
    }
195
}
196