Skip to content

Commit cb95bad

Browse files
committed
Setup model factory and their tests
1 parent 1058a4c commit cb95bad

File tree

7 files changed

+224
-22
lines changed

7 files changed

+224
-22
lines changed

database/migrations/2023_08_04_200132_create_door_access_codes_table.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,17 @@
1111
*/
1212
public function up(): void
1313
{
14-
Schema::create('door_access_codes', function (Blueprint $table) {
15-
$table->id();
16-
$table->string('code')->unique();
17-
$table->string('team_member_id')->nullable();
14+
Schema::connection(config('door-access.connection'))->create('access_codes', function (Blueprint $table) {
15+
$table->bigIncrements('id');
16+
$table->string('code')->unique()->when(
17+
Schema::getConnection()->getConfig('driver') === 'mysql',
18+
function (Blueprint $column) {
19+
$column->collation('utf8mb4_bin');
20+
}
21+
);
22+
$table->string('owner_id')->nullable();
23+
$table->timestamp('allocated_at')->nullable();
24+
$table->timestamp('reset_at')->nullable();
1825
$table->timestamps();
1926
});
2027
}
@@ -24,6 +31,6 @@ public function up(): void
2431
*/
2532
public function down(): void
2633
{
27-
Schema::dropIfExists('door_access_codes');
34+
Schema::connection(config('door-access.connection'))->dropIfExists('access_codes');
2835
}
2936
};

src/Models/AccessCode.php

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Veeqtoh\DoorAccess\Models;
6+
7+
use Carbon\Carbon;
8+
use Illuminate\Database\Eloquent\Collection;
9+
use Illuminate\Database\Eloquent\Factories\Factory;
10+
use Illuminate\Database\Eloquent\Factories\HasFactory;
11+
use Illuminate\Database\Eloquent\Model;
12+
13+
/**
14+
* @property int $id
15+
* @property string $owner_id
16+
* @property ?Carbon $allocated_at
17+
* @property ?Carbon $reset_at
18+
* @property Carbon $created_at
19+
* @property Carbon $updated_at
20+
*/
21+
class AccessCode extends Model
22+
{
23+
use HasFactory;
24+
25+
/**
26+
* The table associated with the model.
27+
*
28+
* @var string
29+
*/
30+
protected $table = 'access_codes';
31+
32+
/**
33+
* The attributes that are mass assignable.
34+
*
35+
* @var array<int,string>
36+
*/
37+
protected $fillable = [
38+
'owner_id',
39+
'allocated_at',
40+
'reset_at',
41+
];
42+
43+
/**
44+
* The attributes that should be cast to native types.
45+
*
46+
* @var array<string, string>
47+
*/
48+
protected $casts = [
49+
'allocated_at' => 'datetime',
50+
'reset_at' => 'datetime',
51+
];
52+
53+
public function __construct(array $attributes = [])
54+
{
55+
parent::__construct($attributes);
56+
57+
if (config('door-access.connection')) {
58+
$this->setConnection(config('door-access.connection'));
59+
}
60+
}
61+
62+
/**
63+
* @return Factory<AccessCode>
64+
*/
65+
protected static function newFactory()
66+
{
67+
$factoryConfig = config('door-access.factories');
68+
69+
$modelFactory = app($factoryConfig[__CLASS__]);
70+
71+
return $modelFactory::new();
72+
}
73+
74+
/**
75+
* A helper method that can be used for finding a AccessCode model with the
76+
* given code key.
77+
*/
78+
public static function findByCode(string $code): ?self
79+
{
80+
return self::where('code', $code)->first();
81+
}
82+
83+
/**
84+
* A helper method that can be used for finding all the AccessCode models
85+
* with the given owner id.
86+
*
87+
* @return Collection<int, AccessCode>
88+
*/
89+
public static function findByOwnerId(string $ownerId): Collection
90+
{
91+
return self::where('owner_id', $ownerId)->get();
92+
}
93+
}

src/Models/Factories/AccessCode.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/Models/Factories/AccessCodeFactory.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Veeqtoh\DoorAccess\Models\Factories;
66

77
use Illuminate\Database\Eloquent\Factories\Factory;
8+
use Veeqtoh\DoorAccess\Classes\CodeGenerator;
89
use Veeqtoh\DoorAccess\Models\AccessCode;
910

1011
/**
@@ -14,8 +15,37 @@ class AccessCodeFactory extends Factory
1415
{
1516
protected $model = AccessCode::class;
1617

17-
public function definition()
18+
public function definition(): array
1819
{
20+
$generator = new CodeGenerator();
21+
$code = $generator->generate();
22+
23+
return [
24+
'code' => $code,
25+
'owner_id' => $this->faker->randomDigit(),
26+
'allocated_at' => now(),
27+
'reset_at' => null,
28+
'created_at' => now(),
29+
'updated_at' => now(),
30+
];
31+
}
32+
33+
public function deactivated(): AccessCodeFactory
34+
{
35+
return $this->state(function () {
36+
return [
37+
'reset_at' => now()->subDay(),
38+
];
39+
});
1940
}
2041

42+
public function inactive(): AccessCodeFactory
43+
{
44+
return $this->state(function () {
45+
return [
46+
'allocated_at' => null,
47+
'reset_at' => null,
48+
];
49+
});
50+
}
2151
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Veeqtoh\DoorAccess\Tests\Unit\Models\AccessCode;
4+
5+
use Veeqtoh\DoorAccess\Models\AccessCode;
6+
use Veeqtoh\DoorAccess\Tests\Unit\TestCase;
7+
8+
final class AccessCodeFactoryTest extends TestCase
9+
{
10+
public function test_that_the_access_code_model_factory_works_fine(): void
11+
{
12+
$accessCode = AccessCode::factory()->create();
13+
14+
$deactivatedAccessCode = AccessCode::factory()->deactivated()->create();
15+
16+
$inactiveAccessCode = AccessCode::factory()->inactive()->create();
17+
18+
$this->assertDatabaseCount('access_codes', 3)
19+
->assertModelExists($accessCode)
20+
->assertModelExists($deactivatedAccessCode)
21+
->assertModelExists($inactiveAccessCode);
22+
23+
$this->assertTrue($accessCode->allocated_at !== null && $accessCode->reset_at == null);
24+
$this->assertTrue($deactivatedAccessCode->allocated_at !== null && $deactivatedAccessCode->reset_at !== null);
25+
$this->assertTrue($inactiveAccessCode->allocated_at == null && $inactiveAccessCode->reset_at == null);
26+
}
27+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Veeqtoh\DoorAccess\Tests\Unit\Models\AccessCode;
6+
7+
use PHPUnit\Framework\Attributes\Test;
8+
use Veeqtoh\DoorAccess\Models\AccessCode;
9+
use Veeqtoh\DoorAccess\Tests\Unit\TestCase;
10+
11+
final class AccessCodeTest extends TestCase
12+
{
13+
#[Test]
14+
public function connection_can_be_overridden(): void
15+
{
16+
config(['door-access.connection' => 'custom']);
17+
18+
$this->assertEquals(
19+
'custom',
20+
(new AccessCode())->getConnectionName(),
21+
);
22+
}
23+
24+
#[Test]
25+
public function default_connection_is_used_if_the_override_is_not_set(): void
26+
{
27+
$this->assertNull((new AccessCode())->getConnectionName());
28+
}
29+
}

tests/Unit/Models/CastsTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Veeqtoh\DoorAccess\Tests\Unit\Models\AccessCode;
6+
7+
use Carbon\Carbon;
8+
use PHPUnit\Framework\Attributes\Test;
9+
use Veeqtoh\DoorAccess\Models\AccessCode;
10+
use Veeqtoh\DoorAccess\Tests\Unit\TestCase;
11+
12+
final class CastsTest extends TestCase
13+
{
14+
#[Test]
15+
public function carbon_date_objects_are_returned(): void
16+
{
17+
$accessCode = AccessCode::factory()
18+
->create([
19+
'allocated_at' => now(),
20+
'reset_at' => now(),
21+
'created_at' => now(),
22+
'updated_at' => now(),
23+
]);
24+
25+
$accessCode->refresh();
26+
27+
$this->assertInstanceOf(Carbon::class, $accessCode->allocated_at);
28+
$this->assertInstanceOf(Carbon::class, $accessCode->reset_at);
29+
$this->assertInstanceOf(Carbon::class, $accessCode->created_at);
30+
$this->assertInstanceOf(Carbon::class, $accessCode->updated_at);
31+
}
32+
}

0 commit comments

Comments
 (0)