Skip to content

Commit 44cfea9

Browse files
authored
Merge pull request #123 from LinioIT/feat/scp-2509-SDK-PHP-Update-SDK-with-new-GetTrackingCode-endpoint
[SCP-2509] feat: add support for new tracking code endpoint
2 parents c945393 + 3062ec1 commit 44cfea9

File tree

7 files changed

+222
-0
lines changed

7 files changed

+222
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Linio\SellerCenter\Factory\Xml\Order;
6+
7+
use Linio\SellerCenter\Model\Order\TrackingCode;
8+
use Linio\SellerCenter\Validator\XmlStructureValidator;
9+
use SimpleXMLElement;
10+
11+
class TrackingCodeFactory
12+
{
13+
private const XML_MODEL = 'TrackingCode';
14+
private const REQUIRED_FIELDS = [
15+
'DispatchId',
16+
'TrackingNumber',
17+
];
18+
19+
public static function make(SimpleXMLElement $element): TrackingCode
20+
{
21+
XmlStructureValidator::validateStructure($element->TrackingCode, self::XML_MODEL, self::REQUIRED_FIELDS);
22+
23+
return new TrackingCode(
24+
(string) $element->TrackingCode->DispatchId,
25+
(string) $element->TrackingCode->TrackingNumber
26+
);
27+
}
28+
}

src/Model/Order/TrackingCode.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Linio\SellerCenter\Model\Order;
6+
7+
use JsonSerializable;
8+
use stdClass;
9+
10+
class TrackingCode implements JsonSerializable
11+
{
12+
/**
13+
* @var string
14+
*/
15+
protected $dispatchId;
16+
17+
/**
18+
* @var string
19+
*/
20+
protected $trackingNumber;
21+
22+
public function __construct(string $dispatchId, string $trackingNumber)
23+
{
24+
$this->dispatchId = $dispatchId;
25+
$this->trackingNumber = $trackingNumber;
26+
}
27+
28+
public function getDispatchId(): string
29+
{
30+
return $this->dispatchId;
31+
}
32+
33+
public function getTrackingNumber(): string
34+
{
35+
return $this->trackingNumber;
36+
}
37+
38+
public function jsonSerialize(): stdClass
39+
{
40+
$serialized = new stdClass();
41+
$serialized->dispatchId = $this->dispatchId;
42+
$serialized->trackingNumber = $this->trackingNumber;
43+
44+
return $serialized;
45+
}
46+
}

src/Service/OrderManager.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
use Linio\SellerCenter\Factory\Xml\Order\OrderItemsFactory;
2020
use Linio\SellerCenter\Factory\Xml\Order\OrdersFactory;
2121
use Linio\SellerCenter\Factory\Xml\Order\OrdersItemsFactory;
22+
use Linio\SellerCenter\Factory\Xml\Order\TrackingCodeFactory;
2223
use Linio\SellerCenter\Formatter\LogMessageFormatter;
2324
use Linio\SellerCenter\Model\Order\FailureReason;
2425
use Linio\SellerCenter\Model\Order\Order;
2526
use Linio\SellerCenter\Model\Order\OrderItem;
27+
use Linio\SellerCenter\Model\Order\TrackingCode;
2628
use Linio\SellerCenter\Response\HandleResponse;
2729
use Linio\SellerCenter\Response\SuccessResponse;
2830

@@ -752,6 +754,37 @@ public function setInvoiceNumber(
752754
return $response;
753755
}
754756

757+
public function getTrackingCode(
758+
string $packageId,
759+
string $shippingProvider
760+
): TrackingCode {
761+
$action = 'GetTrackingCode';
762+
$parameters = $this->makeParametersForAction($action);
763+
764+
$parameters->set([
765+
'packageId' => $packageId,
766+
'shipping_provider_name' => $shippingProvider,
767+
]);
768+
769+
$requestId = $this->generateRequestId();
770+
$response = $this->executeAction(
771+
$action,
772+
$parameters,
773+
$requestId,
774+
'GET'
775+
);
776+
777+
$this->logger->info(
778+
sprintf(
779+
'%d::%s::APIResponse::SellerCenterSdk: Get Tracking Code',
780+
$requestId,
781+
$action
782+
)
783+
);
784+
785+
return TrackingCodeFactory::make($response->getBody());
786+
}
787+
755788
public function setStatusToCanceled(int $orderItemId, string $reason, string $reasonDetail = null): void
756789
{
757790
$action = 'SetStatusToCanceled';

tests/Functional/OrdersManagerTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Linio\SellerCenter\Model\Order\Order;
1515
use Linio\SellerCenter\Model\Order\OrderItem;
1616
use Linio\SellerCenter\Model\Order\OrderItems;
17+
use Linio\SellerCenter\Model\Order\TrackingCode;
1718
use Linio\SellerCenter\Response\SuccessResponse;
1819
use Linio\SellerCenter\Service\OrderManager;
1920
use Prophecy\Argument;
@@ -544,6 +545,24 @@ public function testItReturnFailureReasons(): void
544545
$this->assertContainsOnlyInstancesOf(FailureReason::class, $failureReasons);
545546
}
546547

