feat: fix seeder
CI / 🧪 Tests Laravel (push) Failing after 8m41s
CI / 🐳 Build & Push Images (push) Has been skipped

This commit is contained in:
2026-08-17 16:48:27 +02:00
parent 2d794ff0c9
commit 411bdce002
2 changed files with 81 additions and 7 deletions
+78 -7
View File
@@ -7,14 +7,14 @@ use App\Enums\FollowStatus;
use App\Enums\IngredientUnit; use App\Enums\IngredientUnit;
use App\Enums\MealPostType; use App\Enums\MealPostType;
use App\Enums\MealPostVisibility; use App\Enums\MealPostVisibility;
use App\Enums\NutritionPlanSource;
use App\Enums\PacePreference; use App\Enums\PacePreference;
use App\Enums\PhysicalActivityLevel; use App\Enums\PhysicalActivityLevel;
use App\Enums\UserRole;
use App\Enums\UserSex; use App\Enums\UserSex;
use App\Enums\WeightGoal; use App\Enums\WeightGoal;
use App\Enums\WorkoutSource; use App\Enums\WorkoutSource;
use App\Models\User; use App\Models\User;
use App\Models\WeightEntry;
use App\Models\WorkoutSessions;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -112,19 +112,90 @@ class DemoContentSeeder extends Seeder
'bio' => 'Des repas adaptés aux longues sorties et à la récupération.', 'bio' => 'Des repas adaptés aux longues sorties et à la récupération.',
], ],
])->map( ])->map(
fn (array $profile): User => User::factory()->create($profile) fn (array $profile): User => $this->createUser($profile)
); );
User::factory()->withoutNutritionOnboarding()->create([ $this->createUser([
'name' => 'Nouveau profil', 'name' => 'Nouveau profil',
'email' => 'onboarding@example.com', 'email' => 'onboarding@example.com',
'locale' => 'fr', 'locale' => 'fr',
'terms_accepted_at' => now(), 'terms_accepted_at' => now(),
]); ], withNutritionOnboarding: false);
return $users; return $users;
} }
/**
* @param array<string, mixed> $profile
*/
private function createUser(array $profile, bool $withNutritionOnboarding = true): User
{
$onboardingAttributes = $withNutritionOnboarding
? [
'height' => 175,
'target_weight' => 70,
'date_of_birth' => '1990-01-01',
'sex' => UserSex::MAN,
'physical_activity_level' => PhysicalActivityLevel::MODERATELY_ACTIVE,
'weight_goal' => WeightGoal::MAINTAIN_WEIGHT,
'pace_preference' => PacePreference::NORMAL,
'onboarding_completed_at' => now(),
'nutrition_estimate_accepted_at' => now(),
]
: [
'height' => null,
'target_weight' => null,
'date_of_birth' => null,
'sex' => null,
'physical_activity_level' => null,
'weight_goal' => null,
'pace_preference' => null,
'onboarding_completed_at' => null,
'nutrition_estimate_accepted_at' => null,
];
$user = User::query()->create([
'locale' => 'en',
'role' => UserRole::USER,
'email_verified_at' => now(),
'password' => 'password',
'avatar_url' => null,
...$onboardingAttributes,
...$profile,
]);
if ($withNutritionOnboarding) {
$this->createNutritionOnboarding($user);
}
return $user;
}
private function createNutritionOnboarding(User $user): void
{
$user->weightEntries()->create([
'weight_kg' => 70,
'measured_at' => now(),
]);
$user->nutritionPlans()->create([
'source' => NutritionPlanSource::ONBOARDING,
'formula_version' => 'mifflin_st_jeor_v1',
'calories' => 2200,
'proteins' => 112,
'carbs' => 286,
'fats' => 61,
'resting_metabolism' => 1650,
'maintenance_calories' => 2200,
'calorie_adjustment_percent' => 0,
'calculation_details' => [
'activityFactor' => 1.55,
'inputWeightKg' => 70,
],
'effective_from' => now(),
]);
}
/** /**
* @param Collection<int, User> $users * @param Collection<int, User> $users
*/ */
@@ -239,7 +310,7 @@ class DemoContentSeeder extends Seeder
$demoUser->weightEntries()->delete(); $demoUser->weightEntries()->delete();
foreach (range(11, 0) as $weeksAgo) { foreach (range(11, 0) as $weeksAgo) {
WeightEntry::factory()->for($demoUser)->create([ $demoUser->weightEntries()->create([
'weight_kg' => round(74.8 - ((11 - $weeksAgo) * 0.28), 2), 'weight_kg' => round(74.8 - ((11 - $weeksAgo) * 0.28), 2),
'measured_at' => now()->startOfDay()->subWeeks($weeksAgo), 'measured_at' => now()->startOfDay()->subWeeks($weeksAgo),
]); ]);
@@ -275,7 +346,7 @@ class DemoContentSeeder extends Seeder
throw new LogicException('Unable to build the demo workout collection.'); throw new LogicException('Unable to build the demo workout collection.');
} }
WorkoutSessions::factory()->for($demoUser)->create([ $demoUser->workouts()->create([
'external_id' => $source === WorkoutSource::STRAVA ? "demo-strava-{$index}" : null, 'external_id' => $source === WorkoutSource::STRAVA ? "demo-strava-{$index}" : null,
'source' => $source, 'source' => $source,
'type' => $workout['type'], 'type' => $workout['type'],
+3
View File
@@ -20,6 +20,9 @@ it('creates a complete local demonstration dataset', function () {
expect(User::query()->count())->toBe(10) expect(User::query()->count())->toBe(10)
->and($demoUser->hasCompletedNutritionOnboarding())->toBeTrue() ->and($demoUser->hasCompletedNutritionOnboarding())->toBeTrue()
->and($onboardingUser->hasCompletedNutritionOnboarding())->toBeFalse() ->and($onboardingUser->hasCompletedNutritionOnboarding())->toBeFalse()
->and(User::query()->whereNotNull('onboarding_completed_at')->count())->toBe(9)
->and($demoUser->nutritionPlans()->count())->toBe(1)
->and($onboardingUser->nutritionPlans()->count())->toBe(0)
->and($demoUser->weightEntries()->count())->toBe(12) ->and($demoUser->weightEntries()->count())->toBe(12)
->and($demoUser->workouts()->count())->toBe(12) ->and($demoUser->workouts()->count())->toBe(12)
->and($demoUser->following()->count())->toBe(8) ->and($demoUser->following()->count())->toBe(8)