feat: cron
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
use App\Ai\Agents\MealMaker;
|
||||
use App\Enums\IngredientUnit;
|
||||
use App\Enums\MealPostType;
|
||||
use App\Enums\MealPostVisibility;
|
||||
use App\Models\MealPosts;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Laravel\Ai\Image;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('generates an ai meal post with an image', function () {
|
||||
Storage::fake('public');
|
||||
|
||||
config()->set('meal_posts.ai_generation.user_name', 'Chef IA');
|
||||
config()->set('meal_posts.ai_generation.user_email', 'chef-ia@example.test');
|
||||
config()->set('meal_posts.ai_generation.image_path', 'meal-posts/ai-generated');
|
||||
config()->set('meal_posts.ai_generation.image_quality', 'medium');
|
||||
|
||||
MealMaker::fake([
|
||||
[
|
||||
'title' => 'Bowl de saumon croustillant',
|
||||
'caption' => 'Un bowl colore avec saumon, riz vinaigre et legumes croquants.',
|
||||
'type' => MealPostType::LUNCH->value,
|
||||
'calories' => 640,
|
||||
'proteins' => 42.4,
|
||||
'carbs' => 62.2,
|
||||
'fats' => 24.8,
|
||||
'ingredients' => [
|
||||
[
|
||||
'position' => 12,
|
||||
'ingredient' => 'Riz vinaigre',
|
||||
'quantity' => 160,
|
||||
'unit' => IngredientUnit::GRAM->value,
|
||||
],
|
||||
[
|
||||
'position' => 13,
|
||||
'ingredient' => 'Saumon',
|
||||
'quantity' => 130,
|
||||
'unit' => IngredientUnit::GRAM->value,
|
||||
],
|
||||
],
|
||||
'image_prompt' => 'Photorealistic crispy salmon bowl with vinegared rice and crunchy vegetables',
|
||||
],
|
||||
]);
|
||||
|
||||
Image::fake([
|
||||
base64_encode('fake-image-content'),
|
||||
]);
|
||||
|
||||
$this->artisan('meal-posts:generate-ai')
|
||||
->assertExitCode(0);
|
||||
|
||||
$mealPost = MealPosts::query()->with('user', 'ingredients')->firstOrFail();
|
||||
|
||||
expect($mealPost->ai_generated)->toBeTrue()
|
||||
->and($mealPost->title)->toBe('Bowl de saumon croustillant')
|
||||
->and($mealPost->type)->toBe(MealPostType::LUNCH)
|
||||
->and($mealPost->visibility)->toBe(MealPostVisibility::Public)
|
||||
->and($mealPost->user->email)->toBe('chef-ia@example.test')
|
||||
->and($mealPost->user->name)->toBe('Chef IA')
|
||||
->and($mealPost->ingredients)->toHaveCount(2)
|
||||
->and($mealPost->ingredients[0]->position)->toBe(1)
|
||||
->and($mealPost->ingredients[0]->ingredient)->toBe('Riz vinaigre');
|
||||
|
||||
expect($mealPost->image_url)->toStartWith('meal-posts/ai-generated/');
|
||||
Storage::disk('public')->assertExists($mealPost->image_url);
|
||||
|
||||
$this->assertDatabaseHas('meal_posts', [
|
||||
'id' => $mealPost->id,
|
||||
'ai_generated' => true,
|
||||
'visibility' => MealPostVisibility::Public->value,
|
||||
]);
|
||||
|
||||
MealMaker::assertPrompted(
|
||||
fn ($prompt): bool => str_contains($prompt->prompt, 'Genere un plat aleatoire')
|
||||
);
|
||||
|
||||
Image::assertGenerated(
|
||||
fn ($prompt): bool => $prompt->contains('crispy salmon bowl')
|
||||
&& $prompt->isLandscape()
|
||||
&& $prompt->quality === 'medium'
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user