From c4b682a00d25a6f1969a2ec9ac6c6b9135fddd02 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 28 Jun 2026 22:24:37 +0900 Subject: [PATCH 1/4] test: add unit tests for SubscriptionFactory --- .../User/Factory/SubscriptionFactoryTest.php | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/tests/Unit/Packages/Domains/User/Factory/SubscriptionFactoryTest.php diff --git a/src/tests/Unit/Packages/Domains/User/Factory/SubscriptionFactoryTest.php b/src/tests/Unit/Packages/Domains/User/Factory/SubscriptionFactoryTest.php new file mode 100644 index 0000000..291c018 --- /dev/null +++ b/src/tests/Unit/Packages/Domains/User/Factory/SubscriptionFactoryTest.php @@ -0,0 +1,70 @@ + 'free', + 'expires_at' => null, + ]); + + $this->assertInstanceOf(Subscription::class, $subscription); + $this->assertTrue($subscription->isFree()); + } + + public function test_build_returns_premium_subscription_with_string_expires_at(): void + { + $subscription = SubscriptionFactory::build([ + 'tier' => 'premium', + 'expires_at' => '2027-01-01 00:00:00', + ]); + + $this->assertInstanceOf(Subscription::class, $subscription); + $this->assertFalse($subscription->isFree()); + $this->assertTrue($subscription->isActive(new DateTimeImmutable('2026-01-01'))); + } + + public function test_build_accepts_datetime_immutable_for_expires_at(): void + { + $expiresAt = new DateTimeImmutable('2027-06-01'); + + $subscription = SubscriptionFactory::build([ + 'tier' => 'premium', + 'expires_at' => $expiresAt, + ]); + + $this->assertInstanceOf(Subscription::class, $subscription); + $this->assertTrue($subscription->isActive(new DateTimeImmutable('2026-01-01'))); + } + + public function test_build_accepts_string_for_now(): void + { + $subscription = SubscriptionFactory::build([ + 'tier' => 'premium', + 'expires_at' => '2025-01-01 00:00:00', + 'now' => '2026-01-01 00:00:00', + ]); + + $this->assertTrue($subscription->isExpired()); + } + + public function test_build_accepts_datetime_immutable_for_now(): void + { + $subscription = SubscriptionFactory::build([ + 'tier' => 'premium', + 'expires_at' => '2025-01-01 00:00:00', + 'now' => new DateTimeImmutable('2026-01-01'), + ]); + + $this->assertTrue($subscription->isExpired()); + } +} \ No newline at end of file From d3721f198ea3d84b75969f4d8cd6de0a48828ebf Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 28 Jun 2026 22:24:55 +0900 Subject: [PATCH 2/4] test: add unit tests for UserEntityFactory --- .../User/Factory/UserEntityFactoryTest.php | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/tests/Unit/Packages/Domains/User/Factory/UserEntityFactoryTest.php diff --git a/src/tests/Unit/Packages/Domains/User/Factory/UserEntityFactoryTest.php b/src/tests/Unit/Packages/Domains/User/Factory/UserEntityFactoryTest.php new file mode 100644 index 0000000..e7f27ff --- /dev/null +++ b/src/tests/Unit/Packages/Domains/User/Factory/UserEntityFactoryTest.php @@ -0,0 +1,54 @@ + $faker->unique()->randomNumber(5), + 'first_name' => $faker->firstName(), + 'last_name' => $faker->lastName(), + 'email' => $faker->unique()->safeEmail(), + 'age_range' => 'teens', + 'subscription_tier' => 'free', + 'subscription_expires_at' => null, + ]; + + $entity = UserEntityFactory::build($data); + + $this->assertInstanceOf(UserEntity::class, $entity); + $this->assertSame($data['id'], $entity->getId()); + $this->assertSame($data['first_name'], $entity->getFirstName()); + $this->assertSame($data['last_name'], $entity->getLastName()); + $this->assertSame($data['email'], $entity->getEmail()); + $this->assertSame(AgeRange::Teens, $entity->getAgeRange()); + $this->assertTrue($entity->getSubscription()->isFree()); + } + + public function test_build_passes_expires_at_to_subscription(): void + { + $faker = FakerFactory::create(); + + $entity = UserEntityFactory::build([ + 'id' => $faker->unique()->randomNumber(5), + 'first_name' => $faker->firstName(), + 'last_name' => $faker->lastName(), + 'email' => $faker->unique()->safeEmail(), + 'age_range' => '20s', + 'subscription_tier' => 'premium', + 'subscription_expires_at' => '2027-01-01 00:00:00', + ]); + + $this->assertFalse($entity->getSubscription()->isFree()); + } +} \ No newline at end of file From f18131070fe88b904c80764fe785ad051a7229a6 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 28 Jun 2026 22:25:03 +0900 Subject: [PATCH 3/4] test: add unit tests for UserEntity getters including getFullName --- .../Packages/Domains/User/UserEntityTest.php | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/tests/Unit/Packages/Domains/User/UserEntityTest.php diff --git a/src/tests/Unit/Packages/Domains/User/UserEntityTest.php b/src/tests/Unit/Packages/Domains/User/UserEntityTest.php new file mode 100644 index 0000000..ca1c121 --- /dev/null +++ b/src/tests/Unit/Packages/Domains/User/UserEntityTest.php @@ -0,0 +1,72 @@ +unique()->randomNumber(5), + $overrides['first_name'] ?? $faker->firstName(), + $overrides['last_name'] ?? $faker->lastName(), + $overrides['email'] ?? $faker->unique()->safeEmail(), + $overrides['age_range'] ?? AgeRange::Twenties, + $overrides['subscription'] ?? $subscription, + ); + } + + public function test_getId_returns_correct_value(): void + { + $entity = $this->buildEntity(['id' => 42]); + $this->assertSame(42, $entity->getId()); + } + + public function test_getFirstName_returns_correct_value(): void + { + $entity = $this->buildEntity(['first_name' => 'John']); + $this->assertSame('John', $entity->getFirstName()); + } + + public function test_getLastName_returns_correct_value(): void + { + $entity = $this->buildEntity(['last_name' => 'Doe']); + $this->assertSame('Doe', $entity->getLastName()); + } + + public function test_getFullName_concatenates_first_and_last_name(): void + { + $entity = $this->buildEntity(['first_name' => 'John', 'last_name' => 'Doe']); + $this->assertSame('John Doe', $entity->getFullName()); + } + + public function test_getEmail_returns_correct_value(): void + { + $entity = $this->buildEntity(['email' => 'john@example.com']); + $this->assertSame('john@example.com', $entity->getEmail()); + } + + public function test_getAgeRange_returns_correct_enum(): void + { + $entity = $this->buildEntity(['age_range' => AgeRange::Thirties]); + $this->assertSame(AgeRange::Thirties, $entity->getAgeRange()); + } + + public function test_getSubscription_returns_subscription_instance(): void + { + $subscription = new Subscription(SubscriptionTier::Premium, null); + $entity = $this->buildEntity(['subscription' => $subscription]); + $this->assertSame($subscription, $entity->getSubscription()); + } +} \ No newline at end of file From a77ced6f675bf2a9e06afa7daca07ada0fac43c4 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 28 Jun 2026 22:25:17 +0900 Subject: [PATCH 4/4] test: add unit test for UserViewModelFactory --- .../ViewModel/UserViewModelFactoryTest.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/tests/Unit/Packages/Features/CommandUseCases/Factory/ViewModel/UserViewModelFactoryTest.php diff --git a/src/tests/Unit/Packages/Features/CommandUseCases/Factory/ViewModel/UserViewModelFactoryTest.php b/src/tests/Unit/Packages/Features/CommandUseCases/Factory/ViewModel/UserViewModelFactoryTest.php new file mode 100644 index 0000000..4d2763c --- /dev/null +++ b/src/tests/Unit/Packages/Features/CommandUseCases/Factory/ViewModel/UserViewModelFactoryTest.php @@ -0,0 +1,31 @@ +unique()->randomNumber(5), + firstName: $faker->firstName(), + lastName: $faker->lastName(), + email: $faker->unique()->safeEmail(), + ageRange: 'free', + subscriptionTier: 'free', + subscriptionExpiresAt: null, + ); + + $viewModel = UserViewModelFactory::build($dto); + + $this->assertInstanceOf(UserViewModel::class, $viewModel); + } +} \ No newline at end of file