forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
184 lines
6.4 KiB
PHP
184 lines
6.4 KiB
PHP
<?php
|
|
|
|
namespace CommerceGuys\Intl\Tests\Currency;
|
|
|
|
use CommerceGuys\Intl\Currency\Currency;
|
|
use CommerceGuys\Intl\Currency\CurrencyRepository;
|
|
use CommerceGuys\Intl\Exception\UnknownCurrencyException;
|
|
use org\bovigo\vfs\vfsStream;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @coversDefaultClass \CommerceGuys\Intl\Currency\CurrencyRepository
|
|
*/
|
|
final class CurrencyRepositoryTest extends TestCase
|
|
{
|
|
/**
|
|
* Currency definitions.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $definitions = [
|
|
'en' => [
|
|
'RSD' => [
|
|
'name' => 'Serbian Dinar',
|
|
],
|
|
'USD' => [
|
|
'name' => 'US Dollar',
|
|
'symbol' => '$',
|
|
],
|
|
],
|
|
'es' => [
|
|
'RSD' => [
|
|
'name' => 'dinar serbio',
|
|
],
|
|
'USD' => [
|
|
'name' => 'dólar estadounidense',
|
|
'symbol' => 'US$',
|
|
],
|
|
],
|
|
'de' => [
|
|
'RSD' => [
|
|
'name' => 'Serbischer Dinar',
|
|
],
|
|
'USD' => [
|
|
'name' => 'US-Dollar',
|
|
'symbol' => '$',
|
|
],
|
|
],
|
|
];
|
|
|
|
/**
|
|
* @covers ::__construct
|
|
*/
|
|
public function testConstructor()
|
|
{
|
|
// Mock the existence of JSON definitions on the filesystem.
|
|
$root = vfsStream::setup('resources');
|
|
foreach ($this->definitions as $locale => $data) {
|
|
vfsStream::newFile('currency/' . $locale . '.json')->at($root)->setContent(json_encode($data));
|
|
}
|
|
|
|
// Instantiate the currency repository and confirm that the definition path
|
|
// was properly set.
|
|
$currencyRepository = new CurrencyRepository('de', 'en', 'vfs://resources/currency/');
|
|
$reflectedCurrencyRepository = new \ReflectionObject($currencyRepository);
|
|
$reflectedDefinitionPath = $reflectedCurrencyRepository->getProperty('definitionPath');
|
|
$reflectedDefinitionPath->setAccessible(true);
|
|
$this->assertEquals('vfs://resources/currency/', $reflectedDefinitionPath->getValue($currencyRepository));
|
|
|
|
return $currencyRepository;
|
|
}
|
|
|
|
/**
|
|
* @covers ::get
|
|
* @covers ::loadDefinitions
|
|
*
|
|
* @uses \CommerceGuys\Intl\Currency\Currency
|
|
* @uses \CommerceGuys\Intl\Locale
|
|
* @depends testConstructor
|
|
*/
|
|
public function testGet($currencyRepository)
|
|
{
|
|
// Explicit locale.
|
|
$currency = $currencyRepository->get('USD', 'es');
|
|
$this->assertInstanceOf(Currency::class, $currency);
|
|
$this->assertEquals('USD', $currency->getCurrencyCode());
|
|
$this->assertEquals('dólar estadounidense', $currency->getName());
|
|
$this->assertEquals('840', $currency->getNumericCode());
|
|
$this->assertEquals('2', $currency->getFractionDigits());
|
|
$this->assertEquals('US$', $currency->getSymbol());
|
|
$this->assertEquals('es', $currency->getLocale());
|
|
|
|
// Default locale, lowercase currency code.
|
|
$currency = $currencyRepository->get('usd');
|
|
$this->assertInstanceOf(Currency::class, $currency);
|
|
$this->assertEquals('USD', $currency->getCurrencyCode());
|
|
$this->assertEquals('US-Dollar', $currency->getName());
|
|
$this->assertEquals('$', $currency->getSymbol());
|
|
$this->assertEquals('de', $currency->getLocale());
|
|
|
|
// Fallback locale.
|
|
$currency = $currencyRepository->get('USD', 'INVALID-LOCALE');
|
|
$this->assertInstanceOf(Currency::class, $currency);
|
|
$this->assertEquals('USD', $currency->getCurrencyCode());
|
|
$this->assertEquals('US Dollar', $currency->getName());
|
|
$this->assertEquals('$', $currency->getSymbol());
|
|
$this->assertEquals('en', $currency->getLocale());
|
|
}
|
|
|
|
/**
|
|
* @covers ::get
|
|
* @covers ::loadDefinitions
|
|
*
|
|
* @uses \CommerceGuys\Intl\Locale
|
|
*
|
|
* @depends testConstructor
|
|
*/
|
|
public function testGetInvalidCurrency($currencyRepository)
|
|
{
|
|
$this->expectException(UnknownCurrencyException::class);
|
|
$currencyRepository->get('INVALID');
|
|
}
|
|
|
|
/**
|
|
* @covers ::getAll
|
|
* @covers ::loadDefinitions
|
|
*
|
|
* @uses \CommerceGuys\Intl\Currency\Currency
|
|
* @uses \CommerceGuys\Intl\Locale
|
|
* @depends testConstructor
|
|
*/
|
|
public function testGetAll($currencyRepository)
|
|
{
|
|
// Explicit locale.
|
|
$currencies = $currencyRepository->getAll('es');
|
|
$this->assertArrayHasKey('RSD', $currencies);
|
|
$this->assertArrayHasKey('USD', $currencies);
|
|
$this->assertEquals('dinar serbio', $currencies['RSD']->getName());
|
|
$this->assertEquals('dólar estadounidense', $currencies['USD']->getName());
|
|
$this->assertEquals('RSD', $currencies['RSD']->getSymbol());
|
|
$this->assertEquals('US$', $currencies['USD']->getSymbol());
|
|
|
|
// Default locale.
|
|
$currencies = $currencyRepository->getAll();
|
|
$this->assertArrayHasKey('RSD', $currencies);
|
|
$this->assertArrayHasKey('USD', $currencies);
|
|
$this->assertEquals('Serbischer Dinar', $currencies['RSD']->getName());
|
|
$this->assertEquals('US-Dollar', $currencies['USD']->getName());
|
|
$this->assertEquals('RSD', $currencies['RSD']->getSymbol());
|
|
$this->assertEquals('$', $currencies['USD']->getSymbol());
|
|
|
|
// Fallback locale.
|
|
$currencies = $currencyRepository->getAll('INVALID-LOCALE');
|
|
$this->assertArrayHasKey('RSD', $currencies);
|
|
$this->assertArrayHasKey('USD', $currencies);
|
|
$this->assertEquals('Serbian Dinar', $currencies['RSD']->getName());
|
|
$this->assertEquals('US Dollar', $currencies['USD']->getName());
|
|
$this->assertEquals('RSD', $currencies['RSD']->getSymbol());
|
|
$this->assertEquals('$', $currencies['USD']->getSymbol());
|
|
}
|
|
|
|
/**
|
|
* @covers ::getList
|
|
* @covers ::loadDefinitions
|
|
*
|
|
* @uses \CommerceGuys\Intl\Locale
|
|
* @depends testConstructor
|
|
*/
|
|
public function testGetList($currencyRepository)
|
|
{
|
|
// Explicit locale.
|
|
$list = $currencyRepository->getList('es');
|
|
$this->assertEquals(['RSD' => 'dinar serbio', 'USD' => 'dólar estadounidense'], $list);
|
|
|
|
// Default locale.
|
|
$list = $currencyRepository->getList();
|
|
$this->assertEquals(['RSD' => 'Serbischer Dinar', 'USD' => 'US-Dollar'], $list);
|
|
|
|
// Fallback locale.
|
|
$list = $currencyRepository->getList('INVALID-LOCALE');
|
|
$this->assertEquals(['RSD' => 'Serbian Dinar', 'USD' => 'US Dollar'], $list);
|
|
}
|
|
}
|