Skip to content

Commit 5acfd3d

Browse files
committed
Update tests with exceptions to match
1 parent fb20750 commit 5acfd3d

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

src/PdoMysql.php

+16-21
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22
class PdoMysql extends PDO {
33

44
public const ATTR_USE_BUFFERED_QUERY = PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
5-
6-
/** @cvalue PDO_MYSQL_ATTR_LOCAL_INFILE */
75
public const ATTR_LOCAL_INFILE = PDO::MYSQL_ATTR_LOCAL_INFILE;
86

9-
/** @cvalue PDO_MYSQL_ATTR_INIT_COMMAND */
107
public const ATTR_INIT_COMMAND = PDO::MYSQL_ATTR_INIT_COMMAND;
118

129
#ifndef PDO_USE_MYSQLND
@@ -20,54 +17,52 @@ class PdoMysql extends PDO {
2017
#public const int ATTR_READ_DEFAULT_GROUP = UNKNOWN;
2118
#endif
2219

23-
/** @cvalue PDO_MYSQL_ATTR_COMPRESS */
2420
public const ATTR_COMPRESS = PDO::MYSQL_ATTR_COMPRESS;
2521

26-
/** @cvalue PDO_MYSQL_ATTR_DIRECT_QUERY */
2722
public const ATTR_DIRECT_QUERY = PDO::MYSQL_ATTR_DIRECT_QUERY;
2823

29-
/** @cvalue PDO_MYSQL_ATTR_FOUND_ROWS */
3024
public const ATTR_FOUND_ROWS = PDO::MYSQL_ATTR_FOUND_ROWS;
3125

32-
/** @cvalue PDO_MYSQL_ATTR_IGNORE_SPACE */
3326
public const ATTR_IGNORE_SPACE = PDO::MYSQL_ATTR_IGNORE_SPACE;
3427

35-
/** @cvalue PDO_MYSQL_ATTR_SSL_KEY */
3628
public const ATTR_SSL_KEY = PDO::MYSQL_ATTR_SSL_KEY;
3729

38-
/** @cvalue PDO_MYSQL_ATTR_SSL_CERT */
3930
public const ATTR_SSL_CERT = PDO::MYSQL_ATTR_SSL_CERT;
4031

41-
/** @cvalue PDO_MYSQL_ATTR_SSL_CA */
4232
public const ATTR_SSL_CA = PDO::MYSQL_ATTR_SSL_CA;
4333

44-
/** @cvalue PDO_MYSQL_ATTR_SSL_CAPATH */
4534
public const ATTR_SSL_CAPATH = PDO::MYSQL_ATTR_SSL_CAPATH;
4635

47-
/** @cvalue PDO_MYSQL_ATTR_SSL_CIPHER */
4836
public const ATTR_SSL_CIPHER = PDO::MYSQL_ATTR_SSL_CIPHER;
4937

50-
#if MYSQL_VERSION_ID > 50605 || defined(PDO_USE_MYSQLND)
51-
/** @cvalue PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY */
5238
public const ATTR_SERVER_PUBLIC_KEY = PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
53-
#endif
54-
55-
/** @cvalue PDO_MYSQL_ATTR_MULTI_STATEMENTS */
5639
public const ATTR_MULTI_STATEMENTS = PDO::MYSQL_ATTR_MULTI_STATEMENTS;
5740

58-
/** @cvalue PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT */
5941
public const ATTR_SSL_VERIFY_SERVER_CERT = PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
6042

61-
#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
62-
/** @cvalue PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY */
6343
public const ATTR_LOCAL_INFILE_DIRECTORY = PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY;
64-
#endif
6544
public static function connect(
6645
string $dsn,
6746
?string $username = null,
6847
#[\SensitiveParameter] ?string $password = null,
6948
?array $options = null
7049
): static {
50+
51+
if (!preg_match('/^([a-z0-9]+):/', $dsn, $matches)) {
52+
throw new PDOException('PDO::connect(): Argument #1 ($dsn) must be a valid data source name.');
53+
}
54+
55+
if (!in_array($matches[1], PDO::getAvailableDrivers(), true)) {
56+
throw new PDOException('Count not find driver');
57+
}
58+
59+
if ($matches[1] !== 'mysql') {
60+
throw new PDOException(sprintf('PdoMysql::connect() cannot be called when connecting to the "%s" driver, either %s::connect() or PDO::connect() must be called instead.',
61+
$matches[1],
62+
ucwords($matches[1]),
63+
));
64+
}
65+
7166
return new static($dsn, $username, $password, $options);
7267
}
7368
}

tests/PdoMysqlTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,20 @@ public function testPdoConstantsSameAsPdoMysql(string $constant, string $mysqlCo
2626
$this->assertTrue(defined(PdoMysql::class . '::' . $mysqlConstant), 'Check if PdoMysql::' . $mysqlConstant . ' exists');
2727
$this->assertSame(constant('PDO::' . $constant), constant(PdoMysql::class . '::' . $mysqlConstant), 'Check if value and type PDO::' . $constant . ' === ' . PdoMysql::class . '::' . $mysqlConstant);
2828
}
29+
30+
public function testThrowsOnDifferentDsns(): void {
31+
$this->expectException(PDOException::class);
32+
$this->expectExceptionMessage('could not find driver');
33+
PdoMysql::connect('foobar:test');
34+
}
35+
36+
public function testThrowsOnUnknownDsns(): void {
37+
if (!in_array('sqlite', PDO::getAvailableDrivers(), true)) {
38+
$this->markTestSkipped('Sqlite driver not available');
39+
}
40+
41+
$this->expectException(PDOException::class);
42+
$this->expectExceptionMessage('PdoMysql::connect() cannot be called when connecting to the "sqlite" driver, either PdoSqlite::connect() or PDO::connect() must be called instead');
43+
PdoMysql::connect('sqlite:test');
44+
}
2945
}

0 commit comments

Comments
 (0)