ExchangeRatesProviderTest::getProvider()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
/**
3
 * (c) itmedia.by <[email protected]>
4
 */
5
6
namespace Submarine\NbrbExchangeRatesBundle\Tests\Provider;
7
8
9
use PHPUnit\Framework\TestCase;
10
use Submarine\NbrbExchangeRatesBundle\Client\ApiClient;
11
use Submarine\NbrbExchangeRatesBundle\Exception\UndefinedCurrencyException;
12
use Submarine\NbrbExchangeRatesBundle\ExchangeRate;
13
use Submarine\NbrbExchangeRatesBundle\Provider\ExchangeRatesProvider;
14
15
class ExchangeRatesProviderTest extends TestCase
16
{
17
18
    const URL_RATES = 'http://www.nbrb.by/Services/XmlExRates.aspx';
19
20
    const URL_RATES_DYNAMIC = 'http://www.nbrb.by/Services/XmlExRatesDyn.aspx';
21
22
    private function getProvider()
23
    {
24
        $apiClient = new ApiClient(self::URL_RATES, self::URL_RATES_DYNAMIC, 3, 3);
25
        return new ExchangeRatesProvider($apiClient, true);
26
    }
27
28
29
    private $ratesList = [
30
        'USD' => [
31
            'code' => 'USD',
32
            'num_code' => 840,
33
            'scale' => 1,
34
            'name' => 'Доллар США',
35
            'rate' => 19958
36
        ],
37
        'EUR' => [
38
            'code' => 'EUR',
39
            'num_code' => 978,
40
            'scale' => 1,
41
            'name' => 'Евро',
42
            'rate' => 22747
43
        ],
44
        'PLN' => [
45
            'code' => 'PLN',
46
            'num_code' => 985,
47
            'scale' => 1,
48
            'name' => 'Злотый',
49
            'rate' => 5305.16
50
        ],
51
    ];
52
53
    private $dynamicRates = [
54
        'USD' => [
55
            '04/12/2016' => 19958,
56
            '04/13/2016' => 19864,
57
            '04/14/2016' => 19849,
58
            '04/15/2016' => 19989,
59
            '04/16/2016' => 19907,
60
        ]
61
    ];
62
63
64
    public function testGetAllRatesExchanges()
65
    {
66
        $provider = $this->getProvider();
67
68
        $date = new \DateTime();
69
        $date->setDate(2016, 4, 12);
70
        $rates = $provider->getAllRatesExchanges($date);
71
72
        foreach ($this->ratesList as $key => $value) {
73
            $rate = $rates[$key];
74
            $this->assertRate($rate, $date, $value);
75
        }
76
    }
77
78
79
    public function testGetRatesExchanges()
80
    {
81
        $provider = $this->getProvider();
82
83
        $date = new \DateTime();
84
        $date->setDate(2016, 4, 12);
85
        $rates = $provider->getRatesExchanges(['USD', 'PLN'], $date);
86
        foreach ($rates as $rate) {
87
            $pattern = $this->ratesList[$rate->getCharCode()];
88
            $this->assertRate($rate, $date, $pattern);
89
        }
90
91
        // Fail
92
        try {
93
            $provider->getRatesExchanges(['USD', 'HUI'], $date);
94
            $this->assertTrue(false);
95
        } catch (UndefinedCurrencyException $exc) {
96
            $this->assertTrue(true);
97
        }
98
    }
99
100
101
    public function testDenominationGetRateExchanges()
102
    {
103
        $provider = $this->getProvider();
104
105
        $date = new \DateTime();
106
        $date->setDate(2016, 7, 1);
107
        $rate = $provider->getRateExchange('USD', $date);
108
        $this->assertEquals($rate->getRate(), 2.0053);
109
110
    }
111
112
113
    public function testGetRateExchange()
114
    {
115
        $provider = $this->getProvider();
116
117
        $date = new \DateTime();
118
        $date->setDate(2016, 4, 12);
119
        $rate = $provider->getRateExchange('USD', $date);
120
        $this->assertRate($rate, $date, $this->ratesList['USD']);
121
122
        // Fail
123
        try {
124
            $provider->getRateExchange('HUI', $date);
125
            $this->assertTrue(false);
126
        } catch (UndefinedCurrencyException $exc) {
127
            $this->assertTrue(true);
128
        }
129
    }
130
131
132
    public function testGetRatesExchangesDynamic()
133
    {
134
        $provider = $this->getProvider();
135
136
        $start = new \DateTime();
137
        $start->setDate(2016, 4, 12);
138
139
        $end = new \DateTime();
140
        $end->setDate(2016, 4, 16);
141
142
        $code = 'USD';
143
        $rates = $provider->getRatesExchangesDynamic($code, $start, $end);
144
145
        foreach ($rates as $rate) {
146
            $date = $rate->getDate()->format('m/d/Y');
147
148
            $this->assertTrue(isset($this->dynamicRates[$code][$date]));
149
            $this->assertEquals($rate->getRate(), $this->dynamicRates[$code][$date]);
150
        }
151
152
153
    }
154
155
156
    private function assertRate(ExchangeRate $rate, \DateTime $date, $value)
157
    {
158
        $this->assertEquals($rate->getNumCode(), $value['num_code']);
159
        $this->assertEquals($rate->getScale(), $value['scale']);
160
        $this->assertEquals($rate->getName(), $value['name']);
161
        $this->assertEquals($rate->getRate(), $value['rate']);
162
        $this->assertEquals($rate->getCharCode(), $value['code']);
163
        $this->assertEquals($rate->getDate()->format('dmy'), $date->format('dmy'));
164
    }
165
166
}