fix MySQL tests
This commit is contained in:
parent
816ce8d973
commit
17ad40b91f
|
|
@ -1 +1 @@
|
|||
{"version":2,"defects":{"Pairity\\Tests\\BelongsToManyMysqlTest::testBelongsToManyEagerAndHelpers":1,"Pairity\\Tests\\BelongsToManySqliteTest::testBelongsToManyEagerAndPivotHelpers":7,"Pairity\\Tests\\CastersAndAccessorsSqliteTest::testCustomCasterAndDtoAccessorsMutators":7,"Pairity\\Tests\\JoinEagerMysqlTest::testJoinEagerHasManyAndBelongsTo":1,"Pairity\\Tests\\JoinEagerSqliteTest::testHasManyJoinEagerWithProjectionAndSoftDeleteScope":7,"Pairity\\Tests\\JoinEagerSqliteTest::testBelongsToJoinEagerSingleLevel":8,"Pairity\\Tests\\MongoAdapterTest::testCrudCycle":1,"Pairity\\Tests\\MongoDaoTest::testCrudViaDao":8,"Pairity\\Tests\\MongoOptimisticLockTest::testVersionIncrementOnUpdate":8,"Pairity\\Tests\\MongoPaginationTest::testPaginateAndSimplePaginateWithScopes":8,"Pairity\\Tests\\MongoRelationsTest::testEagerAndLazyRelations":8,"Pairity\\Tests\\MysqlSmokeTest::testCreateAndDropTable":1,"Pairity\\Tests\\PaginationSqliteTest::testPaginateAndSimplePaginateWithScopesAndRelations":7,"Pairity\\Tests\\RelationsNestedConstraintsSqliteTest::testNestedEagerAndPerRelationFieldsConstraint":7,"Pairity\\Tests\\SchemaBuilderSqliteTest::testCreateAlterDropCycle":8,"Pairity\\Tests\\UnitOfWorkCascadeMongoTest::testDeleteByIdCascadesToChildren":8,"Pairity\\Tests\\UnitOfWorkCascadeSqliteTest::testDeleteByIdCascadesToChildren":7,"Pairity\\Tests\\UnitOfWorkMongoTest::testDeferredUpdateAndDeleteCommit":8,"Pairity\\Tests\\UnitOfWorkMongoTest::testRollbackOnExceptionClearsOps":8,"Pairity\\Tests\\MongoEventSystemTest::testDaoEventsFireOnCrud":8,"Pairity\\Tests\\PostgresSmokeTest::testCreateAlterDropCycle":1},"times":{"Pairity\\Tests\\BelongsToManyMysqlTest::testBelongsToManyEagerAndHelpers":0.001,"Pairity\\Tests\\BelongsToManySqliteTest::testBelongsToManyEagerAndPivotHelpers":0.004,"Pairity\\Tests\\CastersAndAccessorsSqliteTest::testCustomCasterAndDtoAccessorsMutators":0,"Pairity\\Tests\\JoinEagerMysqlTest::testJoinEagerHasManyAndBelongsTo":0,"Pairity\\Tests\\JoinEagerSqliteTest::testHasManyJoinEagerWithProjectionAndSoftDeleteScope":0,"Pairity\\Tests\\JoinEagerSqliteTest::testBelongsToJoinEagerSingleLevel":0,"Pairity\\Tests\\MongoAdapterTest::testCrudCycle":0.002,"Pairity\\Tests\\MongoDaoTest::testCrudViaDao":0.001,"Pairity\\Tests\\MongoOptimisticLockTest::testVersionIncrementOnUpdate":0,"Pairity\\Tests\\MongoPaginationTest::testPaginateAndSimplePaginateWithScopes":0,"Pairity\\Tests\\MongoRelationsTest::testEagerAndLazyRelations":0,"Pairity\\Tests\\MysqlSmokeTest::testCreateAndDropTable":0,"Pairity\\Tests\\OptimisticLockSqliteTest::testVersionLockingIncrementsAndBlocksBulkUpdate":0,"Pairity\\Tests\\PaginationSqliteTest::testPaginateAndSimplePaginateWithScopesAndRelations":0.001,"Pairity\\Tests\\RelationsNestedConstraintsSqliteTest::testNestedEagerAndPerRelationFieldsConstraint":0,"Pairity\\Tests\\SchemaBuilderSqliteTest::testCreateAlterDropCycle":0.002,"Pairity\\Tests\\SoftDeletesTimestampsSqliteTest::testTimestampsAndSoftDeletesFlow":0,"Pairity\\Tests\\UnitOfWorkCascadeMongoTest::testDeleteByIdCascadesToChildren":0,"Pairity\\Tests\\UnitOfWorkCascadeSqliteTest::testDeleteByIdCascadesToChildren":0,"Pairity\\Tests\\UnitOfWorkMongoTest::testDeferredUpdateAndDeleteCommit":0,"Pairity\\Tests\\UnitOfWorkMongoTest::testRollbackOnExceptionClearsOps":0,"Pairity\\Tests\\UnitOfWorkSqliteTest::testDeferredUpdateAndDeleteCommit":0,"Pairity\\Tests\\UnitOfWorkSqliteTest::testRollbackOnExceptionClearsOps":0,"Pairity\\Tests\\EventSystemSqliteTest::testDaoEventsForInsertUpdateDeleteAndFind":0,"Pairity\\Tests\\EventSystemSqliteTest::testUowBeforeAfterCommitEvents":0,"Pairity\\Tests\\MongoEventSystemTest::testDaoEventsFireOnCrud":0,"Pairity\\Tests\\PostgresSmokeTest::testCreateAlterDropCycle":0}}
|
||||
{"version":2,"defects":{"Pairity\\Tests\\BelongsToManyMysqlTest::testBelongsToManyEagerAndHelpers":1,"Pairity\\Tests\\BelongsToManySqliteTest::testBelongsToManyEagerAndPivotHelpers":7,"Pairity\\Tests\\CastersAndAccessorsSqliteTest::testCustomCasterAndDtoAccessorsMutators":7,"Pairity\\Tests\\JoinEagerMysqlTest::testJoinEagerHasManyAndBelongsTo":1,"Pairity\\Tests\\JoinEagerSqliteTest::testHasManyJoinEagerWithProjectionAndSoftDeleteScope":7,"Pairity\\Tests\\JoinEagerSqliteTest::testBelongsToJoinEagerSingleLevel":8,"Pairity\\Tests\\MongoAdapterTest::testCrudCycle":1,"Pairity\\Tests\\MongoDaoTest::testCrudViaDao":8,"Pairity\\Tests\\MongoOptimisticLockTest::testVersionIncrementOnUpdate":8,"Pairity\\Tests\\MongoPaginationTest::testPaginateAndSimplePaginateWithScopes":8,"Pairity\\Tests\\MongoRelationsTest::testEagerAndLazyRelations":8,"Pairity\\Tests\\MysqlSmokeTest::testCreateAndDropTable":1,"Pairity\\Tests\\PaginationSqliteTest::testPaginateAndSimplePaginateWithScopesAndRelations":7,"Pairity\\Tests\\RelationsNestedConstraintsSqliteTest::testNestedEagerAndPerRelationFieldsConstraint":7,"Pairity\\Tests\\SchemaBuilderSqliteTest::testCreateAlterDropCycle":8,"Pairity\\Tests\\UnitOfWorkCascadeMongoTest::testDeleteByIdCascadesToChildren":8,"Pairity\\Tests\\UnitOfWorkCascadeSqliteTest::testDeleteByIdCascadesToChildren":7,"Pairity\\Tests\\UnitOfWorkMongoTest::testDeferredUpdateAndDeleteCommit":8,"Pairity\\Tests\\UnitOfWorkMongoTest::testRollbackOnExceptionClearsOps":8,"Pairity\\Tests\\MongoEventSystemTest::testDaoEventsFireOnCrud":8,"Pairity\\Tests\\PostgresSmokeTest::testCreateAlterDropCycle":1},"times":{"Pairity\\Tests\\BelongsToManyMysqlTest::testBelongsToManyEagerAndHelpers":0.001,"Pairity\\Tests\\BelongsToManySqliteTest::testBelongsToManyEagerAndPivotHelpers":0.004,"Pairity\\Tests\\CastersAndAccessorsSqliteTest::testCustomCasterAndDtoAccessorsMutators":0,"Pairity\\Tests\\JoinEagerMysqlTest::testJoinEagerHasManyAndBelongsTo":0,"Pairity\\Tests\\JoinEagerSqliteTest::testHasManyJoinEagerWithProjectionAndSoftDeleteScope":0,"Pairity\\Tests\\JoinEagerSqliteTest::testBelongsToJoinEagerSingleLevel":0,"Pairity\\Tests\\MongoAdapterTest::testCrudCycle":0.002,"Pairity\\Tests\\MongoDaoTest::testCrudViaDao":0.001,"Pairity\\Tests\\MongoOptimisticLockTest::testVersionIncrementOnUpdate":0,"Pairity\\Tests\\MongoPaginationTest::testPaginateAndSimplePaginateWithScopes":0,"Pairity\\Tests\\MongoRelationsTest::testEagerAndLazyRelations":0,"Pairity\\Tests\\MysqlSmokeTest::testCreateAndDropTable":0,"Pairity\\Tests\\OptimisticLockSqliteTest::testVersionLockingIncrementsAndBlocksBulkUpdate":0,"Pairity\\Tests\\PaginationSqliteTest::testPaginateAndSimplePaginateWithScopesAndRelations":0.001,"Pairity\\Tests\\RelationsNestedConstraintsSqliteTest::testNestedEagerAndPerRelationFieldsConstraint":0,"Pairity\\Tests\\SchemaBuilderSqliteTest::testCreateAlterDropCycle":0.001,"Pairity\\Tests\\SoftDeletesTimestampsSqliteTest::testTimestampsAndSoftDeletesFlow":0,"Pairity\\Tests\\UnitOfWorkCascadeMongoTest::testDeleteByIdCascadesToChildren":0,"Pairity\\Tests\\UnitOfWorkCascadeSqliteTest::testDeleteByIdCascadesToChildren":0,"Pairity\\Tests\\UnitOfWorkMongoTest::testDeferredUpdateAndDeleteCommit":0,"Pairity\\Tests\\UnitOfWorkMongoTest::testRollbackOnExceptionClearsOps":0,"Pairity\\Tests\\UnitOfWorkSqliteTest::testDeferredUpdateAndDeleteCommit":0,"Pairity\\Tests\\UnitOfWorkSqliteTest::testRollbackOnExceptionClearsOps":0,"Pairity\\Tests\\EventSystemSqliteTest::testDaoEventsForInsertUpdateDeleteAndFind":0,"Pairity\\Tests\\EventSystemSqliteTest::testUowBeforeAfterCommitEvents":0,"Pairity\\Tests\\MongoEventSystemTest::testDaoEventsFireOnCrud":0,"Pairity\\Tests\\PostgresSmokeTest::testCreateAlterDropCycle":0}}
|
||||
|
|
@ -52,26 +52,26 @@ final class BelongsToManyMysqlTest extends TestCase
|
|||
$RoleDto = new class([]) extends AbstractDto {};
|
||||
$userDto = get_class($UserDto); $roleDto = get_class($RoleDto);
|
||||
|
||||
// DAOs
|
||||
$RoleDao = new class($conn, $rolesT, $roleDto) extends AbstractDao {
|
||||
private string $table; private string $dto;
|
||||
public function __construct($c, string $table, string $dto) { parent::__construct($c); $this->table = $table; $this->dto = $dto; }
|
||||
public function getTable(): string { return $this->table; }
|
||||
protected function dtoClass(): string { return $this->dto; }
|
||||
// DAOs (constructors accept only connection; runtime configuration via static props)
|
||||
$RoleDao = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto;
|
||||
public function __construct($c) { parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'name'=>['cast'=>'string']]]; }
|
||||
};
|
||||
|
||||
$UserDao = new class($conn, $usersT, $userDto, get_class($RoleDao), $pivotT) extends AbstractDao {
|
||||
private string $table; private string $dto; private string $roleDaoClass; private string $pivot;
|
||||
public function __construct($c, string $table, string $dto, string $roleDaoClass, string $pivot) { parent::__construct($c); $this->table=$table; $this->dto=$dto; $this->roleDaoClass=$roleDaoClass; $this->pivot=$pivot; }
|
||||
public function getTable(): string { return $this->table; }
|
||||
protected function dtoClass(): string { return $this->dto; }
|
||||
$UserDao = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto; public static string $roleDaoClass; public static string $pivot;
|
||||
public function __construct($c) { parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function relations(): array {
|
||||
return [
|
||||
'roles' => [
|
||||
'type' => 'belongsToMany',
|
||||
'dao' => $this->roleDaoClass,
|
||||
'pivot' => $this->pivot,
|
||||
'dao' => self::$roleDaoClass,
|
||||
'pivot' => self::$pivot,
|
||||
'foreignPivotKey' => 'user_id',
|
||||
'relatedPivotKey' => 'role_id',
|
||||
'localKey' => 'id',
|
||||
|
|
@ -82,8 +82,19 @@ final class BelongsToManyMysqlTest extends TestCase
|
|||
protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'email'=>['cast'=>'string']]]; }
|
||||
};
|
||||
|
||||
$roleDao = new $RoleDao($conn, $rolesT, $roleDto);
|
||||
$userDao = new $UserDao($conn, $usersT, $userDto, get_class($roleDao), $pivotT);
|
||||
// Configure static props for DAOs
|
||||
$roleDaoClass = get_class($RoleDao);
|
||||
$roleDaoClass::$table = $rolesT;
|
||||
$roleDaoClass::$dto = $roleDto;
|
||||
|
||||
$userDaoClass = get_class($UserDao);
|
||||
$userDaoClass::$table = $usersT;
|
||||
$userDaoClass::$dto = $userDto;
|
||||
$userDaoClass::$roleDaoClass = $roleDaoClass;
|
||||
$userDaoClass::$pivot = $pivotT;
|
||||
|
||||
$roleDao = new $roleDaoClass($conn);
|
||||
$userDao = new $userDaoClass($conn);
|
||||
|
||||
// Seed
|
||||
$u = $userDao->insert(['email' => 'b@example.com']);
|
||||
|
|
|
|||
|
|
@ -50,12 +50,12 @@ final class JoinEagerMysqlTest extends TestCase
|
|||
$PostDto = new class([]) extends AbstractDto {};
|
||||
$uClass = get_class($UserDto); $pClass = get_class($PostDto);
|
||||
|
||||
// DAOs
|
||||
$PostDao = new class($conn, $postsT, $pClass) extends AbstractDao {
|
||||
private string $table; private string $dto;
|
||||
public function __construct($c, string $table, string $dto) { parent::__construct($c); $this->table=$table; $this->dto=$dto; }
|
||||
public function getTable(): string { return $this->table; }
|
||||
protected function dtoClass(): string { return $this->dto; }
|
||||
// DAOs (constructors accept only connection; configured via static props)
|
||||
$PostDao = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto;
|
||||
public function __construct($c) { parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function schema(): array { return [
|
||||
'primaryKey' => 'id',
|
||||
'columns' => [ 'id'=>['cast'=>'int'], 'user_id'=>['cast'=>'int'], 'title'=>['cast'=>'string'], 'deleted_at'=>['cast'=>'datetime'] ],
|
||||
|
|
@ -63,17 +63,26 @@ final class JoinEagerMysqlTest extends TestCase
|
|||
]; }
|
||||
};
|
||||
|
||||
$UserDao = new class($conn, $usersT, $uClass, get_class($PostDao)) extends AbstractDao {
|
||||
private string $table; private string $dto; private string $postDaoClass;
|
||||
public function __construct($c, string $table, string $dto, string $postDaoClass) { parent::__construct($c); $this->table=$table; $this->dto=$dto; $this->postDaoClass=$postDaoClass; }
|
||||
public function getTable(): string { return $this->table; }
|
||||
protected function dtoClass(): string { return $this->dto; }
|
||||
protected function relations(): array { return [ 'posts' => [ 'type'=>'hasMany', 'dao'=>$this->postDaoClass, 'foreignKey'=>'user_id', 'localKey'=>'id' ] ]; }
|
||||
$UserDao = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto; public static string $postDaoClass;
|
||||
public function __construct($c) { parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function relations(): array { return [ 'posts' => [ 'type'=>'hasMany', 'dao'=>self::$postDaoClass, 'foreignKey'=>'user_id', 'localKey'=>'id' ] ]; }
|
||||
protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'name'=>['cast'=>'string']]]; }
|
||||
};
|
||||
|
||||
$postDao = new $PostDao($conn, $postsT, $pClass);
|
||||
$userDao = new $UserDao($conn, $usersT, $uClass, get_class($postDao));
|
||||
// Configure static props
|
||||
$postDaoClass = get_class($PostDao);
|
||||
$postDaoClass::$table = $postsT;
|
||||
$postDaoClass::$dto = $pClass;
|
||||
$userDaoClass = get_class($UserDao);
|
||||
$userDaoClass::$table = $usersT;
|
||||
$userDaoClass::$dto = $uClass;
|
||||
$userDaoClass::$postDaoClass = $postDaoClass;
|
||||
|
||||
$postDao = new $postDaoClass($conn);
|
||||
$userDao = new $userDaoClass($conn);
|
||||
|
||||
// Seed
|
||||
$u1 = $userDao->insert(['name' => 'Alice']);
|
||||
|
|
@ -85,15 +94,15 @@ final class JoinEagerMysqlTest extends TestCase
|
|||
// soft-deleted child for Bob
|
||||
$postDao->insert(['user_id' => $uid2, 'title' => 'Hidden', 'deleted_at' => gmdate('Y-m-d H:i:s')]);
|
||||
|
||||
// Baseline batched eager
|
||||
$baseline = $userDao->fields('id','name','posts.title')->with(['posts'])->findAllBy([]);
|
||||
// Baseline batched eager (include posts.user_id for grouping)
|
||||
$baseline = $userDao->fields('id','name','posts.user_id','posts.title')->with(['posts'])->findAllBy([]);
|
||||
$this->assertCount(2, $baseline);
|
||||
$postsAlice = $baseline[0]->toArray(false)['posts'] ?? [];
|
||||
$this->assertIsArray($postsAlice);
|
||||
$this->assertCount(2, $postsAlice);
|
||||
|
||||
// Join-based eager (global)
|
||||
$joined = $userDao->fields('id','name','posts.title')->useJoinEager()->with(['posts'])->findAllBy([]);
|
||||
$joined = $userDao->fields('id','name','posts.user_id','posts.title')->useJoinEager()->with(['posts'])->findAllBy([]);
|
||||
$this->assertCount(2, $joined);
|
||||
foreach ($joined as $u) {
|
||||
$posts = $u->toArray(false)['posts'] ?? [];
|
||||
|
|
@ -102,17 +111,32 @@ final class JoinEagerMysqlTest extends TestCase
|
|||
}
|
||||
}
|
||||
|
||||
// belongsTo join: Posts -> User
|
||||
$UserDao2 = get_class($userDao);
|
||||
$PostDao2 = new class($conn, $postsT, $pClass, $UserDao2, $usersT, $uClass) extends AbstractDao {
|
||||
private string $pTable; private string $dto; private string $userDaoClass; private string $uTable; private string $uDto;
|
||||
public function __construct($c,string $pTable,string $dto,string $userDaoClass,string $uTable,string $uDto){ parent::__construct($c); $this->pTable=$pTable; $this->dto=$dto; $this->userDaoClass=$userDaoClass; $this->uTable=$uTable; $this->uDto=$uDto; }
|
||||
public function getTable(): string { return $this->pTable; }
|
||||
protected function dtoClass(): string { return $this->dto; }
|
||||
protected function relations(): array { return [ 'user' => [ 'type'=>'belongsTo', 'dao'=>get_class(new class($this->getConnection(), $this->uTable, $this->uDto) extends AbstractDao { private string $t; private string $d; public function __construct($c,string $t,string $d){ parent::__construct($c); $this->t=$t; $this->d=$d; } public function getTable(): string { return $this->t; } protected function dtoClass(): string { return $this->d; } protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'name'=>['cast'=>'string']]]; } }), 'foreignKey'=>'user_id', 'otherKey'=>'id' ] ]; }
|
||||
// belongsTo join: Posts -> User (use static-prop pattern for both sides)
|
||||
$UserDao2 = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto;
|
||||
public function __construct($c){ parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'name'=>['cast'=>'string']]]; }
|
||||
};
|
||||
$userDao2Class = get_class($UserDao2);
|
||||
$userDao2Class::$table = $usersT;
|
||||
$userDao2Class::$dto = $uClass;
|
||||
|
||||
$PostDao2 = new class($conn) extends AbstractDao {
|
||||
public static string $table; public static string $dto; public static string $userDaoClass;
|
||||
public function __construct($c){ parent::__construct($c); }
|
||||
public function getTable(): string { return self::$table; }
|
||||
protected function dtoClass(): string { return self::$dto; }
|
||||
protected function relations(): array { return [ 'user' => [ 'type'=>'belongsTo', 'dao'=>self::$userDaoClass, 'foreignKey'=>'user_id', 'otherKey'=>'id' ] ]; }
|
||||
protected function schema(): array { return ['primaryKey'=>'id','columns'=>['id'=>['cast'=>'int'],'user_id'=>['cast'=>'int'],'title'=>['cast'=>'string']]]; }
|
||||
};
|
||||
$postDaoJ = new $PostDao2($conn, $postsT, $pClass, $UserDao2, $usersT, $uClass);
|
||||
$postDao2Class = get_class($PostDao2);
|
||||
$postDao2Class::$table = $postsT;
|
||||
$postDao2Class::$dto = $pClass;
|
||||
$postDao2Class::$userDaoClass = $userDao2Class;
|
||||
|
||||
$postDaoJ = new $postDao2Class($conn);
|
||||
$rows = $postDaoJ->fields('id','title','user.name')->useJoinEager()->with(['user'])->findAllBy([]);
|
||||
$this->assertNotEmpty($rows);
|
||||
$arr = $rows[0]->toArray(false);
|
||||
|
|
|
|||
Loading…
Reference in a new issue