api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

test.php 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. use Tqdev\PhpCrudApi\Api;
  3. use Tqdev\PhpCrudApi\Config;
  4. use Tqdev\PhpCrudApi\Database\GenericDB;
  5. use Tqdev\PhpCrudApi\RequestFactory;
  6. use Tqdev\PhpCrudApi\ResponseUtils;
  7. require 'vendor/autoload.php';
  8. function runDir(Config $config, string $dir, array $matches, string $category): array
  9. {
  10. $success = 0;
  11. $total = 0;
  12. $entries = scandir($dir);
  13. foreach ($entries as $entry) {
  14. if ($entry === '.' || $entry === '..') {
  15. continue;
  16. }
  17. if (isset($matches[0])) {
  18. if (!preg_match('/' . $matches[0] . '/', $entry)) {
  19. continue;
  20. }
  21. }
  22. $file = "$dir/$entry";
  23. if (is_file($file)) {
  24. if (substr($entry, -4) != '.log') {
  25. continue;
  26. }
  27. $success += runTest($config, $file, $category);
  28. $total += 1;
  29. } elseif (is_dir($file)) {
  30. $statistics = runDir($config, $file, array_slice($matches, 1), "$category/$entry");
  31. $total += $statistics['total'];
  32. $success += $statistics['success'];
  33. }
  34. }
  35. $failed = $total - $success;
  36. return compact('total', 'success', 'failed');
  37. }
  38. function runTest(Config $config, string $file, string $category): int
  39. {
  40. $title = ucwords(str_replace('_', ' ', $category)) . '/';
  41. $title .= ucwords(str_replace('_', ' ', substr(basename($file), 0, -4)));
  42. $line1 = "=====[$title]=====";
  43. $len = strlen($line1);
  44. $line2 = str_repeat("=", $len);
  45. $parts = preg_split('/^[=]+([\r\n]+|$)/m', file_get_contents($file));
  46. $dirty = false;
  47. $success = 1;
  48. for ($i = 0; $i < count($parts); $i += 2) {
  49. $recording = false;
  50. if (empty($parts[$i + 1])) {
  51. if (substr($parts[$i], -1) != "\n") {
  52. $parts[$i] .= "\n";
  53. }
  54. $parts[$i + 1] = '';
  55. $recording = true;
  56. $dirty = true;
  57. }
  58. $in = $parts[$i];
  59. $exp = $parts[$i + 1];
  60. $api = new Api($config);
  61. $_SERVER['REMOTE_ADDR'] = 'TEST_IP';
  62. $out = ResponseUtils::toString($api->handle(RequestFactory::fromString($in)));
  63. if ($recording) {
  64. $parts[$i + 1] = $out;
  65. } else if ($out != $exp) {
  66. echo "$line1\n$exp\n$line2\n$out\n$line2\n";
  67. $success = 0;
  68. }
  69. }
  70. if ($dirty) {
  71. file_put_contents($file, implode("===\n", $parts));
  72. }
  73. return $success;
  74. }
  75. function getDatabase(Config $config)
  76. {
  77. if (!isset($config->getMiddlewares()['reconnect']['databaseHandler'])) {
  78. return $config->getDatabase();
  79. }
  80. return $config->getMiddlewares()['reconnect']['databaseHandler']();
  81. }
  82. function getUsername(Config $config)
  83. {
  84. if (!isset($config->getMiddlewares()['reconnect']['usernameHandler'])) {
  85. return $config->getUsername();
  86. }
  87. return $config->getMiddlewares()['reconnect']['usernameHandler']();
  88. }
  89. function getPassword(Config $config)
  90. {
  91. if (!isset($config->getMiddlewares()['reconnect']['passwordHandler'])) {
  92. return $config->getPassword();
  93. }
  94. return $config->getMiddlewares()['reconnect']['passwordHandler']();
  95. }
  96. function loadFixture(string $dir, Config $config)
  97. {
  98. $driver = $config->getDriver();
  99. $filename = "$dir/fixtures/blog_$driver.sql";
  100. $file = file_get_contents($filename);
  101. $db = new GenericDB(
  102. $config->getDriver(),
  103. $config->getAddress(),
  104. $config->getPort(),
  105. getDatabase($config),
  106. getUsername($config),
  107. getPassword($config)
  108. );
  109. $pdo = $db->pdo();
  110. $file = preg_replace('/--.*$/m', '', $file);
  111. if ($driver == 'sqlsrv') {
  112. $statements = preg_split('/\n\s*GO\s*\n/s', $file);
  113. } else {
  114. $statements = preg_split('/(?<=;)\n/s', $file);
  115. }
  116. foreach ($statements as $i => $statement) {
  117. $statement = trim($statement);
  118. if ($statement) {
  119. try {
  120. $pdo->exec($statement);
  121. } catch (\PDOException $e) {
  122. $error = print_r($pdo->errorInfo(), true);
  123. $statement = var_export($statement, true);
  124. echo "Loading '$filename' failed on statemement #$i:\n$statement\nwith error:\n$error\n";
  125. exit(1);
  126. }
  127. }
  128. }
  129. }
  130. function run(array $drivers, string $dir, array $matches)
  131. {
  132. foreach ($drivers as $driver) {
  133. if (isset($matches[0])) {
  134. if (!preg_match('/' . $matches[0] . '/', $driver)) {
  135. continue;
  136. }
  137. }
  138. if (!extension_loaded("pdo_$driver")) {
  139. echo sprintf("%s: skipped, driver not loaded\n", $driver);
  140. continue;
  141. }
  142. $settings = [];
  143. include "$dir/config/base.php";
  144. include sprintf("$dir/config/%s.php", $driver);
  145. $config = new Config($settings);
  146. loadFixture($dir, $config);
  147. $start = microtime(true);
  148. $stats = runDir($config, "$dir/functional", array_slice($matches, 1), '');
  149. $end = microtime(true);
  150. $time = ($end - $start) * 1000;
  151. $total = $stats['total'];
  152. $failed = $stats['failed'];
  153. echo sprintf("%s: %d tests ran in %d ms, %d failed\n", $driver, $total, $time, $failed);
  154. }
  155. }
  156. run(['mysql', 'pgsql', 'sqlsrv'], __DIR__ . '/tests', array_slice($argv, 1));