Completed
Branch master (84d5f3)
by Baldur
10:23
created

ClientTest::testCreateTransaction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 19
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 14
nc 1
nop 0
1
<?php
2
3
namespace LAShowroom\TaxJarBundle\Tests;
4
5
use LAShowroom\TaxJarBundle\Client;
6
use LAShowroom\TaxJarBundle\Model\Address;
7
use LAShowroom\TaxJarBundle\Model\LineItem;
8
use LAShowroom\TaxJarBundle\Model\Order;
9
use LAShowroom\TaxJarBundle\Model\Response\TaxBreakdown;
10
use LAShowroom\TaxJarBundle\Model\Response\TaxDetail;
11
use LAShowroom\TaxJarBundle\Model\Response\TaxResponse;
12
use LAShowroom\TaxJarBundle\Tests\Model\OrderTest;
13
use Prophecy\Argument;
14
use Symfony\Component\Cache\Adapter\ArrayAdapter;
15
use Symfony\Component\Cache\CacheItem;
16
use TaxJar\TaxJar;
17
18
class ClientTest extends \PHPUnit_Framework_TestCase
19
{
20
    /**
21
     * @var Client
22
     */
23
    private $client;
24
25
    protected function setup()
26
    {
27
        $clientProphesy = $this->prophesize('\TaxJar\Client');
28
        $clientProphesy
29
            ->taxForOrder(
30
                Argument::type('array')
31
            )
32
            ->willReturn(
33
                json_decode('{"order_total_amount":15.0,"shipping":1.5,"taxable_amount":15,"amount_to_collect":1.31,"rate":0.0875,"has_nexus":true,"freight_taxable":false,"tax_source":"destination","breakdown":{"taxable_amount":15,"tax_collectable":1.31,"combined_tax_rate":0.0875,"state_taxable_amount":15,"state_tax_rate":0.0625,"state_tax_collectable":0.94,"county_taxable_amount":15,"county_tax_rate":0.01,"county_tax_collectable":0.15,"city_taxable_amount":0,"city_tax_rate":0,"city_tax_collectable":0,"special_district_taxable_amount":15,"special_tax_rate":0.015,"special_district_tax_collectable":0.23,"line_items":[{"id":"1","taxable_amount":15,"tax_collectable":1.31,"combined_tax_rate":0.0875,"state_taxable_amount":15,"state_sales_tax_rate":0.0625,"state_amount":0.94,"county_taxable_amount":15,"county_tax_rate":0.01,"county_amount":0.15,"city_taxable_amount":0,"city_tax_rate":0,"city_amount":0,"special_district_taxable_amount":15,"special_tax_rate":0.015,"special_district_amount":0.23}]}}')
34
            )
35
        ;
36
37
        $clientProphesy
38
            ->createOrder(
39
                Argument::type('array')
40
            )
41
            ->willReturn(
42
                json_decode('{"transaction_id":"1234567","user_id":36803,"transaction_date":"2017-02-02T18:57:32.000Z","transaction_reference_id":null,"from_country":"US","from_zip":"92093","from_state":"CA","from_city":"LA JOLLA","from_street":"9500 Gilman Drive","to_country":"US","to_zip":"90002","to_state":"CA","to_city":"LOS ANGELES","to_street":"1335 E 103rd St","amount":"16.5","shipping":"1.5","sales_tax":"1.23","line_items":[{"id":0,"quantity":1,"product_identifier":null,"product_tax_code":"20010","description":null,"unit_price":"15.0","discount":"0.0","sales_tax":"0.0"}]}')
43
            )
44
        ;
45
46
        $this->client = new Client($clientProphesy->reveal());
47
    }
48
49
    public function testGetRatesForOrder()
50
    {
51
        $order = OrderTest::getTestOrder();
52
53
        $result = $this->client->getTaxesForOrder($order);
54
55
        $this->assertInstanceOf(TaxResponse::class, $result);
56
        $this->assertEquals(15.0, $result->getTotalAmount());
57
        $this->assertEquals(1.5, $result->getShipping());
58
        $this->assertEquals(15, $result->getTaxableAmount());
59
        $this->assertEquals(1.31, $result->getAmountToCollect());
60
        $this->assertEquals(0.0875, $result->getRate());
61
        $this->assertEquals(true, $result->hasNexus());
62
        $this->assertEquals(false, $result->isFreightTaxable());
63
        $this->assertEquals('destination', $result->getTaxSource());
64
65
        $this->assertInstanceOf(TaxBreakdown::class, $result->getTaxBreakdown());
66
        $this->verifyTaxBreakDown($result->getTaxBreakdown());
67
    }
68
69
    public function testCacheCold()
70
    {
71
        $cache = new ArrayAdapter();
72
        $this->assertFalse($cache->hasItem(OrderTest::getTestOrder()->getCacheKey()));
73
74
        $this->client->setCacheItemPool($cache);
75
76
        $result = $this->client->getTaxesForOrder(OrderTest::getTestOrder());
77
        $this->assertInstanceOf(TaxResponse::class, $result);
78
79
        $this->assertTrue($cache->hasItem(OrderTest::getTestOrder()->getCacheKey()));
80
        $this->assertEquals($result, $cache->getItem(OrderTest::getTestOrder()->getCacheKey())->get());
81
    }
82
83
    public function testCacheWarm()
84
    {
85
        $cache = new ArrayAdapter();
86
        $this->assertFalse($cache->hasItem(OrderTest::getTestOrder()->getCacheKey()));
87
        $cacheItem = $cache->getItem(OrderTest::getTestOrder()->getCacheKey());
88
89
        $result = $this->client->getTaxesForOrder(OrderTest::getTestOrder());
90
91
        $cacheItem->set($result);
92
        $cache->save($cacheItem);
93
94
        $clientProphesy = $this->prophesize('\TaxJar\Client');
95
        $clientProphesy
96
            ->taxForOrder(
97
                Argument::type('array')
98
            )->shouldNotBeCalled();
99
100
        $client = new Client($clientProphesy->reveal());
101
        $client->setCacheItemPool($cache);
102
103
        $resultFromCache = $client->getTaxesForOrder(OrderTest::getTestOrder());
104
        $this->assertInstanceOf(TaxResponse::class, $resultFromCache);
105
106
        $this->assertEquals($result, $resultFromCache);
107
    }
108
109
    public function testCreateTransaction()
110
    {
111
        $order = OrderTest::getTestOrder();
112
        $order->setTransactionId('1234567');
113
        $order->setTransactionDate($now = new \DateTime);
114
        $order->setSalesTax(1.23);
115
116
        $result = $this->client->createOrderTransaction($order);
117
118
        print_r($result);
119
120
        $this->assertInstanceOf(TaxResponse::class, $result);
121
        $this->assertEquals(16.5, $result->getTotalAmount());
122
        $this->assertEquals(1.5, $result->getShipping());
123
        $this->assertEquals(1.23, $result->getSalesTax());
124
        $this->assertEquals(36803, $result->getUserId());
125
        $this->assertEquals(new \DateTime('2017-02-02T18:57:32.000000+0000'), $result->getTransactionDate());
126
        $this->assertNull($result->getTransactionReferenceId());
127
    }
128
129
    private function verifyTaxBreakDown(TaxBreakdown $taxBreakdown)
130
    {
131
        $this->assertEquals(new TaxDetail(15, 0.0875, 1.31), $taxBreakdown->getTotalTax());
132
        $this->assertEquals(new TaxDetail(15, 0.0625, 0.94), $taxBreakdown->getStateTax());
133
        $this->assertEquals(new TaxDetail(15, 0.01, 0.15), $taxBreakdown->getCountyTax());
134
        $this->assertEquals(new TaxDetail(0, 0, 0), $taxBreakdown->getCityTax());
135
        $this->assertEquals(new TaxDetail(15, 0.015, 0.23), $taxBreakdown->getSpecialDistrictTax());
136
137
        $lineItems = $taxBreakdown->getLineItems();
138
        $this->assertCount(1, $lineItems);
139
        $lineItem = $lineItems[0];
140
141
        $totaxTax = $lineItem->getTotalTax();
142
        $this->assertEquals(15, $totaxTax->getAmount());
143
        $this->assertEquals(0.0875, $totaxTax->getTaxRate());
144
        $this->assertEquals(1.31, $totaxTax->getCollectable());
145
146
        $this->assertEquals(new TaxDetail(15, 0.0625, 0.94), $lineItem->getStateTax());
147
        $this->assertEquals(new TaxDetail(15, 0.01, 0.15), $lineItem->getCountyTax());
148
        $this->assertEquals(new TaxDetail(0, 0, 0), $lineItem->getCityTax());
149
        $this->assertEquals(new TaxDetail(15, 0.015, 0.23), $lineItem->getSpecialDistrictTax());
150
        $this->assertEquals('1', $lineItem->getId());
151
    }
152
}
153