|
|
@@ -0,0 +1,101 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Tests\Integration;
|
|
|
+
|
|
|
+use App\Services\BackflowService;
|
|
|
+use App\Services\RebateService;
|
|
|
+use App\Services\RechargeService;
|
|
|
+use Illuminate\Config\Repository;
|
|
|
+use Illuminate\Database\Capsule\Manager;
|
|
|
+use Illuminate\Database\Schema\Blueprint;
|
|
|
+use Illuminate\Foundation\Application;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Facade;
|
|
|
+use PHPUnit\Framework\TestCase;
|
|
|
+
|
|
|
+/** 后台列表返回会员账号 account,并支持按 account 模糊筛选(关联查询与 join 查询两种写法)。 */
|
|
|
+class AdminListAccountTest extends TestCase
|
|
|
+{
|
|
|
+ protected function setUp(): void
|
|
|
+ {
|
|
|
+ parent::setUp();
|
|
|
+ Facade::clearResolvedInstances();
|
|
|
+ $app = new Application(dirname(__DIR__, 2));
|
|
|
+ $app->instance('config', new Repository(['app' => ['timezone' => 'Asia/Shanghai', 'url' => 'http://x']]));
|
|
|
+ Facade::setFacadeApplication($app);
|
|
|
+ $db = new Manager($app);
|
|
|
+ $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']);
|
|
|
+ $db->setAsGlobal();
|
|
|
+ $db->bootEloquent();
|
|
|
+ $app->instance('db', $db->getDatabaseManager());
|
|
|
+ $app->bind('db.schema', fn () => $db->schema());
|
|
|
+ $schema = $db->schema();
|
|
|
+ $schema->create('users', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->string('member_id'); $t->string('account')->nullable(); $t->string('username')->nullable();
|
|
|
+ $t->string('first_name')->nullable(); $t->string('admin_note')->nullable(); $t->integer('status')->default(0);
|
|
|
+ $t->string('phone')->nullable(); $t->string('visitor_id')->nullable(); $t->string('register_ip')->nullable(); $t->timestamps();
|
|
|
+ });
|
|
|
+ $schema->create('rebates', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->string('member_id'); $t->date('date'); $t->integer('status')->default(0);
|
|
|
+ $t->decimal('betting_amount', 20, 2)->default(0); $t->timestamps();
|
|
|
+ });
|
|
|
+ $schema->create('backflow', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->string('member_id'); $t->string('date'); $t->integer('status')->default(0); $t->timestamps();
|
|
|
+ });
|
|
|
+ $schema->create('recharges', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->string('member_id'); $t->string('coin')->default('CNY'); $t->decimal('amount', 20, 2)->default(0);
|
|
|
+ $t->integer('status')->default(0); $t->timestamps();
|
|
|
+ });
|
|
|
+ DB::table('users')->insert([
|
|
|
+ ['member_id' => 'm1', 'account' => 'alice'],
|
|
|
+ ['member_id' => 'm2', 'account' => 'bob'],
|
|
|
+ ['member_id' => 'm3', 'account' => null],
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function tearDown(): void
|
|
|
+ {
|
|
|
+ DB::disconnect();
|
|
|
+ Facade::clearResolvedInstances();
|
|
|
+ parent::tearDown();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function test_rebate_list_shows_and_filters_account(): void
|
|
|
+ {
|
|
|
+ foreach (['m1', 'm2', 'm3'] as $m) {
|
|
|
+ DB::table('rebates')->insert(['member_id' => $m, 'date' => '2026-01-01']);
|
|
|
+ }
|
|
|
+ $rows = $this->accounts(RebateService::paginate(['limit' => 10])['data']);
|
|
|
+ $this->assertSame(['m1' => 'alice', 'm2' => 'bob', 'm3' => ''], $rows);
|
|
|
+ $this->assertSame(['m1' => 'alice'], $this->accounts(RebateService::paginate(['account' => 'lic'])['data']));
|
|
|
+ $this->assertSame(0, RebateService::paginate(['account' => 'nobody'])['total']);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function test_backflow_list_shows_and_filters_account(): void
|
|
|
+ {
|
|
|
+ foreach (['m1', 'm2'] as $m) {
|
|
|
+ DB::table('backflow')->insert(['member_id' => $m, 'date' => '2026-01']);
|
|
|
+ }
|
|
|
+ $this->assertSame(['m1' => 'alice', 'm2' => 'bob'], $this->accounts(BackflowService::paginate(['limit' => 10])['data']));
|
|
|
+ $this->assertSame(['m2' => 'bob'], $this->accounts(BackflowService::paginate(['limit' => 10, 'account' => 'bo'])['data']));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function test_recharge_list_shows_and_filters_account(): void
|
|
|
+ {
|
|
|
+ foreach (['m1', 'm2'] as $m) {
|
|
|
+ DB::table('recharges')->insert(['member_id' => $m, 'amount' => 1, 'created_at' => '2026-01-01 00:00:00']);
|
|
|
+ }
|
|
|
+ $this->assertSame(['m1' => 'alice', 'm2' => 'bob'], $this->accounts(RechargeService::paginate([])['data']));
|
|
|
+ $this->assertSame(['m1' => 'alice'], $this->accounts(RechargeService::paginate(['account' => 'ALI'])['data']));
|
|
|
+ }
|
|
|
+
|
|
|
+ private function accounts(array $rows): array
|
|
|
+ {
|
|
|
+ $out = [];
|
|
|
+ foreach (json_decode(json_encode($rows), true) as $row) {
|
|
|
+ $out[$row['member_id']] = $row['account'];
|
|
|
+ }
|
|
|
+ ksort($out);
|
|
|
+ return $out;
|
|
|
+ }
|
|
|
+}
|