2FAuth/tests/ModelTestCase.php

132 lines
4.7 KiB
PHP

<?php
namespace Tests;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
// https://github.com/framgia/laravel-test-examples/blob/master/tests/ModelTestCase.php
abstract class ModelTestCase extends TestCase
{
/**
* @param array $fillable
* @param array $guarded
* @param array $hidden
* @param array $visible
* @param array $casts
* @param array $dates
* @param string $collectionClass
* @param null $table
* @param string $primaryKey
* @param bool $incrementing
*
* - `$fillable` -> `getFillable()`
* - `$guarded` -> `getGuarded()`
* - `$table` -> `getTable()`
* - `$primaryKey` -> `getKeyName()`
* - `$hidden` -> `getHidden()`
* - `$visible` -> `getVisible()`
* - `$casts` -> `getCasts()`: note that method appends incrementing key.
* - `$dates` -> `getDates()`: note that method appends `[static::CREATED_AT, static::UPDATED_AT]`.
* - `newCollection()`: assert collection is exact type. Use `assertEquals` on `get_class()` result, but not `assertInstanceOf`.
*/
protected function runConfigurationAssertions(
Model $model,
$fillable = [],
$hidden = [],
$guarded = ['*'],
$visible = [],
$casts = ['id' => 'int'],
$dispatchesEvents = [],
$dates = ['created_at', 'updated_at'],
$collectionClass = Collection::class,
$table = null,
$primaryKey = 'id',
$incrementing = true)
{
$this->assertEquals($fillable, $model->getFillable());
$this->assertEquals($guarded, $model->getGuarded());
$this->assertEquals($hidden, $model->getHidden());
$this->assertEquals($visible, $model->getVisible());
$this->assertEquals($casts, $model->getCasts());
$this->assertEquals($dates, $model->getDates());
$this->assertEquals($primaryKey, $model->getKeyName());
$this->assertEquals($incrementing, $model->getIncrementing());
$eventDispatcher = $model->getEventDispatcher();
foreach ($dispatchesEvents as $eventName => $eventclass) {
$this->assertTrue($eventDispatcher->hasListeners($eventclass));
}
$c = $model->newCollection();
$this->assertEquals($collectionClass, get_class($c));
$this->assertInstanceOf(Collection::class, $c);
if ($table !== null) {
$this->assertEquals($table, $model->getTable());
}
}
/**
* @param HasMany $relation
* @param string $key
* @param string $parent
* @param \Closure $queryCheck
*
* - `getQuery()`: assert query has not been modified or modified properly.
* - `getForeignKey()`: any `HasOneOrMany` or `BelongsTo` relation, but key type differs (see documentaiton).
* - `getQualifiedParentKeyName()`: in case of `HasOneOrMany` relation, there is no `getLocalKey()` method, so this one should be asserted.
*/
protected function assertHasManyRelation($relation, Model $model, Model $related, $key = null, $parent = null, ?\Closure $queryCheck = null)
{
$this->assertInstanceOf(HasMany::class, $relation);
if (! is_null($queryCheck)) {
$queryCheck->bindTo($this);
$queryCheck($relation->getQuery(), $model, $relation);
}
if (is_null($key)) {
$key = $model->getForeignKey();
}
$this->assertEquals($key, $relation->getForeignKeyName());
if (is_null($parent)) {
$parent = $model->getKeyName();
}
$this->assertEquals($model->getTable() . '.' . $parent, $relation->getQualifiedParentKeyName());
}
/**
* @param BelongsTo $relation
* @param string $key
* @param string $owner
* @param \Closure $queryCheck
*
* - `getQuery()`: assert query has not been modified or modified properly.
* - `getForeignKey()`: any `HasOneOrMany` or `BelongsTo` relation, but key type differs (see documentaiton).
* - `getOwnerKey()`: `BelongsTo` relation and its extendings.
*/
protected function assertBelongsToRelation($relation, Model $model, Model $related, $key, $owner = null, ?\Closure $queryCheck = null)
{
$this->assertInstanceOf(BelongsTo::class, $relation);
if (! is_null($queryCheck)) {
$queryCheck->bindTo($this);
$queryCheck($relation->getQuery(), $model, $relation);
}
$this->assertEquals($key, $relation->getForeignKey());
if (is_null($owner)) {
$owner = $related->getKeyName();
}
$this->assertEquals($owner, $relation->getOwnerKey());
}
}