id())->toBe($id) ->and($campaign->code)->toBe($code) ->and($campaign->name)->toBe($name) ->and($campaign->publication)->toBe($publication) ->and($campaign->printAllAtOnce)->toBe($printAllAtOnce) ->and($campaign->coupons)->toBe($coupons) ->and($campaign->brandCode)->toBe($brandCode) ->and($campaign->updatedAt)->toBeNull() ->and($campaign->updatedAt())->toBeNull(); }); it('creates a coupon with an explicit updatedAt date', function () use ( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId, ): void { // GIVEN $id = CampaignId::generate(); $updatedAt = new \DateTimeImmutable('2026-09-22 10:00:00', new \DateTimeZone('UTC')); // WHEN $campaign = Campaign::hydrate( $id, $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId, $updatedAt ); // THEN expect($campaign->updatedAt)->toBe($updatedAt) ->and($campaign->updatedAt())->toBe($updatedAt); }); it('creates a new campaign with a freshly generated id', function () use ( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId, ): void { // GIVEN / WHEN $campaign = Campaign::create( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId ); // THEN expect($campaign->id())->toBeInstanceOf(CampaignId::class) ->and($campaign->code)->toBe($code) ->and($campaign->name)->toBe($name) ->and($campaign->publication)->toBe($publication) ->and($campaign->printAllAtOnce)->toBe($printAllAtOnce) ->and($campaign->coupons)->toBe($coupons) ->and($campaign->brandCode)->toBe($brandCode) ->and($campaign->updatedAt)->toBeNull() ->and($campaign->updatedAt())->toBeNull(); }); it('generates a different id for each created campaign', function () use ( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId, ): void { // GIVEN / WHEN $firstCampaign = Campaign::create( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId ); $secondCampaign = Campaign::create( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId ); // THEN expect($firstCampaign->id()->equals($secondCampaign->id()))->toBeFalse(); }); it('returns the creation date extracted from the id', function () use ( $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId, ): void { // GIVEN $expected = new \DateTimeImmutable('2024-06-15 12:34:56.789000', new \DateTimeZone('UTC')); $id = new CampaignId(Uuid::uuid7($expected)); $campaign = Campaign::hydrate( $id, $code, $name, $publication, $printAllAtOnce, $coupons, $brandCode, $actorId ); // WHEN $result = $campaign->createdAt(); // THEN expect($result->format('Y-m-d H:i:s.v'))->toBe($expected->format('Y-m-d H:i:s.v')); }); it('rejects a campaign with a non-coupon element', function () use ($code, $name, $publication, $printAllAtOnce, $brandCode, $actorId): void { // GIVEN $id = CampaignId::generate(); // WHEN / THEN expect(fn (): Campaign => Campaign::hydrate( $id, $code, $name, $publication, $printAllAtOnce, new CampaignCouponArray(['PC1']), $brandCode, $actorId ))->toThrow(\DomainException::class, 'Coupons must be CampaignCoupon instances.'); }); });