548+
public function testItGetTrackingCode(): void
549+
{
550+
$xml = $this->getOrdersResponse('Order/TrackingCodeSucessResponse.xml');
551+
$client = $this->createClientWithResponse($xml);
552+
$parameters = $this->getParameters();
553+
554+
$configuration = new Configuration($parameters['key'], $parameters['username'], $parameters['endpoint'], $parameters['version']);
555+
556+
$sdkClient = new SellerCenterSdk($configuration, $client);
557+
558+
$response = $sdkClient->orders()->getTrackingCode(
559+
'1e8382f4-70b6-4ffd-b479-f7373408d232',
560+
'chilexpress'
561+
);
562+
563+
$this->assertInstanceOf(TrackingCode::class, $response);
564+
}
565+
547566
public function dateTimesAndFilters(): array
548567
{
549568
$date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2018-09-01 00:00:00');
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Linio\SellerCenter\Order;
6+
7+
use Linio\Component\Util\Json;
8+
use Linio\SellerCenter\Exception\InvalidXmlStructureException;
9+
use Linio\SellerCenter\Factory\Xml\Order\TrackingCodeFactory;
10+
use Linio\SellerCenter\LinioTestCase;
11+
use Linio\SellerCenter\Model\Order\TrackingCode;
12+
13+
class TrackingCodeTest extends LinioTestCase
14+
{
15+
protected $dispachId = '10f9780b-380c-4625-8024-b166ece74453';
16+
protected $trackingNumber = 'MOCKED_be834cdb-551f-4d03-bea7-38d255c4b13b';
17+
protected $schema = 'Order/TrackingCodeSucessResponse.xml';
18+
protected $jsonSchema = 'Order/TrackingCode.json';
19+
20+
public function testItReturnsValidTrackingCode(): void
21+
{
22+
$simpleXml = simplexml_load_string($this->getSchema($this->schema))->Body;
23+
24+
$trackingCode = TrackingCodeFactory::make($simpleXml);
25+
26+
$this->assertInstanceOf(TrackingCode::class, $trackingCode);
27+
$this->assertEquals($simpleXml->TrackingCode->DispatchId, $trackingCode->getDispatchId());
28+
$this->assertEquals($simpleXml->TrackingCode->TrackingNumber, $trackingCode->getTrackingNumber());
29+
}
30+
31+
/**
32+
* @dataProvider invalidXmlStructure
33+
*/
34+
public function testItThrowsAExceptionWithoutAPropertyInTheXml(string $property): void
35+
{
36+
$this->expectException(InvalidXmlStructureException::class);
37+
38+
$this->expectExceptionMessage(
39+
sprintf(
40+
'The xml structure is not valid for a TrackingCode. The property %s should exist.',
41+
$property
42+
)
43+
);
44+
45+
$simpleXml = simplexml_load_string($this->getSchema($this->schema))->Body;
46+
47+
unset($simpleXml->TrackingCode->{$property});
48+
49+
TrackingCodeFactory::make($simpleXml);
50+
}
51+
52+
public function testItReturnsAJsonRepresentation(): void
53+
{
54+
$simpleXml = simplexml_load_string($this->getSchema($this->schema))->Body;
55+
56+
$address = TrackingCodeFactory::make($simpleXml);
57+
58+
$expectedJson = Json::decode($this->getSchema($this->jsonSchema));
59+
60+
$expectedJson['dispatchId'] = $this->dispachId;
61+
$expectedJson['trackingNumber'] = $this->trackingNumber;
62+
63+
$this->assertJsonStringEqualsJsonString(Json::encode($expectedJson), Json::encode($address));
64+
}
65+
66+
public function invalidXmlStructure(): array
67+
{
68+
return [
69+
['DispatchId'],
70+
['TrackingNumber'],
71+
];
72+
}
73+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"dispatchId": "%s",
3+
"trackingNumber": "%s"
4+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SuccessResponse>
3+
<Head>
4+
<RequestId/>
5+
<RequestAction>GetTrackingCode</RequestAction>
6+
<ResponseType>TrackingCode</ResponseType>
7+
<Timestamp>2022-02-09T09:46:09-0300</Timestamp>
8+
<RequestParameters>
9+
<packageId>10f9780b-380c-4625-8024-b166ece74453</packageId>
10+
<shipping_provider_name>chilexpress</shipping_provider_name>
11+
</RequestParameters>
12+
</Head>
13+
<Body>
14+
<TrackingCode>
15+
<DispatchId>10f9780b-380c-4625-8024-b166ece74453</DispatchId>
16+
<TrackingNumber>MOCKED_be834cdb-551f-4d03-bea7-38d255c4b13b</TrackingNumber>
17+
</TrackingCode>
18+
</Body>
19+
</SuccessResponse>

0 commit comments

Comments
 (0)