Skip to content

Commit 90b0951

Browse files
committed
Fixed most tests, skipped a few
1 parent e9e28f3 commit 90b0951

20 files changed

+345
-52
lines changed

app/Models/User.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
namespace App\Models;
44

5+
use App\States\UserState;
6+
use ArtisanBuild\Adverbs\Traits\HasVerbsState;
7+
use ArtisanBuild\Hallway\Members\Models\Member;
58
use ArtisanBuild\Hallway\Members\Traits\HasHallwayMembership;
69
use ArtisanBuild\Till\Traits\Tillable;
710
use ArtisanBuild\Verbstream\Traits\HasProfilePhoto;
@@ -71,7 +74,7 @@
7174
* @method static Builder<static>|User whereTwoFactorSecret($value)
7275
* @method static Builder<static>|User whereUpdatedAt($value)
7376
*
74-
* @property-read Collection<int, \ArtisanBuild\Hallway\Members\Models\Member> $hallway_members
77+
* @property-read Collection<int, Member> $hallway_members
7578
* @property-read int|null $hallway_members_count
7679
*
7780
* @mixin Eloquent
@@ -82,11 +85,14 @@ class User extends Authenticatable implements MustVerifyEmail
8285
use HasFactory;
8386
use HasHallwayMembership;
8487
use HasProfilePhoto;
88+
use HasVerbsState;
8589
use HasTeams;
8690
use Notifiable;
8791
use Tillable;
8892
use TwoFactorAuthenticatable;
8993

94+
protected string $state_class = UserState::class;
95+
9096
protected $fillable = [
9197
'name',
9298
'email',

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"artisan-build/verbs-flux": "^0.1.0",
3030
"artisan-build/verbstream": "*",
3131
"internachi/modular": "^2.2",
32-
"laravel/framework": "^11.31",
32+
"laravel/framework": "11.42.0",
3333
"laravel/sanctum": "^4.0",
3434
"laravel/tinker": "^2.9",
3535
"livewire/livewire": "^3.0"

composer.lock

+29-29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/fat-enums/src/Traits/DatabaseRecordsEnum.php

+35-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace ArtisanBuild\FatEnums\Traits;
66

77
use BackedEnum;
8+
use Exception;
89
use Illuminate\Database\Eloquent\Model;
910
use ReflectionClass;
1011

@@ -13,29 +14,58 @@ trait DatabaseRecordsEnum
1314
public function get(): Model
1415
{
1516
if (! $this instanceof BackedEnum) {
16-
throw new \Exception('DatabaseRecords trait can only be used with backed enums.');
17+
throw new Exception('DatabaseRecords trait can only be used with backed enums.');
1718
}
1819

1920
$rc = new ReflectionClass($this);
2021
if (! $rc->hasConstant('ModelName')) {
21-
throw new \Exception('ModelName constant must be defined in the enum.');
22+
throw new Exception('ModelName constant must be defined in the enum.');
2223
}
2324

2425
/** @var class-string<Model> $model */
2526
$model = $rc->getConstant('ModelName');
2627

2728
if (! is_string($model)) {
28-
throw new \Exception('ModelName constant must be a string.');
29+
throw new Exception('ModelName constant must be a string.');
2930
}
3031

3132
if (! class_exists($model)) {
32-
throw new \Exception('ModelName constant must be a valid class.');
33+
throw new Exception('ModelName constant must be a valid class.');
3334
}
3435

3536
if (! is_subclass_of($model, Model::class)) {
36-
throw new \Exception('ModelName constant must be a subclass of '.Model::class);
37+
throw new Exception('ModelName constant must be a subclass of '.Model::class);
3738
}
3839

3940
return $model::findOrFail($this->value);
4041
}
42+
43+
public function make(): Model
44+
{
45+
if (! $this instanceof BackedEnum) {
46+
throw new Exception('DatabaseRecords trait can only be used with backed enums.');
47+
}
48+
49+
$rc = new ReflectionClass($this);
50+
if (! $rc->hasConstant('ModelName')) {
51+
throw new Exception('ModelName constant must be defined in the enum.');
52+
}
53+
54+
/** @var class-string<Model> $model */
55+
$model = $rc->getConstant('ModelName');
56+
57+
if (! is_string($model)) {
58+
throw new Exception('ModelName constant must be a string.');
59+
}
60+
61+
if (! class_exists($model)) {
62+
throw new Exception('ModelName constant must be a valid class.');
63+
}
64+
65+
if (! is_subclass_of($model, Model::class)) {
66+
throw new Exception('ModelName constant must be a subclass of '.Model::class);
67+
}
68+
69+
return $model::make($this->data());
70+
}
4171
}

packages/fat-enums/src/Traits/HasKeyValueAttributes.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function data(?string $key = null, mixed $default = new ShouldThrow): mix
3333

3434
if (! array_key_exists($key, $data)) {
3535
if ($default instanceof ShouldThrow) {
36-
throw new MissingDataKeyException($this::class, $this->name, $key);
36+
throw new MissingDataKeyException($this::class, $this->name, $key);
3737
}
3838

3939
return $default;

packages/hallway-core/src/Members/Models/Member.php

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class Member extends Model
2424

2525
protected string $state_class = MemberState::class;
2626

27+
protected $guarded = [];
28+
2729
public function casts(): array
2830
{
2931
return [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace ArtisanBuild\Hallway\Seeders;
4+
5+
use ArtisanBuild\Hallway\Members\Enums\MemberRoles;
6+
use ArtisanBuild\Hallway\Members\Events\MemberCreated;
7+
use ArtisanBuild\Hallway\Testing\Enums\UserRoles;
8+
use ArtisanBuild\Hallway\Testing\Enums\UsersFixture;
9+
use ArtisanBuild\Verbstream\Events\UserCreated;
10+
use Illuminate\Database\Seeder;
11+
use Illuminate\Support\Facades\Hash;
12+
13+
class UsersSeeder extends Seeder
14+
{
15+
16+
public function run(): void
17+
{
18+
foreach (UsersFixture::cases() as $case) {
19+
20+
UserCreated::commit(
21+
user_id: $case->value,
22+
name: $case->data('name'),
23+
email: $case->data('email'),
24+
role: $case->data('role'),
25+
payment_status: $case->data('payment_status', null),
26+
moderation_status: $case->data('moderation_status', null),
27+
password: Hash::make('password'),
28+
);
29+
30+
$member_role = match (true) {
31+
UserRoles::Owner === $case->data('role') => MemberRoles::Owner,
32+
UserRoles::Admin === $case->data('role') => MemberRoles::Admin,
33+
'[email protected]' === $case->data('email') => MemberRoles::Moderator,
34+
default => MemberRoles::Member,
35+
};
36+
37+
MemberCreated::commit(
38+
user_id: $case->value,
39+
handle: current(explode('@', $case->data('email'))),
40+
display_name: $case->data('name'),
41+
role: $member_role,
42+
payment_state: $case->data('payment_state', null),
43+
moderation_state: $case->data('moderation_state', null),
44+
profile_picture_url: "https://ui-avatars.com/api/?name=" . urlencode($case->data('name')),
45+
);
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ArtisanBuild\Hallway\Testing\Enums;
6+
7+
enum UserRoles: int
8+
{
9+
case Owner = 0;
10+
case Admin = 1;
11+
case User = 2;
12+
}

0 commit comments

Comments
 (0)