LotteryBetSourceTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. namespace Tests\Integration;
  3. use App\Http\Controllers\admin\LhcOrder;
  4. use App\Jobs\SendTelegramGroupMessageJob;
  5. use App\Services\AdminRealtime\AdminRealtimeRows;
  6. use App\Services\BetService;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Foundation\Testing\TestCase;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Bus;
  11. use Illuminate\Support\Facades\DB;
  12. use PHPUnit\Framework\Attributes\PreserveGlobalState;
  13. use PHPUnit\Framework\Attributes\RunInSeparateProcess;
  14. class LotteryBetSourceTest extends TestCase
  15. {
  16. protected function setUp(): void
  17. {
  18. parent::setUp();
  19. Model::clearBootedModels();
  20. config([
  21. 'database.default' => 'lottery_source_test',
  22. 'database.connections.lottery_source_test' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_'],
  23. 'logging.channels.dblog' => ['driver' => 'null'],
  24. 'cache.default' => 'array',
  25. 'admin_realtime.enabled' => false,
  26. ]);
  27. Bus::fake([SendTelegramGroupMessageJob::class]);
  28. DB::statement('CREATE TABLE bot_users (id INTEGER PRIMARY KEY, member_id TEXT, first_name TEXT, "from" INTEGER, is_banned INTEGER)');
  29. DB::statement('CREATE TABLE bot_wallets (id INTEGER PRIMARY KEY, member_id TEXT, available_balance NUMERIC, updated_at TEXT)');
  30. DB::statement('CREATE TABLE bot_config (id INTEGER PRIMARY KEY, field TEXT, val TEXT)');
  31. DB::statement('CREATE TABLE bot_gameplay_rules (id INTEGER PRIMARY KEY, keywords TEXT, odds NUMERIC, mininum NUMERIC, maxinum NUMERIC)');
  32. DB::statement('CREATE TABLE bot_keyboard (id INTEGER PRIMARY KEY, button TEXT)');
  33. foreach (['issues', 'pc_issues'] as $table) {
  34. DB::statement("CREATE TABLE bot_{$table} (id INTEGER PRIMARY KEY, issue_no TEXT, status INTEGER, end_time TEXT, winning_numbers TEXT, combo TEXT)");
  35. DB::table($table)->insert(['issue_no' => '123', 'status' => 1, 'end_time' => date('Y-m-d H:i:s', time() + 120)]);
  36. }
  37. DB::statement('CREATE TABLE bot_lhc_order (id INTEGER PRIMARY KEY, member_id TEXT, type INTEGER, issue TEXT, ordernum TEXT,
  38. odds NUMERIC, amount NUMERIC, total_amount NUMERIC, coupon_id INTEGER, lottery_status INTEGER DEFAULT 0, created_at INTEGER, updated_at INTEGER)');
  39. DB::statement('CREATE TABLE bot_lhc_order_item (id INTEGER PRIMARY KEY, member_id TEXT, ordernum TEXT, number TEXT, created_at INTEGER, updated_at INTEGER)');
  40. DB::statement('CREATE TABLE bot_balance_logs (id INTEGER PRIMARY KEY, member_id TEXT, amount NUMERIC, before_balance NUMERIC,
  41. after_balance NUMERIC, change_type TEXT, related_id INTEGER, remark TEXT, created_at TEXT, updated_at TEXT)');
  42. DB::table('users')->insert(['member_id' => '1001', 'first_name' => 'Alice', 'from' => -1, 'is_banned' => 0]);
  43. DB::table('wallets')->insert(['member_id' => '1001', 'available_balance' => 100]);
  44. DB::table('gameplay_rules')->insert(['keywords' => '大', 'odds' => 2, 'mininum' => 1, 'maxinum' => 100]);
  45. DB::table('config')->insert([
  46. ['field' => 'service_customer', 'val' => 'test'],
  47. ['field' => 'maintenance_switch', 'val' => '0'],
  48. ['field' => 'pc28_switch', 'val' => '0'],
  49. ['field' => 'group_language', 'val' => 'zh'],
  50. ]);
  51. }
  52. protected function tearDown(): void
  53. {
  54. DB::disconnect();
  55. Model::clearBootedModels();
  56. parent::tearDown();
  57. }
  58. private function adminOrder(string $action, array $params = []): array
  59. {
  60. $this->app->instance('request', Request::create("/admin/lhcOrder/{$action}", 'GET', $params));
  61. $response = (new LhcOrder())->{$action}()->getData(true);
  62. $this->assertSame(0, $response['code'], $response['msg']);
  63. return $response['data'];
  64. }
  65. #[RunInSeparateProcess]
  66. #[PreserveGlobalState(false)]
  67. public function test_orders_are_tagged_and_telegram_merges_only_its_own_bets(): void
  68. {
  69. $order = ['member_id' => '1001', 'type' => 5, 'issue' => '123', 'amount' => 10, 'total_amount' => 10, 'created_at' => time()];
  70. DB::table('lhc_order')->insert($order + ['ordernum' => 'old']);
  71. DB::table('lhc_order_item')->insert(['member_id' => '1001', 'ordernum' => 'old', 'number' => '大']);
  72. (require dirname(__DIR__, 2) . '/database/migrations/2026_11_06_130000_add_bet_source_to_lhc_order.php')->up();
  73. DB::table('lhc_order')->insert($order + ['ordernum' => 'web', 'bet_source' => 'frontend']);
  74. DB::table('lhc_order_item')->insert(['member_id' => '1001', 'ordernum' => 'web', 'number' => '大']);
  75. $this->assertStringContainsString('下注成功', BetService::bet('1001', '大10')['text']);
  76. $this->assertStringContainsString('下注成功', BetService::bet('1001', '大15')['text']);
  77. DB::table('config')->where('field', 'pc28_switch')->update(['val' => '1']);
  78. $this->assertStringContainsString('下注成功', BetService::bet('1001', '大20')['text']);
  79. $list = $this->adminOrder('list');
  80. $this->assertSame(4, $list['total']);
  81. $this->assertSame([-1], array_values(array_unique(array_column($list['data'], 'user_from'))));
  82. $telegram = $this->adminOrder('list', ['bet_source' => 'telegram', 'type' => 5]);
  83. $this->assertSame(1, $telegram['total']);
  84. $this->assertEquals(25, $telegram['data'][0]['total_amount']);
  85. $this->assertSame('telegram', $this->adminOrder('info', ['id' => $telegram['data'][0]['id']])['bet_source']);
  86. $push = AdminRealtimeRows::resolve('lhc_order', (string) $telegram['data'][0]['id'], 'created');
  87. $this->assertSame('telegram', $push[0]['data']['bet_source']);
  88. $this->assertSame(1, $this->adminOrder('list', ['bet_source' => 'telegram', 'type' => 6])['total']);
  89. $frontend = $this->adminOrder('list', ['bet_source' => 'frontend']);
  90. $this->assertSame(1, $frontend['total']);
  91. $this->assertEquals(10, $frontend['data'][0]['total_amount']);
  92. $this->assertSame('frontend', $this->adminOrder('info', ['id' => $frontend['data'][0]['id']])['bet_source']);
  93. DB::table('issues')->delete();
  94. $legacy = $this->adminOrder('list', ['bet_source' => 'unknown']);
  95. $this->assertSame(1, $legacy['total']);
  96. $this->assertEquals(10, $legacy['data'][0]['total_amount']);
  97. $this->assertNull($this->adminOrder('info', ['id' => $legacy['data'][0]['id']])['bet_source']);
  98. }
  99. }