127 lines
4.1 KiB
PHP
127 lines
4.1 KiB
PHP
<?php
|
|
|
|
use App\Models\MealPosts;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Laravel\Sanctum\Sanctum;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
it('returns nutrition totals for a day', function () {
|
|
$user = User::factory()->create();
|
|
$otherUser = User::factory()->create();
|
|
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 500,
|
|
'proteins' => 30.50,
|
|
'carbs' => 60.25,
|
|
'fats' => 12.75,
|
|
'eaten_at' => '2026-05-16 08:30:00',
|
|
]);
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 250,
|
|
'proteins' => 10.25,
|
|
'carbs' => 20,
|
|
'fats' => 5.50,
|
|
'eaten_at' => '2026-05-16 20:00:00',
|
|
]);
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 900,
|
|
'proteins' => 80,
|
|
'carbs' => 90,
|
|
'fats' => 40,
|
|
'eaten_at' => '2026-05-15 12:00:00',
|
|
]);
|
|
MealPosts::factory()->for($otherUser, 'user')->create([
|
|
'calories' => 700,
|
|
'proteins' => 60,
|
|
'carbs' => 70,
|
|
'fats' => 30,
|
|
'eaten_at' => '2026-05-16 12:00:00',
|
|
]);
|
|
|
|
Sanctum::actingAs($user);
|
|
|
|
$response = $this->getJson('/api/meal-posts/stats?period=day&date=2026-05-16');
|
|
|
|
$response
|
|
->assertOk()
|
|
->assertJsonPath('data.period', 'day')
|
|
->assertJsonPath('data.date', '2026-05-16')
|
|
->assertJsonPath('data.startDate', '2026-05-16')
|
|
->assertJsonPath('data.endDate', '2026-05-16')
|
|
->assertJsonPath('data.totals.calories', 750)
|
|
->assertJsonPath('data.totals.proteins', 40.75)
|
|
->assertJsonPath('data.totals.carbs', 80.25)
|
|
->assertJsonPath('data.totals.fats', 18.25)
|
|
->assertJsonPath('data.totals.mealsCount', 2)
|
|
->assertJsonCount(1, 'data.days')
|
|
->assertJsonPath('data.days.0.date', '2026-05-16')
|
|
->assertJsonPath('data.days.0.totals.calories', 750);
|
|
});
|
|
|
|
it('returns nutrition totals for a week with a daily breakdown', function () {
|
|
$user = User::factory()->create();
|
|
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 400,
|
|
'proteins' => 20,
|
|
'carbs' => 45,
|
|
'fats' => 8,
|
|
'eaten_at' => '2026-05-11 10:00:00',
|
|
]);
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 600,
|
|
'proteins' => 35.50,
|
|
'carbs' => 80.25,
|
|
'fats' => 14.75,
|
|
'eaten_at' => '2026-05-16 12:00:00',
|
|
]);
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 300,
|
|
'proteins' => 18,
|
|
'carbs' => 25,
|
|
'fats' => 11,
|
|
'eaten_at' => '2026-05-17 21:30:00',
|
|
]);
|
|
MealPosts::factory()->for($user, 'user')->create([
|
|
'calories' => 999,
|
|
'proteins' => 99,
|
|
'carbs' => 99,
|
|
'fats' => 99,
|
|
'eaten_at' => '2026-05-18 08:00:00',
|
|
]);
|
|
|
|
Sanctum::actingAs($user);
|
|
|
|
$response = $this->getJson('/api/meal-posts/stats?period=week&date=2026-05-16');
|
|
|
|
$response
|
|
->assertOk()
|
|
->assertJsonPath('data.period', 'week')
|
|
->assertJsonPath('data.startDate', '2026-05-11')
|
|
->assertJsonPath('data.endDate', '2026-05-17')
|
|
->assertJsonPath('data.totals.calories', 1300)
|
|
->assertJsonPath('data.totals.proteins', 73.5)
|
|
->assertJsonPath('data.totals.carbs', 150.25)
|
|
->assertJsonPath('data.totals.fats', 33.75)
|
|
->assertJsonPath('data.totals.mealsCount', 3)
|
|
->assertJsonCount(7, 'data.days')
|
|
->assertJsonPath('data.days.0.date', '2026-05-11')
|
|
->assertJsonPath('data.days.0.totals.calories', 400)
|
|
->assertJsonPath('data.days.5.date', '2026-05-16')
|
|
->assertJsonPath('data.days.5.totals.calories', 600)
|
|
->assertJsonPath('data.days.6.date', '2026-05-17')
|
|
->assertJsonPath('data.days.6.totals.calories', 300);
|
|
});
|
|
|
|
it('validates stats filters', function () {
|
|
Sanctum::actingAs(User::factory()->create());
|
|
|
|
$response = $this->getJson('/api/meal-posts/stats?period=month&date=16-05-2026');
|
|
|
|
$response
|
|
->assertUnprocessable()
|
|
->assertJsonValidationErrors(['period', 'date']);
|
|
});
|