create(); $otherUser = User::factory()->create(); $user = User::factory()->create(); $mealPost = MealPosts::factory()->for($owner, 'user')->create(); $mealPost->likedByUsers()->attach($otherUser->getKey()); Sanctum::actingAs($user); $this->postJson("/api/meal-posts/{$mealPost->id}/like") ->assertOk() ->assertJsonPath('data.likesCount', 2) ->assertJsonPath('data.likedByMe', true); $this->postJson("/api/meal-posts/{$mealPost->id}/like") ->assertOk() ->assertJsonPath('data.likesCount', 2) ->assertJsonPath('data.likedByMe', true); expect(DB::table('meal_post_likes')->where('meal_posts_id', $mealPost->id)->count())->toBe(2); $this->deleteJson("/api/meal-posts/{$mealPost->id}/like") ->assertOk() ->assertJsonPath('data.likesCount', 1) ->assertJsonPath('data.likedByMe', false); $this->assertDatabaseMissing('meal_post_likes', [ 'meal_posts_id' => $mealPost->id, 'user_id' => $user->id, ]); $this->assertDatabaseHas('meal_post_likes', [ 'meal_posts_id' => $mealPost->id, 'user_id' => $otherUser->id, ]); }); it('returns like metadata when listing meal posts', function () { $user = User::factory()->create(); $otherUser = User::factory()->create(); $likedMealPost = MealPosts::factory()->create([ 'eaten_at' => now()->addMinute(), ]); $unlikedMealPost = MealPosts::factory()->create([ 'eaten_at' => now(), ]); $likedMealPost->likedByUsers()->attach([$user->getKey(), $otherUser->getKey()]); $unlikedMealPost->likedByUsers()->attach($otherUser->getKey()); Sanctum::actingAs($user); $this->getJson('/api/meal-posts') ->assertOk() ->assertJsonPath('data.0.id', $likedMealPost->id) ->assertJsonPath('data.0.likesCount', 2) ->assertJsonPath('data.0.likedByMe', true) ->assertJsonPath('data.1.id', $unlikedMealPost->id) ->assertJsonPath('data.1.likesCount', 1) ->assertJsonPath('data.1.likedByMe', false); }); it('requires authentication to like a meal post', function () { $mealPost = MealPosts::factory()->create(); $this->postJson("/api/meal-posts/{$mealPost->id}/like") ->assertUnauthorized(); });