Skip to content

Commit

Permalink
Merge pull request #64 from Temepest74/factory-support
Browse files Browse the repository at this point in the history
Factory support
  • Loading branch information
cjmellor committed Jun 12, 2024
2 parents c56910f + 9de8a99 commit d8f44a5
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 1 deletion.
18 changes: 18 additions & 0 deletions src/Concerns/MustBeApprovedFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Cjmellor\Approval\Concerns;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Model;

trait MustBeApprovedFactory
{
public function withoutApproval(): Factory
{
return $this->afterMaking(function (Model $model) {
if (in_array(MustBeApproved::class, class_uses($model))) {
$model->withoutApproval();
}
});
}
}
22 changes: 22 additions & 0 deletions tests/Feature/Factories/FakeModelFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Cjmellor\Approval\Tests\Feature\Factories;

use Cjmellor\Approval\Concerns\MustBeApprovedFactory;
use Cjmellor\Approval\Tests\Models\FakeModel;
use Illuminate\Database\Eloquent\Factories\Factory;

class FakeModelFactory extends Factory
{
use MustBeApprovedFactory;

protected $model = FakeModel::class;

public function definition(): array
{
return [
'name' => 'Bob',
'meta' => 'green',
];
}
}
35 changes: 35 additions & 0 deletions tests/Feature/MustBeApprovedFactoryTraitTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

use Cjmellor\Approval\Tests\Models\FakeModel;

test(description: 'a model is added via a factory when the "withoutApproval()" method is used ', closure: function () {
FakeModel::factory()->withoutApproval()->create();

$this->assertDatabaseHas('fake_models', [
'name' => 'Bob',
'meta' => 'green',
]);

$this->assertDatabaseMissing('approvals', [
'new_data' => json_encode([
'name' => 'Bob',
]),
]);
});

test(description: 'many models are added via a factory when the "withoutApproval()" method is used ', closure: function () {
FakeModel::factory()->withoutApproval()->count(4)->create();

$this->assertCount(4, FakeModel::all());

FakeModel::all()->each(function ($model) {
$this->assertEquals('Bob', $model->name);
$this->assertEquals('green', $model->meta);
});

$this->assertDatabaseMissing('approvals', [
'new_data' => json_encode([
'name' => 'Bob',
]),
]);
});
10 changes: 9 additions & 1 deletion tests/Models/FakeModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
namespace Cjmellor\Approval\Tests\Models;

use Cjmellor\Approval\Concerns\MustBeApproved;
use Cjmellor\Approval\Tests\Feature\Factories\FakeModelFactory;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class FakeModel extends Model
{
use MustBeApproved;
use MustBeApproved, HasFactory;

/**
* @var array
Expand All @@ -18,4 +21,9 @@ class FakeModel extends Model
* @var bool
*/
public $timestamps = false;

protected static function newFactory(): Factory
{
return FakeModelFactory::new();
}
}

0 comments on commit d8f44a5

Please sign in to comment.