Skip to content

Commit

Permalink
assert nested transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed Jan 11, 2022
1 parent 1a96086 commit d48a037
Showing 1 changed file with 47 additions and 18 deletions.
65 changes: 47 additions & 18 deletions tests/ModelNestedTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,48 @@ protected function createTestModel(): Model
/** @var string */
protected $testModelAlias;

/**
* @param mixed $v
*
* @return mixed
*/
protected function convertValueToLog($v)
{
if (is_array($v)) {
return array_map(fn ($v) => $this->convertValueToLog($v), $v);
} elseif (is_scalar($v) || $v === null) {
return $v;
} elseif ($v instanceof self) {
return $this->testModelAlias;
}

$res = preg_replace('~(?<=^Atk4\\\\Data\\\\Persistence\\\\Sql\\\\)\w+\\\\(?=\w+$)~', '', get_debug_type($v));
if (Connection::isComposerDbal2x() && $res === 'Doctrine\DBAL\Statement') {
$res = DbalResult::class;
}

return $res;
}

public function hook(string $spot, array $args = [], HookBreaker &$brokenBy = null)
{
if (!str_starts_with($spot, '__atk__method__') && $spot !== Model::HOOK_NORMALIZE) {
$convertValueToLogFx = function ($v) use (&$convertValueToLogFx) {
if (is_array($v)) {
return array_map($convertValueToLogFx, $v);
} elseif (is_scalar($v) || $v === null) {
return $v;
} elseif ($v instanceof self) {
return $this->testModelAlias;
}

$res = preg_replace('~(?<=^Atk4\\\\Data\\\\Persistence\\\\Sql\\\\)\w+\\\\(?=\w+$)~', '', get_debug_type($v));
if (Connection::isComposerDbal2x() && $res === 'Doctrine\DBAL\Statement') {
$res = DbalResult::class;
}

return $res;
};

$this->testCaseWeakRef->get()->hookLog[] = [$convertValueToLogFx($this), $spot, $convertValueToLogFx($args)];
$this->testCaseWeakRef->get()->hookLog[] = [$this->convertValueToLog($this), $spot, $this->convertValueToLog($args)];
}

return parent::hook($spot, $args, $brokenBy);
}

public function atomic(\Closure $fx)
{
$this->testCaseWeakRef->get()->hookLog[] = [$this->convertValueToLog($this), '>>>'];

$res = parent::atomic($fx);

$this->testCaseWeakRef->get()->hookLog[] = [$this->convertValueToLog($this), '<<<'];

return $res;
}
});

$mInner = new $mWithLoggingClass($this->db, [
Expand Down Expand Up @@ -146,16 +163,19 @@ public function testInsert(): void
])->save();

$this->assertSame([
['main', '>>>'],
['main', Model::HOOK_VALIDATE, ['save']],
['main', Model::HOOK_BEFORE_SAVE, [false]],
['main', Model::HOOK_BEFORE_INSERT, [['name' => 'Karl', 'birthday' => \DateTime::class]]],
['inner', '>>>'],
['inner', Model::HOOK_VALIDATE, ['save']],
['inner', Model::HOOK_BEFORE_SAVE, [false]],
['inner', Model::HOOK_BEFORE_INSERT, [['uid' => null, 'name' => 'Karl', 'y' => \DateTime::class]]],
['inner', Persistence\Sql::HOOK_BEFORE_INSERT_QUERY, [Query::class]],
['inner', Persistence\Sql::HOOK_AFTER_INSERT_QUERY, [Query::class, DbalResult::class]],
['inner', Model::HOOK_AFTER_INSERT, []],
['inner', Model::HOOK_AFTER_SAVE, [false]],
['inner', '<<<'],
['main', Model::HOOK_AFTER_INSERT, []],
['main', Model::HOOK_BEFORE_UNLOAD, []],
['main', Model::HOOK_AFTER_UNLOAD, []],
Expand All @@ -164,6 +184,7 @@ public function testInsert(): void
['main', Persistence\Sql::HOOK_INIT_SELECT_QUERY, [Query::class, 'select']],
['main', Model::HOOK_AFTER_LOAD, []],
['main', Model::HOOK_AFTER_SAVE, [false]],
['main', '<<<'],
], $this->hookLog);

$this->assertSame(3, $m->table->loadBy('name', 'Karl')->getId());
Expand Down Expand Up @@ -191,21 +212,25 @@ public function testUpdate(): void
['main', Persistence\Sql::HOOK_INIT_SELECT_QUERY, [Query::class, 'select']],
['main', Model::HOOK_AFTER_LOAD, []],

['main', '>>>'],
['main', Model::HOOK_VALIDATE, ['save']],
['main', Model::HOOK_BEFORE_SAVE, [true]],
['main', Model::HOOK_BEFORE_UPDATE, [['name' => 'Susan']]],
['inner', Model::HOOK_BEFORE_LOAD, [null]],
['inner', Persistence\Sql::HOOK_INIT_SELECT_QUERY, [Query::class, 'select']],
['inner', Model::HOOK_AFTER_LOAD, []],
['inner', '>>>'],
['inner', Model::HOOK_VALIDATE, ['save']],
['inner', Model::HOOK_BEFORE_SAVE, [true]],
['inner', Model::HOOK_BEFORE_UPDATE, [['name' => 'Susan']]],
['inner', Persistence\Sql::HOOK_BEFORE_UPDATE_QUERY, [Query::class]],
['inner', Persistence\Sql::HOOK_AFTER_UPDATE_QUERY, [Query::class, DbalResult::class]],
['inner', Model::HOOK_AFTER_UPDATE, [['name' => 'Susan']]],
['inner', Model::HOOK_AFTER_SAVE, [true]],
['inner', '<<<'],
['main', Model::HOOK_AFTER_UPDATE, [['name' => 'Susan']]],
['main', Model::HOOK_AFTER_SAVE, [true]],
['main', '<<<'],
], $this->hookLog);

$this->assertSameExportUnordered([
Expand All @@ -226,17 +251,21 @@ public function testDelete(): void
['main', Persistence\Sql::HOOK_INIT_SELECT_QUERY, [Query::class, 'select']],
['main', Model::HOOK_AFTER_LOAD, []],

['main', '>>>'],
['main', Model::HOOK_BEFORE_DELETE, []],
['inner', Model::HOOK_BEFORE_LOAD, [null]],
['inner', Persistence\Sql::HOOK_INIT_SELECT_QUERY, [Query::class, 'select']],
['inner', Model::HOOK_AFTER_LOAD, []],
['inner', '>>>'],
['inner', Model::HOOK_BEFORE_DELETE, []],
['inner', Persistence\Sql::HOOK_BEFORE_DELETE_QUERY, [Query::class]],
['inner', Persistence\Sql::HOOK_AFTER_DELETE_QUERY, [Query::class, DbalResult::class]],
['inner', Model::HOOK_AFTER_DELETE, []],
['inner', '<<<'],
['inner', Model::HOOK_BEFORE_UNLOAD, []],
['inner', Model::HOOK_AFTER_UNLOAD, []],
['main', Model::HOOK_AFTER_DELETE, []],
['main', '<<<'],
['main', Model::HOOK_BEFORE_UNLOAD, []],
['main', Model::HOOK_AFTER_UNLOAD, []],
], $this->hookLog);
Expand Down

0 comments on commit d48a037

Please sign in to comment.