Dynamic Table Contract Tests

This package provides abstract test cases (Test Suite pattern) for the adachsoft/dynamic-table-contract library. It allows implementors of TableRepositoryInterface and QueryableRowRepositoryInterface to easily verify that their storage implementations fully comply with the contract.
Installation
composer require adachsoft/dynamic-table-contract-tests --dev
The package depends on:
adachsoft/dynamic-table-contract:^1.0
adachsoft/dynamic-table-in-memory:^1.0 (for test fixtures and sandboxing)
phpunit/phpunit:^13.1
Usage
1. Testing TableRepositoryInterface
Extend AbstractTableRepositoryTestCase and provide your implementation via the factory method:
<?php
declare(strict_types=1);
namespace MyVendor\MyStorage\Tests\Functional;
use AdachSoft\DynamicTableContract\Repository\TableRepositoryInterface;
use AdachSoft\DynamicTableContractTests\AbstractTableRepositoryTestCase;
use PHPUnit\Framework\Attributes\Group;
#[Group('functional')]
final class MyTableRepositoryTest extends AbstractTableRepositoryTestCase
{
protected function createTableRepository(): TableRepositoryInterface
{
$store = new MyCustomStore();
return new MyTableRepository($store);
}
}
This class runs comprehensive tests for:
save() / get()
create() (with duplicate handling)
getAll()
update() (including ID changes and conflicts)
delete()
2. Testing QueryableRowRepositoryInterface
Extend AbstractQueryableRowRepositoryTestCase. The base class automatically prepares a test table (test_table with name and age columns) using RepositoryTestFixtureFactory.
<?php
declare(strict_types=1);
namespace MyVendor\MyStorage\Tests\Functional;
use AdachSoft\DynamicTableContract\Query\Repository\QueryableRowRepositoryInterface;
use AdachSoft\DynamicTableContractTests\AbstractQueryableRowRepositoryTestCase;
use PHPUnit\Framework\Attributes\Group;
#[Group('functional')]
final class MyRowRepositoryTest extends AbstractQueryableRowRepositoryTestCase
{
protected function createRowRepository(): QueryableRowRepositoryInterface
{
$store = new MyCustomStore();
return new MyRowRepository($store, );
}
}
This runs tests for:
add(), getAll(), getById(), update(), delete()
findBy() with all filter conditions (EqualsCondition, LikeCondition, InCondition, IsNullCondition, GreaterThanCondition, AndFilter, OrFilter, NotFilter, etc.)
- Sorting (
SortVo, multi-column)
- Pagination
- Projection (
selectedColumns, ConcatExpressionVo)
Test Fixture Factory
Use RepositoryTestFixtureFactory (available in the Factory namespace) to reduce boilerplate when creating ColumnDto, NewTableDto and NewRowDto objects in your own tests.
use AdachSoft\DynamicTableContractTests\Factory\RepositoryTestFixtureFactory;
use AdachSoft\DynamicTableContract\Type\ColumnType;
$newTable = RepositoryTestFixtureFactory::makeNewTable('users');
$column = RepositoryTestFixtureFactory::makeColumn('age', ColumnType::INT, true);
Running Tests
phpunit --group functional
All tests follow the Arrange-Act-Assert pattern and use #[CoversClass] where applicable.
License
MIT License. See the main dynamic-table-contract repository for details.
Contributing
Please refer to the main contract repository for contribution guidelines.