|
13 | 13 |
|
14 | 14 | namespace Tests\Support\Config; |
15 | 15 |
|
| 16 | +use mysqli; |
| 17 | +use PDO; |
| 18 | +use Throwable; |
| 19 | + |
16 | 20 | /** |
17 | 21 | * Class Registrar |
18 | 22 | * |
@@ -137,7 +141,68 @@ public static function Database(): array |
137 | 141 | // so that we can test against multiple databases. |
138 | 142 | $group = env('DB', 'SQLite3'); |
139 | 143 |
|
140 | | - $config['tests'] = self::$dbConfig[$group] ?? []; |
| 144 | + if ($group === 'Oracle') { |
| 145 | + $group = 'OCI8'; |
| 146 | + } |
| 147 | + |
| 148 | + $dbParams = self::$dbConfig[$group] ?? []; |
| 149 | + |
| 150 | + if (! empty($dbParams) && ! in_array($group, ['SQLite3', 'OCI8'], true)) { |
| 151 | + $componentName = ''; |
| 152 | + |
| 153 | + foreach ($_SERVER['argv'] ?? [] as $arg) { |
| 154 | + if (str_contains($arg, 'tests/system/')) { |
| 155 | + $parts = explode('tests/system/', $arg); |
| 156 | + if (isset($parts[1])) { |
| 157 | + $componentName = explode('/', $parts[1])[0]; |
| 158 | + break; |
| 159 | + } |
| 160 | + } |
| 161 | + } |
| 162 | + |
| 163 | + if ($componentName !== '') { |
| 164 | + $dbParams['database'] = 'test_' . strtolower($componentName); |
| 165 | + |
| 166 | + try { |
| 167 | + if ($group === 'MySQLi') { |
| 168 | + $conn = new mysqli( |
| 169 | + $dbParams['hostname'], |
| 170 | + $dbParams['username'], |
| 171 | + $dbParams['password'], |
| 172 | + '', |
| 173 | + (int) $dbParams['port'], |
| 174 | + ); |
| 175 | + if (! $conn->connect_error) { |
| 176 | + $conn->query('CREATE DATABASE IF NOT EXISTS ' . $conn->real_escape_string($dbParams['database'])); |
| 177 | + $conn->close(); |
| 178 | + } |
| 179 | + } elseif ($group === 'Postgre') { |
| 180 | + $dsn = 'pgsql:host=' . $dbParams['hostname'] . ';port=' . $dbParams['port'] . ';user=' . $dbParams['username'] . ';password=' . $dbParams['password']; |
| 181 | + $pdo = new PDO($dsn); |
| 182 | + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 183 | + $stmt = $pdo->prepare('SELECT 1 FROM pg_database WHERE datname = ?'); |
| 184 | + $stmt->execute([$dbParams['database']]); |
| 185 | + if (! $stmt->fetchColumn()) { |
| 186 | + $dbName = str_replace('"', '""', $dbParams['database']); |
| 187 | + $pdo->exec('CREATE DATABASE "' . $dbName . '"'); |
| 188 | + } |
| 189 | + } elseif ($group === 'SQLSRV') { |
| 190 | + $dsn = 'sqlsrv:Server=' . $dbParams['hostname'] . ',' . $dbParams['port'] . ';Encrypt=False;TrustServerCertificate=True'; |
| 191 | + $pdo = new PDO($dsn, $dbParams['username'], $dbParams['password']); |
| 192 | + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 193 | + $stmt = $pdo->prepare('SELECT 1 FROM sys.databases WHERE name = ?'); |
| 194 | + $stmt->execute([$dbParams['database']]); |
| 195 | + if (! $stmt->fetchColumn()) { |
| 196 | + $pdo->exec('CREATE DATABASE [' . str_replace(']', ']]', $dbParams['database']) . '] COLLATE Latin1_General_100_CS_AS_SC_UTF8'); |
| 197 | + } |
| 198 | + } |
| 199 | + } catch (Throwable) { |
| 200 | + // Ignore any error and let the connection fail naturally |
| 201 | + } |
| 202 | + } |
| 203 | + } |
| 204 | + |
| 205 | + $config['tests'] = $dbParams; |
141 | 206 |
|
142 | 207 | return $config; |
143 | 208 | } |
|
0 commit comments