ldc-mesbr-app/tests/Fixtures/Campaign/CampaignFactory.php

103 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Fixtures\Campaign;
use Domain\Models\Entities\Campaign;
use Domain\Models\ValueObjects\Actor\ActorId;
use Domain\Models\ValueObjects\Brand\BrandCode;
use Domain\Models\ValueObjects\Campaign\CampaignCode;
use Domain\Models\ValueObjects\Campaign\CampaignCoupon;
use Domain\Models\ValueObjects\Campaign\CampaignCouponArray;
use Domain\Models\ValueObjects\Campaign\CampaignId;
use Domain\Models\ValueObjects\Campaign\CampaignName;
use Domain\Models\ValueObjects\Coupon\CouponCode;
use Domain\Models\ValueObjects\PrintRules;
final class CampaignFactory
{
/**
* Campagne "neuve" (id, code générés, updatedAt = null), publiée par défaut.
*
* @param list<string|CouponCode>|null $couponCodes ignoré si $coupons est fourni
* @param list<CampaignCoupon>|null $coupons prioritaire sur $couponCodes
*/
public static function make(
string $name = 'Campaign name',
bool $printAllAtOnce = false,
?array $couponCodes = null,
?array $coupons = null,
?PrintRules $printRules = null,
string $brandCode = 'AAA01',
?ActorId $actorId = null,
): Campaign {
return Campaign::create(
name: new CampaignName($name),
printAllAtOnce: $printAllAtOnce,
coupons: self::coupons($coupons, $couponCodes, $printRules),
brandCode: new BrandCode($brandCode),
actorId: $actorId ?? ActorId::generate(),
);
}
/**
* Campagne reconstruite comme depuis la base : permet de fixer id, code et updatedAt.
* Nécessite que hydrate() accepte $updatedAt en dernier paramètre.
*
* @param list<string|CouponCode>|null $couponCodes
* @param list<CampaignCoupon>|null $coupons
*/
public static function hydrated(
?CampaignId $id = null,
?CampaignCode $code = null,
bool $published = true,
string $name = 'Campaign name',
bool $printAllAtOnce = false,
?array $couponCodes = null,
?array $coupons = null,
?PrintRules $printRules = null,
string $brandCode = 'AAA01',
?ActorId $actorId = null,
): Campaign {
return Campaign::hydrate(
id: $id ?? CampaignId::generate(),
code: $code ?? CampaignCode::generate(),
name: new CampaignName($name),
publication: $published,
printAllAtOnce: $printAllAtOnce,
coupons: self::coupons($coupons, $couponCodes, $printRules),
brandCode: new BrandCode($brandCode),
actorId: $actorId ?? ActorId::generate(),
);
}
public static function published(string ...$couponCodes): Campaign
{
return self::hydrated(published: true, couponCodes: $couponCodes ?: null);
}
public static function unpublished(string ...$couponCodes): Campaign
{
return self::hydrated(published: false, couponCodes: $couponCodes ?: null);
}
/**
* @param list<CampaignCoupon>|null $coupons
* @param list<string|CouponCode>|null $couponCodes
*/
private static function coupons(?array $coupons, ?array $couponCodes, ?PrintRules $printRules): CampaignCouponArray
{
if ($coupons !== null) {
return new CampaignCouponArray($coupons);
}
return new CampaignCouponArray(array_map(
static fn (string | CouponCode $code): CampaignCoupon => new CampaignCoupon(
$code instanceof CouponCode ? $code : CouponCode::generate(),
$printRules,
),
$couponCodes ?? [CouponCode::generate()],
));
}
}