ThirdGameCommissionRatesTest.php 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace Tests\Integration;
  3. use App\Services\ThirdGameCommissionService;
  4. use Carbon\Carbon;
  5. use Illuminate\Cache\ArrayStore;
  6. use Illuminate\Cache\Repository as CacheRepository;
  7. use Illuminate\Config\Repository;
  8. use Illuminate\Foundation\Application;
  9. use Illuminate\Http\Client\Factory;
  10. use Illuminate\Support\Facades\Facade;
  11. use Illuminate\Support\Facades\Http;
  12. use PHPUnit\Framework\TestCase;
  13. class ThirdGameCommissionRatesTest extends TestCase
  14. {
  15. protected function setUp(): void
  16. {
  17. Facade::clearResolvedInstances();
  18. $app = new Application(dirname(__DIR__, 2));
  19. $app->instance('config', new Repository(['third_game' => [
  20. 'api_url' => 'https://supplier.test', 'sn' => 'test-merchant', 'key' => 'test-secret', 'currency' => 'CNY',
  21. ]]));
  22. $app->instance('cache', new CacheRepository(new ArrayStore()));
  23. $app->instance(Factory::class, new Factory());
  24. $app->instance('log', new \Psr\Log\NullLogger());
  25. Facade::setFacadeApplication($app);
  26. Carbon::setTestNow(Carbon::parse('2026-11-04 12:00:00', 'Asia/Shanghai'));
  27. Http::preventStrayRequests();
  28. }
  29. protected function tearDown(): void
  30. {
  31. Carbon::setTestNow(); Facade::clearResolvedInstances(); parent::tearDown();
  32. }
  33. public function test_documented_platform_spelling_zero_rates_and_daily_refresh(): void
  34. {
  35. Http::fake(['https://supplier.test/api/server/quota' => Http::sequence()
  36. ->push(['code' => 10000, 'data' => ['ratios' => [
  37. ['platfrom' => ' AG ', 'ratio' => 0.09], ['platfrom' => 'pg', 'ratio' => '0'],
  38. ]]])
  39. ->push(['code' => 10000, 'data' => ['ratios' => [['platfrom' => 'ag', 'ratio' => '0.10']]]])]);
  40. $service = new ThirdGameCommissionService();
  41. $first = $service->rates();
  42. $this->assertSame(['ag' => '0.0900000000', 'pg' => '0.0000000000'], $first['ratios']);
  43. $this->assertSame($first, (new ThirdGameCommissionService())->rates());
  44. Http::assertSentCount(1);
  45. Http::assertSent(fn ($request) => $request->method() === 'POST' && $request['currency'] === 'CNY'
  46. && $request->hasHeader('sn', 'test-merchant') && $request->hasHeader('sign'));
  47. Carbon::setTestNow(Carbon::parse('2026-11-05 00:00:01', 'Asia/Shanghai'));
  48. $this->assertSame('0.1000000000', $service->rates()['ratios']['ag']);
  49. Http::assertSentCount(2);
  50. }
  51. public function test_provider_failure_is_cached_for_the_day_and_does_not_turn_into_a_zero_rate(): void
  52. {
  53. Http::fake(['*' => Http::response(['code' => 10404, 'data' => null])]);
  54. $service = new ThirdGameCommissionService();
  55. $this->assertFalse($service->rates()['available']);
  56. $this->assertSame([], $service->rates()['ratios']);
  57. Http::assertSentCount(1);
  58. }
  59. public function test_malformed_and_conflicting_rates_are_not_accepted_and_merchant_caches_are_isolated(): void
  60. {
  61. Http::fake(['*' => Http::response(['code' => 10000, 'data' => ['ratios' => [
  62. ['platfrom' => 'negative', 'ratio' => '-0.1'], ['platfrom' => 'large', 'ratio' => '1.01'],
  63. ['platfrom' => 'bad', 'ratio' => 'NaN'], ['platfrom' => 'ag', 'ratio' => '.09'],
  64. ['platfrom' => 'pg', 'ratio' => '0.1'], ['platfrom' => 'PG', 'ratio' => '0.2'],
  65. ['platform' => 'pp', 'ratio' => '0.1234567891'],
  66. ]]])]);
  67. $service = new ThirdGameCommissionService();
  68. $this->assertSame(['pp' => '0.1234567891'], $service->rates()['ratios']);
  69. config(['third_game.sn' => 'another-merchant']);
  70. $service->rates(); Http::assertSentCount(2);
  71. config(['third_game.currency' => 'USD']);
  72. $service->rates(); Http::assertSentCount(3);
  73. }
  74. }