app = new Application(dirname(__DIR__, 2)); $this->app->instance('config', new Repository(['app' => [ 'locale' => 'zh', 'jd_pay_mch_id' => 'env-jd-mch', 'jd_pay_key' => 'env-jd-secret-1234', 'jd_pay_gateway' => 'https://env.example.com/pay', 'no_pay_recharge_user_ids' => '7,8', ]])); Facade::setFacadeApplication($this->app); $this->app->instance('encrypter', new Encrypter(str_repeat('k', 32), 'AES-256-CBC')); $this->app->instance('log', new \Psr\Log\NullLogger()); $db = new Manager($this->app); $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']); $db->setAsGlobal(); $db->bootEloquent(); $this->app->instance('db', $db->getDatabaseManager()); $this->app->bind('db.schema', fn () => $db->schema()); $translator = new Translator(new ArrayLoader(), 'zh'); $this->app->instance('translator', $translator); $this->app->instance('validator', new Factory($translator, $this->app)); $this->app->instance(\Illuminate\Contracts\Routing\ResponseFactory::class, new \Tests\Support\JsonResponseFactory()); Request::macro('validate', function (array $rules) { return app('validator')->make($this->all(), $rules)->validate(); }); $this->app->instance('request', Request::create('/')); (require dirname(__DIR__, 2) . '/database/migrations/2026_09_08_160000_add_payment_provider_status_and_channel_soft_deletes.php')->up(); (require dirname(__DIR__, 2) . '/database/migrations/2026_11_01_120000_add_config_to_payment_providers.php')->up(); $db->schema()->create('payment_orders', function (Blueprint $t) { $t->id(); $t->integer('type'); $t->string('channel'); $t->integer('status'); }); $db->schema()->create('operation_audits', function (Blueprint $t) { $t->id(); $t->string('resource_type'); $t->unsignedBigInteger('resource_id')->nullable(); $t->string('action'); $t->json('changes'); $t->unsignedBigInteger('operator_id')->nullable(); $t->string('operator_name'); $t->timestamp('created_at')->useCurrent(); }); } protected function tearDown(): void { DB::disconnect(); Facade::clearResolvedInstances(); parent::tearDown(); } protected function call(string $method, string $uri, array $params): array { $this->app->instance('request', Request::create($uri, $method === 'config' ? 'GET' : 'POST', $params)); return (new PaymentCompany())->{$method}(new PaymentProviderConfig())->getData(true); } }