Skip to content

Commit 837b5fa

Browse files
author
gwharton
committed
Added unit tests
Unit tests added to cover all 8 possible options.
1 parent 08172cc commit 837b5fa

9 files changed

+1989
-0
lines changed
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Ups\Test\Unit\Model;
7+
8+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
9+
use Magento\Ups\Model\Carrier;
10+
use Magento\Framework\App\Config\ScopeConfigInterface;
11+
use Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory as RateResultErrorFactory;
12+
use Psr\Log\LoggerInterface;
13+
use Magento\Framework\Xml\Security;
14+
use Magento\Shipping\Model\Simplexml\ElementFactory;
15+
use Magento\Shipping\Model\Rate\ResultFactory as RateResultFactory;
16+
use Magento\Quote\Model\Quote\Address\RateResult\MethodFactory;
17+
use Magento\Quote\Model\Quote\Address\RateResult\Method;
18+
use Magento\Shipping\Model\Rate\Result as RateResult;
19+
use Magento\Framework\Pricing\PriceCurrencyInterface;
20+
use Magento\Shipping\Model\Tracking\ResultFactory as TrackResultFactory;
21+
use Magento\Shipping\Model\Tracking\Result\ErrorFactory as TrackingResultErrorFactory;
22+
use Magento\Shipping\Model\Tracking\Result\StatusFactory;
23+
use Magento\Directory\Model\RegionFactory;
24+
use Magento\Directory\Model\Country;
25+
use Magento\Directory\Model\CountryFactory;
26+
use Magento\Directory\Model\CurrencyFactory;
27+
use Magento\Directory\Model\Currency;
28+
use Magento\Directory\Helper\Data;
29+
use Magento\CatalogInventory\Model\StockRegistry;
30+
use Magento\Framework\Locale\FormatInterface;
31+
use Magento\Ups\Helper\Config;
32+
use Magento\Quote\Model\Quote\Address\RateRequest;
33+
34+
/**
35+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
36+
*/
37+
class CarrierTestOptions extends \PHPUnit\Framework\TestCase
38+
{
39+
40+
/**
41+
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
42+
*/
43+
private $objectManager;
44+
45+
/**
46+
* @var \Magento\Quote\Model\Quote\Address\RateRequest;
47+
*/
48+
private $rateRequest;
49+
50+
/**
51+
* @var string;
52+
*/
53+
private $allowed_methods;
54+
55+
/**
56+
* @var int;
57+
*/
58+
private $negotiatedactive;
59+
60+
/**
61+
* @var int;
62+
*/
63+
private $include_taxes;
64+
65+
protected function setUp()
66+
{
67+
68+
$this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
69+
70+
$scopeMock = $this->getMockBuilder(ScopeConfigInterface::class)
71+
->disableOriginalConstructor()
72+
->getMock();
73+
74+
$scopeMock->expects($this->any())
75+
->method('getValue')
76+
->willReturnCallback([$this, 'scopeConfigGetValue']);
77+
$scopeMock->expects($this->any())
78+
->method('isSetFlag')
79+
->willReturnCallback([$this, 'scopeConfigisSetFlag']);
80+
81+
$rateResultErrorFactoryMock = $this->getMockBuilder(RateResultErrorFactory::class)
82+
->disableOriginalConstructor()
83+
->getMock();
84+
85+
$loggerInterfaceMock = $this->getMockBuilder(LoggerInterface::class)
86+
->disableOriginalConstructor()
87+
->getMock();
88+
89+
$securityMock = $this->getMockBuilder(Security::class)
90+
->disableOriginalConstructor()
91+
->getMock();
92+
93+
$elementFactoryMock = $this->getMockBuilder(ElementFactory::class)
94+
->disableOriginalConstructor()
95+
->getMock();
96+
97+
$rateResultMock = $this->getMockBuilder(RateResult::class)
98+
->disableOriginalConstructor()
99+
->setMethods(['getError'])
100+
->getMock();
101+
102+
$rateResultFactoryMock = $this->getMockBuilder(RateResultFactory::class)
103+
->disableOriginalConstructor()
104+
->setMethods(['create'])
105+
->getMock();
106+
107+
$rateResultFactoryMock->expects($this->any())
108+
->method('create')
109+
->willReturn($rateResultMock);
110+
111+
$priceCurrencyInterfaceMock = $this->getMockBuilder(PriceCurrencyInterface::class)
112+
->disableOriginalConstructor()
113+
->getMock();
114+
115+
$rateMethodMock = $this->getMockBuilder(Method::class)
116+
->setConstructorArgs(['priceCurrency' => $priceCurrencyInterfaceMock])
117+
->setMethods(null)
118+
->getMock();
119+
120+
$methodFactoryMock = $this->getMockBuilder(MethodFactory::class)
121+
->disableOriginalConstructor()
122+
->setMethods(['create'])
123+
->getMock();
124+
125+
$methodFactoryMock->expects($this->any())
126+
->method('create')
127+
->willReturn($rateMethodMock);
128+
129+
$trackResultFactoryMock = $this->getMockBuilder(TrackResultFactory::class)
130+
->disableOriginalConstructor()
131+
->getMock();
132+
133+
$trackingResultErrorFactoryMock = $this->getMockBuilder(TrackingResultErrorFactory::class)
134+
->disableOriginalConstructor()
135+
->getMock();
136+
137+
$statusFactoryMock = $this->getMockBuilder(StatusFactory::class)
138+
->disableOriginalConstructor()
139+
->getMock();
140+
141+
$regionFactoryMock = $this->getMockBuilder(RegionFactory::class)
142+
->disableOriginalConstructor()
143+
->getMock();
144+
145+
$countryMock = $this->getMockBuilder(Country::class)
146+
->disableOriginalConstructor()
147+
->setMethods(['load', 'getData'])
148+
->getMock();
149+
150+
$countryMock->expects($this->any())
151+
->method('load')
152+
->willReturnSelf();
153+
154+
$countryFactoryMock = $this->getMockBuilder(CountryFactory::class)
155+
->disableOriginalConstructor()
156+
->setMethods(['create'])
157+
->getMock();
158+
159+
$countryFactoryMock->expects($this->any())
160+
->method('create')
161+
->willReturn($countryMock);
162+
163+
$allowCurrencies = ['GBP'];
164+
$baseCurrencies = ['GBP'];
165+
$currencyRates = ['GBP' => ['GBP' => 1]];
166+
$currencyFactoryMock = $this->getMockBuilder(CurrencyFactory::class)
167+
->disableOriginalConstructor()
168+
->setMethods(['create'])
169+
->getMock();
170+
$currencyMock = $this->getMockBuilder(Currency::class)
171+
->disableOriginalConstructor()
172+
->setMethods(['getConfigAllowCurrencies', 'getConfigBaseCurrencies', 'getCurrencyRates'])
173+
->getMock();
174+
$currencyFactoryMock->expects($this->once())
175+
->method('create')
176+
->willReturn($currencyMock);
177+
$currencyMock->expects($this->any())
178+
->method('getConfigAllowCurrencies')
179+
->willReturn($allowCurrencies);
180+
$currencyMock->expects($this->any())
181+
->method('getConfigBaseCurrencies')
182+
->willReturn($baseCurrencies);
183+
$currencyMock->expects($this->any())
184+
->method('getCurrencyRates')
185+
->with($baseCurrencies, $allowCurrencies)
186+
->willReturn($currencyRates);
187+
188+
$dataMock = $this->getMockBuilder(Data::class)
189+
->disableOriginalConstructor()
190+
->getMock();
191+
192+
$stockRegistryMock = $this->getMockBuilder(StockRegistry::class)
193+
->disableOriginalConstructor()
194+
->getMock();
195+
196+
$formatInterfaceMock = $this->getMockBuilder(FormatInterface::class)
197+
->disableOriginalConstructor()
198+
->getMock();
199+
200+
$configHelperMock = $this->getMockBuilder(Config::class)
201+
->disableOriginalConstructor()
202+
->getMock();
203+
204+
$this->model = $this->getMockBuilder(Carrier::class)
205+
->setMethods(['_getCachedQuotes', 'canCollectRates', '_updateFreeMethodQuote', '_getBaseCurrencyRate'])
206+
->setConstructorArgs(
207+
[
208+
'scopeConfig' => $scopeMock,
209+
'rateErrorFactory' => $rateResultErrorFactoryMock,
210+
'logger' => $loggerInterfaceMock,
211+
'xmlSecurity' => $securityMock,
212+
'xmlElFactory' => $elementFactoryMock,
213+
'rateFactory' => $rateResultFactoryMock,
214+
'rateMethodFactory' => $methodFactoryMock,
215+
'trackFactory' => $trackResultFactoryMock,
216+
'trackErrorFactory' => $trackingResultErrorFactoryMock,
217+
'trackStatusFactory' => $statusFactoryMock,
218+
'regionFactory' => $regionFactoryMock,
219+
'countryFactory' => $countryFactoryMock,
220+
'currencyFactory' => $currencyFactoryMock,
221+
'directoryData' => $dataMock,
222+
'stockRegistry' => $stockRegistryMock,
223+
'localeFormat' => $formatInterfaceMock,
224+
'configHelper' => $configHelperMock,
225+
'data' => [],
226+
]
227+
)
228+
->getMock();
229+
230+
$this->model->expects($this->any())
231+
->method('canCollectRates')
232+
->willReturn(true);
233+
234+
$this->model->expects($this->any())
235+
->method('_getBaseCurrencyRate')
236+
->willReturn(1.00);
237+
238+
$this->rateRequest = $this->objectManager->getObject(RateRequest::class);
239+
}
240+
241+
/**
242+
* Callback function, emulates getValue function
243+
* @param $path
244+
* @return null|string
245+
*/
246+
public function scopeConfigGetValue($path)
247+
{
248+
$pathMap = [
249+
'carriers/ups/type' => 'UPS_XML',
250+
'carriers/ups/shipper_number' => '12345',
251+
'carriers/ups/allowed_methods' => $this->allowed_methods,
252+
];
253+
254+
return isset($pathMap[$path]) ? $pathMap[$path] : null;
255+
}
256+
257+
/**
258+
* Callback function, emulates isSetFlag function
259+
* @param $path
260+
* @return bool
261+
*/
262+
public function scopeConfigisSetFlag($path)
263+
{
264+
$pathMap = [
265+
'carriers/ups/negotiated_active' => $this->negotiatedactive,
266+
'carriers/ups/include_taxes' => $this->include_taxes,
267+
];
268+
269+
if (isset($pathMap[$path]))
270+
if ($pathMap[$path])
271+
return(true);
272+
else
273+
return(false);
274+
}
275+
276+
/**
277+
* @param int $neg
278+
* @param int $tax
279+
* @param string $file
280+
* @param string $method
281+
* @param float $expectedprice
282+
* @dataProvider collectRatesDataProvider
283+
*/
284+
public function testCollectRates($neg, $tax, $file, $method, $expectedprice)
285+
{
286+
287+
$this->negotiatedactive = $neg;
288+
$this->include_taxes = $tax;
289+
$this->allowed_methods = $method;
290+
291+
$response = file_get_contents(__DIR__ . $file);
292+
$this->model->expects($this->any())
293+
->method('_getCachedQuotes')
294+
->willReturn($response);
295+
296+
$rates = $this->model->collectRates($this->rateRequest)->getAllRates();
297+
foreach ($rates as $rate) {
298+
$this->assertEquals($expectedprice, $rate->getData('cost'));
299+
$this->assertEquals($method, $rate->getData('method'));
300+
}
301+
}
302+
303+
/**
304+
* Get list of rates variations
305+
* @return array
306+
*/
307+
public function collectRatesDataProvider()
308+
{
309+
return [
310+
[0, 0, '/_files/ups_rates_response_option1.xml', '11', 6.45 ],
311+
[0, 0, '/_files/ups_rates_response_option2.xml', '65', 29.59 ],
312+
[0, 1, '/_files/ups_rates_response_option3.xml', '11', 7.74 ],
313+
[0, 1, '/_files/ups_rates_response_option4.xml', '65', 29.59 ],
314+
[1, 0, '/_files/ups_rates_response_option5.xml', '11', 9.35 ],
315+
[1, 0, '/_files/ups_rates_response_option6.xml', '65', 41.61 ],
316+
[1, 1, '/_files/ups_rates_response_option7.xml', '11', 11.22 ],
317+
[1, 1, '/_files/ups_rates_response_option8.xml', '65', 41.61 ],
318+
];
319+
}
320+
321+
}

0 commit comments

Comments
 (0)