adachsoft / dynamic-table-contract-tests
Abstract test cases (Test Suite) for adachsoft/dynamic-table-contract
Package info
gitlab.com/a.adach/dynamic-table-contract-tests
pkg:composer/adachsoft/dynamic-table-contract-tests
Requires
- php: >=8.2
- adachsoft/dynamic-table-contract: ^1.0
Requires (Dev)
- adachsoft/php-code-style: ^0.4.3
- friendsofphp/php-cs-fixer: ^3.95
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^13.1
- rector/rector: ^2.4
This package is not auto-updated.
Last update: 2026-04-22 13:04:37 UTC
README
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.0adachsoft/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(); // or InMemoryStore for testing
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();
// Provide evaluators/projector as required by your implementation
return new MyRowRepository($store, /* evaluators */);
}
}
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;
// Example
$newTable = RepositoryTestFixtureFactory::makeNewTable('users');
$column = RepositoryTestFixtureFactory::makeColumn('age', ColumnType::INT, true);
Running Tests
# Run functional/contract 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.