SlimTestCase.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. declare(strict_types=1);
  3. namespace Tests;
  4. use Slim\Factory\AppFactory;
  5. use Slim\Http\Factory\DecoratedServerRequestFactory;
  6. use GuzzleHttp\Psr7\HttpFactory;
  7. use Psr\Http\Message\ResponseInterface;
  8. use Psr\Http\Message\ServerRequestInterface;
  9. abstract class SlimTestCase extends TestCase
  10. {
  11. protected $app;
  12. protected function setUp(): void
  13. {
  14. parent::setUp();
  15. $this->setUpTestEnvironment();
  16. $this->app = AppFactory::create();
  17. $routes = require BASE_PATH . '/app/routes.php';
  18. $routes($this->app);
  19. $this->app->addErrorMiddleware(true, true, true);
  20. }
  21. protected function setUpTestEnvironment(): void
  22. {
  23. $_ENV['db_driver'] = 'sqlite';
  24. $_ENV['db_database'] = ':memory:';
  25. $_ENV['webAPI'] = true;
  26. $_ENV['muKey'] = 'test_key_123';
  27. $_ENV['webAPIUrl'] = 'https://test.example.com';
  28. $_ENV['checkNodeIp'] = false;
  29. $_ENV['enable_rate_limit'] = false;
  30. $_ENV['timeZone'] = 'UTC';
  31. // Email Settings
  32. $_ENV['enable_email_verify'] = false;
  33. // Subscription Settings
  34. $_ENV['Subscribe'] = true;
  35. $_ENV['subUrl'] = 'https://test.example.com';
  36. $_ENV['appName'] = 'SSPanel Test';
  37. $_ENV['baseUrl'] = 'https://test.example.com';
  38. $_ENV['key'] = 'test_encryption_key_123456789012';
  39. $_ENV['debug'] = true;
  40. $_ENV['enable_kill'] = false;
  41. $_ENV['enable_change_email'] = true;
  42. }
  43. protected function createRequest(
  44. string $method,
  45. string $uri,
  46. array $serverParams = []
  47. ): ServerRequestInterface {
  48. $defaults = [
  49. 'REQUEST_METHOD' => $method,
  50. 'REQUEST_URI' => $uri,
  51. 'SERVER_NAME' => 'test.example.com',
  52. 'SERVER_PORT' => 443,
  53. 'HTTPS' => 'on',
  54. 'HTTP_HOST' => 'test.example.com',
  55. 'REMOTE_ADDR' => '127.0.0.1',
  56. 'REQUEST_TIME' => time(),
  57. 'REQUEST_TIME_FLOAT' => microtime(true),
  58. ];
  59. $serverParams = array_merge($defaults, $serverParams);
  60. $psr7Factory = new HttpFactory();
  61. $factory = new DecoratedServerRequestFactory($psr7Factory);
  62. $request = $factory->createServerRequest($method, $uri, $serverParams);
  63. if (!$request->hasHeader('Host')) {
  64. $request = $request->withHeader('Host', $serverParams['HTTP_HOST']);
  65. }
  66. return $request;
  67. }
  68. protected function json(
  69. string $method,
  70. string $uri,
  71. array $data = [],
  72. array $headers = []
  73. ): ResponseInterface {
  74. $request = $this->createRequest($method, $uri);
  75. $request = $request->withHeader('Content-Type', 'application/json');
  76. $request = $request->withHeader('Accept', 'application/json');
  77. foreach ($headers as $name => $value) {
  78. $request = $request->withHeader($name, $value);
  79. }
  80. if (!empty($data)) {
  81. $request = $request->withParsedBody($data);
  82. }
  83. return $this->app->handle($request);
  84. }
  85. protected function get(string $uri, array $headers = []): ResponseInterface
  86. {
  87. $request = $this->createRequest('GET', $uri);
  88. foreach ($headers as $name => $value) {
  89. $request = $request->withHeader($name, $value);
  90. }
  91. return $this->app->handle($request);
  92. }
  93. protected function post(string $uri, array $data = [], array $headers = []): ResponseInterface
  94. {
  95. return $this->json('POST', $uri, $data, $headers);
  96. }
  97. protected function put(string $uri, array $data = [], array $headers = []): ResponseInterface
  98. {
  99. return $this->json('PUT', $uri, $data, $headers);
  100. }
  101. protected function delete(string $uri, array $headers = []): ResponseInterface
  102. {
  103. return $this->json('DELETE', $uri, [], $headers);
  104. }
  105. protected function assertJsonResponse(ResponseInterface $response): array
  106. {
  107. $this->assertEquals('application/json', $response->getHeaderLine('Content-Type'));
  108. $body = (string) $response->getBody();
  109. $data = json_decode($body, true);
  110. $this->assertIsArray($data);
  111. return $data;
  112. }
  113. protected function assertSuccess(ResponseInterface $response): void
  114. {
  115. $status = $response->getStatusCode();
  116. $this->assertGreaterThanOrEqual(200, $status);
  117. $this->assertLessThan(300, $status);
  118. }
  119. protected function assertError(ResponseInterface $response, ?int $expectedStatus = null): void
  120. {
  121. $status = $response->getStatusCode();
  122. if ($expectedStatus !== null) {
  123. $this->assertEquals($expectedStatus, $status);
  124. } else {
  125. $this->assertGreaterThanOrEqual(400, $status);
  126. }
  127. }
  128. }