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 5155ff4
Showing 1 changed file with 45 additions and 18 deletions.
63 changes: 45 additions & 18 deletions tests/ModelNestedTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,46 @@ protected function createTestModel(): Model
/** @var string */
protected $testModelAlias;

/**
* @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 +161,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 +182,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 +210,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 +249,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 5155ff4

Please sign in to comment.