PaymentProviderTestCase.php 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace Tests\Support;
  3. use App\Http\Controllers\admin\PaymentCompany;
  4. use App\Services\Payment\PaymentProviderConfig;
  5. use Illuminate\Config\Repository;
  6. use Illuminate\Database\Capsule\Manager;
  7. use Illuminate\Database\Schema\Blueprint;
  8. use Illuminate\Encryption\Encrypter;
  9. use Illuminate\Foundation\Application;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Facade;
  13. use Illuminate\Translation\ArrayLoader;
  14. use Illuminate\Translation\Translator;
  15. use Illuminate\Validation\Factory;
  16. use PHPUnit\Framework\TestCase;
  17. abstract class PaymentProviderTestCase extends TestCase
  18. {
  19. protected Application $app;
  20. protected function setUp(): void
  21. {
  22. Facade::clearResolvedInstances();
  23. $this->app = new Application(dirname(__DIR__, 2));
  24. $this->app->instance('config', new Repository(['app' => [
  25. 'locale' => 'zh',
  26. 'jd_pay_mch_id' => 'env-jd-mch',
  27. 'jd_pay_key' => 'env-jd-secret-1234',
  28. 'jd_pay_gateway' => 'https://env.example.com/pay',
  29. 'no_pay_recharge_user_ids' => '7,8',
  30. ]]));
  31. Facade::setFacadeApplication($this->app);
  32. $this->app->instance('encrypter', new Encrypter(str_repeat('k', 32), 'AES-256-CBC'));
  33. $this->app->instance('log', new \Psr\Log\NullLogger());
  34. $db = new Manager($this->app);
  35. $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']);
  36. $db->setAsGlobal();
  37. $db->bootEloquent();
  38. $this->app->instance('db', $db->getDatabaseManager());
  39. $this->app->bind('db.schema', fn () => $db->schema());
  40. $translator = new Translator(new ArrayLoader(), 'zh');
  41. $this->app->instance('translator', $translator);
  42. $this->app->instance('validator', new Factory($translator, $this->app));
  43. $this->app->instance(\Illuminate\Contracts\Routing\ResponseFactory::class, new \Tests\Support\JsonResponseFactory());
  44. Request::macro('validate', function (array $rules) {
  45. return app('validator')->make($this->all(), $rules)->validate();
  46. });
  47. $this->app->instance('request', Request::create('/'));
  48. (require dirname(__DIR__, 2) . '/database/migrations/2026_09_08_160000_add_payment_provider_status_and_channel_soft_deletes.php')->up();
  49. (require dirname(__DIR__, 2) . '/database/migrations/2026_11_01_120000_add_config_to_payment_providers.php')->up();
  50. $db->schema()->create('payment_orders', function (Blueprint $t) {
  51. $t->id(); $t->integer('type'); $t->string('channel'); $t->integer('status');
  52. });
  53. $db->schema()->create('operation_audits', function (Blueprint $t) {
  54. $t->id(); $t->string('resource_type'); $t->unsignedBigInteger('resource_id')->nullable();
  55. $t->string('action'); $t->json('changes'); $t->unsignedBigInteger('operator_id')->nullable();
  56. $t->string('operator_name'); $t->timestamp('created_at')->useCurrent();
  57. });
  58. }
  59. protected function tearDown(): void
  60. {
  61. DB::disconnect();
  62. Facade::clearResolvedInstances();
  63. parent::tearDown();
  64. }
  65. protected function call(string $method, string $uri, array $params): array
  66. {
  67. $this->app->instance('request', Request::create($uri, $method === 'config' ? 'GET' : 'POST', $params));
  68. return (new PaymentCompany())->{$method}(new PaymentProviderConfig())->getData(true);
  69. }
  70. }