@@ -42,4 +42,153 @@ function it_provides_non_neutral_tax_based_on_given_order_item(
4242
4343 $ this ->provide ($ orderItem )->shouldReturn ([20 ]);
4444 }
45+
46+ function it_returns_empty_array_when_no_taxes_exist (
47+ OrderItemInterface $ orderItem ,
48+ OrderItemUnitInterface $ orderItemUnit ,
49+ ): void {
50+ $ orderItem ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
51+ ->willReturn (new ArrayCollection ([]));
52+
53+ $ orderItem ->getUnits ()->willReturn (new ArrayCollection ([$ orderItemUnit ->getWrappedObject ()]));
54+ $ orderItemUnit ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
55+ ->willReturn (new ArrayCollection ([]));
56+
57+ $ this ->provide ($ orderItem )->shouldReturn ([]);
58+ }
59+
60+ function it_returns_empty_array_when_only_neutral_taxes_exist (
61+ OrderItemInterface $ orderItem ,
62+ AdjustmentInterface $ neutralAdjustment1 ,
63+ AdjustmentInterface $ neutralAdjustment2 ,
64+ OrderItemUnitInterface $ orderItemUnit ,
65+ AdjustmentInterface $ neutralUnitAdjustment ,
66+ ): void {
67+ $ orderItem ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
68+ ->willReturn (new ArrayCollection ([
69+ $ neutralAdjustment1 ->getWrappedObject (),
70+ $ neutralAdjustment2 ->getWrappedObject (),
71+ ]));
72+
73+ $ neutralAdjustment1 ->isNeutral ()->willReturn (true );
74+ $ neutralAdjustment1 ->getAmount ()->shouldNotBeCalled ();
75+ $ neutralAdjustment2 ->isNeutral ()->willReturn (true );
76+ $ neutralAdjustment2 ->getAmount ()->shouldNotBeCalled ();
77+
78+ $ orderItem ->getUnits ()->willReturn (new ArrayCollection ([$ orderItemUnit ->getWrappedObject ()]));
79+ $ orderItemUnit ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
80+ ->willReturn (new ArrayCollection ([$ neutralUnitAdjustment ->getWrappedObject ()]));
81+
82+ $ neutralUnitAdjustment ->isNeutral ()->willReturn (true );
83+ $ neutralUnitAdjustment ->getAmount ()->shouldNotBeCalled ();
84+
85+ $ this ->provide ($ orderItem )->shouldReturn ([]);
86+ }
87+
88+ function it_collects_multiple_non_neutral_taxes_from_order_item_and_units (
89+ OrderItemInterface $ orderItem ,
90+ AdjustmentInterface $ orderItemTax1 ,
91+ AdjustmentInterface $ orderItemTax2 ,
92+ OrderItemUnitInterface $ orderItemUnit1 ,
93+ OrderItemUnitInterface $ orderItemUnit2 ,
94+ AdjustmentInterface $ unit1Tax ,
95+ AdjustmentInterface $ unit2Tax ,
96+ ): void {
97+ $ orderItem ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
98+ ->willReturn (new ArrayCollection ([
99+ $ orderItemTax1 ->getWrappedObject (),
100+ $ orderItemTax2 ->getWrappedObject (),
101+ ]));
102+
103+ $ orderItemTax1 ->isNeutral ()->willReturn (false );
104+ $ orderItemTax1 ->getAmount ()->willReturn (100 );
105+ $ orderItemTax2 ->isNeutral ()->willReturn (false );
106+ $ orderItemTax2 ->getAmount ()->willReturn (50 );
107+
108+ $ orderItem ->getUnits ()->willReturn (new ArrayCollection ([
109+ $ orderItemUnit1 ->getWrappedObject (),
110+ $ orderItemUnit2 ->getWrappedObject (),
111+ ]));
112+
113+ $ orderItemUnit1 ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
114+ ->willReturn (new ArrayCollection ([$ unit1Tax ->getWrappedObject ()]));
115+ $ orderItemUnit2 ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
116+ ->willReturn (new ArrayCollection ([$ unit2Tax ->getWrappedObject ()]));
117+
118+ $ unit1Tax ->isNeutral ()->willReturn (false );
119+ $ unit1Tax ->getAmount ()->willReturn (25 );
120+ $ unit2Tax ->isNeutral ()->willReturn (false );
121+ $ unit2Tax ->getAmount ()->willReturn (25 );
122+
123+ $ this ->provide ($ orderItem )->shouldReturn ([100 , 50 , 25 , 25 ]);
124+ }
125+
126+ function it_filters_out_neutral_taxes_and_only_returns_non_neutral (
127+ OrderItemInterface $ orderItem ,
128+ AdjustmentInterface $ nonNeutralTax ,
129+ AdjustmentInterface $ neutralTax ,
130+ OrderItemUnitInterface $ orderItemUnit ,
131+ AdjustmentInterface $ unitNonNeutralTax ,
132+ AdjustmentInterface $ unitNeutralTax ,
133+ ): void {
134+ $ orderItem ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
135+ ->willReturn (new ArrayCollection ([
136+ $ nonNeutralTax ->getWrappedObject (),
137+ $ neutralTax ->getWrappedObject (),
138+ ]));
139+
140+ $ nonNeutralTax ->isNeutral ()->willReturn (false );
141+ $ nonNeutralTax ->getAmount ()->willReturn (200 );
142+ $ neutralTax ->isNeutral ()->willReturn (true );
143+ $ neutralTax ->getAmount ()->shouldNotBeCalled ();
144+
145+ $ orderItem ->getUnits ()->willReturn (new ArrayCollection ([$ orderItemUnit ->getWrappedObject ()]));
146+ $ orderItemUnit ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
147+ ->willReturn (new ArrayCollection ([
148+ $ unitNonNeutralTax ->getWrappedObject (),
149+ $ unitNeutralTax ->getWrappedObject (),
150+ ]));
151+
152+ $ unitNonNeutralTax ->isNeutral ()->willReturn (false );
153+ $ unitNonNeutralTax ->getAmount ()->willReturn (30 );
154+ $ unitNeutralTax ->isNeutral ()->willReturn (true );
155+ $ unitNeutralTax ->getAmount ()->shouldNotBeCalled ();
156+
157+ $ this ->provide ($ orderItem )->shouldReturn ([200 , 30 ]);
158+ }
159+
160+ function it_handles_multiple_units_with_different_tax_amounts (
161+ OrderItemInterface $ orderItem ,
162+ OrderItemUnitInterface $ unit1 ,
163+ OrderItemUnitInterface $ unit2 ,
164+ OrderItemUnitInterface $ unit3 ,
165+ AdjustmentInterface $ unit1Tax ,
166+ AdjustmentInterface $ unit2Tax ,
167+ AdjustmentInterface $ unit3Tax ,
168+ ): void {
169+ $ orderItem ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
170+ ->willReturn (new ArrayCollection ([]));
171+
172+ $ orderItem ->getUnits ()->willReturn (new ArrayCollection ([
173+ $ unit1 ->getWrappedObject (),
174+ $ unit2 ->getWrappedObject (),
175+ $ unit3 ->getWrappedObject (),
176+ ]));
177+
178+ $ unit1 ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
179+ ->willReturn (new ArrayCollection ([$ unit1Tax ->getWrappedObject ()]));
180+ $ unit2 ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
181+ ->willReturn (new ArrayCollection ([$ unit2Tax ->getWrappedObject ()]));
182+ $ unit3 ->getAdjustments (AdjustmentInterface::TAX_ADJUSTMENT )
183+ ->willReturn (new ArrayCollection ([$ unit3Tax ->getWrappedObject ()]));
184+
185+ $ unit1Tax ->isNeutral ()->willReturn (false );
186+ $ unit1Tax ->getAmount ()->willReturn (100 );
187+ $ unit2Tax ->isNeutral ()->willReturn (false );
188+ $ unit2Tax ->getAmount ()->willReturn (100 );
189+ $ unit3Tax ->isNeutral ()->willReturn (false );
190+ $ unit3Tax ->getAmount ()->willReturn (100 );
191+
192+ $ this ->provide ($ orderItem )->shouldReturn ([100 , 100 , 100 ]);
193+ }
45194}
0 commit comments