diff --git a/tests/routes/test_messages.py b/tests/routes/test_messages.py index 3328269e..a401d0de 100644 --- a/tests/routes/test_messages.py +++ b/tests/routes/test_messages.py @@ -53,6 +53,123 @@ async def test_get_messages(client, db_session, sample_data): assert data["items"][0]["metadata"] == {} +@pytest.mark.asyncio +async def test_messages_pagination(client, db_session, sample_data): + """Test pagination of messages with different page sizes.""" + test_app, test_user = sample_data + + # Create a test session + test_session = models.Session(user_id=test_user.public_id) + db_session.add(test_session) + await db_session.commit() + + # Create 50 test messages + for i in range(50): + test_message = models.Message( + session_id=test_session.public_id, + content=f"Pagination test message {i}", + is_user=i % 2 == 0, # Alternating user/non-user messages + h_metadata={"index": i} + ) + db_session.add(test_message) + + await db_session.commit() + + # Test case 1: Default pagination (page 1, default size) + response = client.post( + f"/v1/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list", + json={}, + ) + assert response.status_code == 200 + data = response.json() + + # Check pagination metadata + assert data["page"] == 1 + assert "total" in data + assert data["total"] == 50 # Total count should be 50 + + # Test case 2: 5 pages of 10 items each + for page in range(1, 6): + response = client.post( + f"/v1/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list?page={page}&size=10", + json={}, + ) + assert response.status_code == 200 + data = response.json() + + # Check pagination metadata + assert data["page"] == page + assert data["size"] == 10 + assert data["total"] == 50 + + # Check items count (should be 10 for all pages) + expected_items = 10 + assert len(data["items"]) == expected_items + + # Verify we have the correct page of items + start_idx = (page - 1) * 10 + for i, item in enumerate(data["items"]): + expected_idx = start_idx + i + assert item["metadata"]["index"] == expected_idx + + # Test case 3: 2 pages of 25 items each + for page in range(1, 3): + response = client.post( + f"/v1/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list?page={page}&size=25", + json={}, + ) + assert response.status_code == 200 + data = response.json() + + # Check pagination metadata + assert data["page"] == page + assert data["size"] == 25 + assert data["total"] == 50 + + # Check items count + expected_items = 25 + assert len(data["items"]) == expected_items + + # Verify we have the correct page of items + start_idx = (page - 1) * 25 + for i, item in enumerate(data["items"]): + expected_idx = start_idx + i + assert item["metadata"]["index"] == expected_idx + + # Test case 4: 1 page of 50 items + response = client.post( + f"/v1/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list?page=1&size=50", + json={}, + ) + assert response.status_code == 200 + data = response.json() + + # Check pagination metadata + assert data["page"] == 1 + assert data["size"] == 50 + assert data["total"] == 50 + + # Check items count + assert len(data["items"]) == 50 + + # Verify all items are included + all_indices = {item["metadata"]["index"] for item in data["items"]} + assert all_indices == set(range(50)) + + # Test case 5: Test with reverse=true (newest first, reverse order) + response = client.post( + f"/v1/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list?page=1&size=50&reverse=true", + json={}, + ) + assert response.status_code == 200 + data = response.json() + + # Check items are in reverse order when reverse=true + for i, item in enumerate(data["items"]): + expected_idx = 49 - i + assert item["metadata"]["index"] == expected_idx + + @pytest.mark.asyncio async def test_get_filtered_messages(client, db_session, sample_data): test_app, test_user = sample_data