206 أسطر
6.7 KiB
PHP
206 أسطر
6.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Services\CurrencyService;
|
|
use Illuminate\Support\Carbon;
|
|
use Mockery;
|
|
use Symfony\Component\BrowserKit\HttpBrowser;
|
|
use Symfony\Component\DomCrawler\Crawler;
|
|
use Tests\TestCase;
|
|
|
|
class CurrencyServiceTest extends TestCase
|
|
{
|
|
protected $currencyService;
|
|
protected $mockHttpBrowser;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
// Create a mock for HttpBrowser
|
|
$this->mockHttpBrowser = Mockery::mock(HttpBrowser::class);
|
|
|
|
// Create the service with mocked dependencies
|
|
$this->currencyService = Mockery::mock(CurrencyService::class)
|
|
->makePartial()
|
|
->shouldAllowMockingProtectedMethods();
|
|
|
|
// Configure the service to return our mock
|
|
$this->currencyService->shouldAllowMockingProtectedMethods();
|
|
|
|
$this->currencyService->shouldReceive('createHttpBrowser')
|
|
->andReturn($this->mockHttpBrowser);
|
|
}
|
|
|
|
public function testGetTodayCurrenciesFiltersForTodayAndCities()
|
|
{
|
|
// Sample data that includes today and past dates
|
|
$today = Carbon::today()->format('Y-m-d');
|
|
$yesterday = Carbon::yesterday()->format('Y-m-d');
|
|
|
|
$testData = [
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 535.0,
|
|
'price_sell' => 537.0,
|
|
'date' => $today,
|
|
'day' => Carbon::today()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'SAR',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 139.8,
|
|
'price_sell' => 140.2,
|
|
'date' => $today,
|
|
'day' => Carbon::today()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Aden',
|
|
'price_buy' => 2541.0,
|
|
'price_sell' => 2556.0,
|
|
'date' => $today,
|
|
'day' => Carbon::today()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'SAR',
|
|
'city' => 'Aden',
|
|
'price_buy' => 668.0,
|
|
'price_sell' => 670.0,
|
|
'date' => $today,
|
|
'day' => Carbon::today()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 534.0,
|
|
'price_sell' => 536.0,
|
|
'date' => $yesterday,
|
|
'day' => Carbon::yesterday()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'OtherCity',
|
|
'price_buy' => 540.0,
|
|
'price_sell' => 542.0,
|
|
'date' => $today,
|
|
'day' => Carbon::today()->format('l')
|
|
]
|
|
];
|
|
|
|
// Create a new instance for this test
|
|
$currencyService = Mockery::mock(CurrencyService::class)->makePartial();
|
|
$currencyService->shouldReceive('getLastTwentyDays')
|
|
->once()
|
|
->andReturn($testData);
|
|
|
|
// Test the method
|
|
$result = $currencyService->getTodayCurrencies();
|
|
|
|
// Should only include today's data for Sanaa and Aden
|
|
$this->assertCount(4, $result);
|
|
|
|
// Check that only Sanaa and Aden cities are included
|
|
$cities = array_column($result, 'city');
|
|
$this->assertContains('Sanaa', $cities);
|
|
$this->assertContains('Aden', $cities);
|
|
$this->assertNotContains('OtherCity', $cities);
|
|
|
|
// Check that only today's data is included
|
|
$dates = array_unique(array_column($result, 'date'));
|
|
$this->assertCount(1, $dates);
|
|
$this->assertEquals($today, $dates[0]);
|
|
}
|
|
|
|
public function testGetTodayCurrenciesHandlesExceptions()
|
|
{
|
|
// Create a subclass of CurrencyService for testing
|
|
$currencyService = new class extends CurrencyService {
|
|
// Override getLastTwentyDays to throw an exception
|
|
public function getLastTwentyDays(): array
|
|
{
|
|
throw new \Exception('Test exception');
|
|
}
|
|
};
|
|
|
|
// Test the method - this will call the real getTodayCurrencies which calls our overridden getLastTwentyDays
|
|
$result = $currencyService->getTodayCurrencies();
|
|
|
|
// Should return an empty array on exception
|
|
$this->assertIsArray($result);
|
|
$this->assertEmpty($result);
|
|
}
|
|
|
|
public function testGetTodayCurrenciesUsesRecentDataWhenTodayNotAvailable()
|
|
{
|
|
// Sample data that includes only past dates
|
|
$yesterday = Carbon::yesterday()->format('Y-m-d');
|
|
$twoDaysAgo = Carbon::yesterday()->subDay()->format('Y-m-d');
|
|
|
|
$testData = [
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 534.0,
|
|
'price_sell' => 536.0,
|
|
'date' => $yesterday,
|
|
'day' => Carbon::yesterday()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'SAR',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 139.0,
|
|
'price_sell' => 140.0,
|
|
'date' => $yesterday,
|
|
'day' => Carbon::yesterday()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Aden',
|
|
'price_buy' => 2540.0,
|
|
'price_sell' => 2555.0,
|
|
'date' => $yesterday,
|
|
'day' => Carbon::yesterday()->format('l')
|
|
],
|
|
[
|
|
'currency' => 'USD',
|
|
'city' => 'Sanaa',
|
|
'price_buy' => 533.0,
|
|
'price_sell' => 535.0,
|
|
'date' => $twoDaysAgo,
|
|
'day' => Carbon::yesterday()->subDay()->format('l')
|
|
]
|
|
];
|
|
|
|
// Create a new instance for this test
|
|
$currencyService = Mockery::mock(CurrencyService::class)->makePartial();
|
|
$currencyService->shouldReceive('getLastTwentyDays')
|
|
->once()
|
|
->andReturn($testData);
|
|
|
|
// Test the method
|
|
$result = $currencyService->getTodayCurrencies();
|
|
|
|
// Should include yesterday's data for Sanaa and Aden
|
|
$this->assertCount(3, $result);
|
|
|
|
// Check that only Sanaa and Aden cities are included
|
|
$cities = array_column($result, 'city');
|
|
$this->assertContains('Sanaa', $cities);
|
|
$this->assertContains('Aden', $cities);
|
|
|
|
// Check that only yesterday's data is included (most recent)
|
|
$dates = array_unique(array_column($result, 'date'));
|
|
$this->assertCount(1, $dates);
|
|
$this->assertEquals($yesterday, $dates[0]);
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
Mockery::close();
|
|
parent::tearDown();
|
|
}
|
|
}
|