Skip to content

Commit 8beee21

Browse files
committed
test(phaseE): add adapter contract tests
Add deterministic PHPUnit tests for all Phase E adapters: - MySQLPDOAdapter - MySQLDBALAdapter - RedisAdapter - RedisPredisAdapter - MongoDatabaseAdapter Tests validate: - AdapterInterface implementation - Correct driver injection - Stable getDriver() identity - Repeated calls consistency Optional dependencies are handled safely via conditional skips. No production source code was modified.
1 parent 7c69c55 commit 8beee21

6 files changed

Lines changed: 276 additions & 3 deletions

File tree

composer.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
"require": {
3333
"php": ">=8.2",
34-
"maatify/common": "^1.0"
34+
"maatify/common": "^2.0"
3535
},
3636

3737
"suggest": {
@@ -57,7 +57,10 @@
5757
"require-dev": {
5858
"friendsofphp/php-cs-fixer": "^3.89",
5959
"phpstan/phpstan": "^2.0",
60-
"phpunit/phpunit": "^11.0"
60+
"phpunit/phpunit": "^11.0",
61+
"mongodb/mongodb": "^2.0",
62+
"predis/predis": "^2.3",
63+
"doctrine/dbal": "^4.3"
6164
},
6265
"scripts": {
6366
"test": "phpunit --configuration phpunit.no-coverage.xml.dist",
@@ -76,4 +79,4 @@
7679
"config": {
7780
"sort-packages": true
7881
}
79-
}
82+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Maatify\DataAdapters\Tests\Adapters;
6+
7+
use Maatify\DataAdapters\Adapters\Mongo\MongoDatabaseAdapter;
8+
use Maatify\DataAdapters\Contracts\Adapter\AdapterInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class MongoDatabaseAdapterTest extends TestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (! class_exists('MongoDB\Database')) {
16+
$this->markTestSkipped('MongoDB\Database class is not available.');
17+
}
18+
}
19+
20+
public function test_it_implements_adapter_interface(): void
21+
{
22+
$driver = $this->createStub('MongoDB\Database');
23+
$adapter = new MongoDatabaseAdapter($driver);
24+
25+
$this->assertInstanceOf(AdapterInterface::class, $adapter);
26+
}
27+
28+
public function test_construction_and_get_driver(): void
29+
{
30+
$driver = $this->createStub('MongoDB\Database');
31+
$adapter = new MongoDatabaseAdapter($driver);
32+
33+
$this->assertSame($driver, $adapter->getDriver());
34+
}
35+
36+
public function test_get_driver_returns_correct_type(): void
37+
{
38+
$driver = $this->createStub('MongoDB\Database');
39+
$adapter = new MongoDatabaseAdapter($driver);
40+
41+
$this->assertInstanceOf('MongoDB\Database', $adapter->getDriver());
42+
}
43+
44+
public function test_repeated_calls_return_same_instance(): void
45+
{
46+
$driver = $this->createStub('MongoDB\Database');
47+
$adapter = new MongoDatabaseAdapter($driver);
48+
49+
$first = $adapter->getDriver();
50+
$second = $adapter->getDriver();
51+
52+
$this->assertSame($first, $second);
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Maatify\DataAdapters\Tests\Adapters;
6+
7+
use Maatify\DataAdapters\Adapters\MySQL\MySQLDBALAdapter;
8+
use Maatify\DataAdapters\Contracts\Adapter\AdapterInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class MySQLDBALAdapterTest extends TestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (! class_exists('Doctrine\DBAL\Connection')) {
16+
$this->markTestSkipped('Doctrine DBAL Connection class is not available.');
17+
}
18+
}
19+
20+
public function test_it_implements_adapter_interface(): void
21+
{
22+
$driver = $this->createStub('Doctrine\DBAL\Connection');
23+
$adapter = new MySQLDBALAdapter($driver);
24+
25+
$this->assertInstanceOf(AdapterInterface::class, $adapter);
26+
}
27+
28+
public function test_construction_and_get_driver(): void
29+
{
30+
$driver = $this->createStub('Doctrine\DBAL\Connection');
31+
$adapter = new MySQLDBALAdapter($driver);
32+
33+
$this->assertSame($driver, $adapter->getDriver());
34+
}
35+
36+
public function test_get_driver_returns_correct_type(): void
37+
{
38+
$driver = $this->createStub('Doctrine\DBAL\Connection');
39+
$adapter = new MySQLDBALAdapter($driver);
40+
41+
$this->assertInstanceOf('Doctrine\DBAL\Connection', $adapter->getDriver());
42+
}
43+
44+
public function test_repeated_calls_return_same_instance(): void
45+
{
46+
$driver = $this->createStub('Doctrine\DBAL\Connection');
47+
$adapter = new MySQLDBALAdapter($driver);
48+
49+
$first = $adapter->getDriver();
50+
$second = $adapter->getDriver();
51+
52+
$this->assertSame($first, $second);
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Maatify\DataAdapters\Tests\Adapters;
6+
7+
use Maatify\DataAdapters\Adapters\MySQL\MySQLPDOAdapter;
8+
use Maatify\DataAdapters\Contracts\Adapter\AdapterInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class MySQLPDOAdapterTest extends TestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (! class_exists(\PDO::class)) {
16+
$this->markTestSkipped('PDO class is not available.');
17+
}
18+
}
19+
20+
public function test_it_implements_adapter_interface(): void
21+
{
22+
$driver = $this->createStub(\PDO::class);
23+
$adapter = new MySQLPDOAdapter($driver);
24+
25+
$this->assertInstanceOf(AdapterInterface::class, $adapter);
26+
}
27+
28+
public function test_construction_and_get_driver(): void
29+
{
30+
$driver = $this->createStub(\PDO::class);
31+
$adapter = new MySQLPDOAdapter($driver);
32+
33+
$this->assertSame($driver, $adapter->getDriver());
34+
}
35+
36+
public function test_get_driver_returns_correct_type(): void
37+
{
38+
$driver = $this->createStub(\PDO::class);
39+
$adapter = new MySQLPDOAdapter($driver);
40+
41+
$this->assertInstanceOf(\PDO::class, $adapter->getDriver());
42+
}
43+
44+
public function test_repeated_calls_return_same_instance(): void
45+
{
46+
$driver = $this->createStub(\PDO::class);
47+
$adapter = new MySQLPDOAdapter($driver);
48+
49+
$first = $adapter->getDriver();
50+
$second = $adapter->getDriver();
51+
52+
$this->assertSame($first, $second);
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Maatify\DataAdapters\Tests\Adapters;
6+
7+
use Maatify\DataAdapters\Adapters\Redis\RedisAdapter;
8+
use Maatify\DataAdapters\Contracts\Adapter\AdapterInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class RedisAdapterTest extends TestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (! class_exists(\Redis::class)) {
16+
$this->markTestSkipped('Redis class is not available.');
17+
}
18+
}
19+
20+
public function test_it_implements_adapter_interface(): void
21+
{
22+
$driver = $this->createStub(\Redis::class);
23+
$adapter = new RedisAdapter($driver);
24+
25+
$this->assertInstanceOf(AdapterInterface::class, $adapter);
26+
}
27+
28+
public function test_construction_and_get_driver(): void
29+
{
30+
$driver = $this->createStub(\Redis::class);
31+
$adapter = new RedisAdapter($driver);
32+
33+
$this->assertSame($driver, $adapter->getDriver());
34+
}
35+
36+
public function test_get_driver_returns_correct_type(): void
37+
{
38+
$driver = $this->createStub(\Redis::class);
39+
$adapter = new RedisAdapter($driver);
40+
41+
$this->assertInstanceOf(\Redis::class, $adapter->getDriver());
42+
}
43+
44+
public function test_repeated_calls_return_same_instance(): void
45+
{
46+
$driver = $this->createStub(\Redis::class);
47+
$adapter = new RedisAdapter($driver);
48+
49+
$first = $adapter->getDriver();
50+
$second = $adapter->getDriver();
51+
52+
$this->assertSame($first, $second);
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Maatify\DataAdapters\Tests\Adapters;
6+
7+
use Maatify\DataAdapters\Adapters\Redis\RedisPredisAdapter;
8+
use Maatify\DataAdapters\Contracts\Adapter\AdapterInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class RedisPredisAdapterTest extends TestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (! class_exists('Predis\Client')) {
16+
$this->markTestSkipped('Predis\Client class is not available.');
17+
}
18+
}
19+
20+
public function test_it_implements_adapter_interface(): void
21+
{
22+
$driver = $this->createStub('Predis\Client');
23+
$adapter = new RedisPredisAdapter($driver);
24+
25+
$this->assertInstanceOf(AdapterInterface::class, $adapter);
26+
}
27+
28+
public function test_construction_and_get_driver(): void
29+
{
30+
$driver = $this->createStub('Predis\Client');
31+
$adapter = new RedisPredisAdapter($driver);
32+
33+
$this->assertSame($driver, $adapter->getDriver());
34+
}
35+
36+
public function test_get_driver_returns_correct_type(): void
37+
{
38+
$driver = $this->createStub('Predis\Client');
39+
$adapter = new RedisPredisAdapter($driver);
40+
41+
$this->assertInstanceOf('Predis\Client', $adapter->getDriver());
42+
}
43+
44+
public function test_repeated_calls_return_same_instance(): void
45+
{
46+
$driver = $this->createStub('Predis\Client');
47+
$adapter = new RedisPredisAdapter($driver);
48+
49+
$first = $adapter->getDriver();
50+
$second = $adapter->getDriver();
51+
52+
$this->assertSame($first, $second);
53+
}
54+
}

0 commit comments

Comments
 (0)