|
8 | 8 | from sqlmodel import select |
9 | 9 | from sqlmodel.ext.asyncio.session import AsyncSession |
10 | 10 |
|
| 11 | +from app.routers.news.routes import encode_email |
11 | 12 | from app.services.database.models import Community, News |
12 | 13 |
|
13 | 14 |
|
@@ -284,3 +285,84 @@ async def test_news_integration( |
284 | 285 | == news_data["social_media_url"] |
285 | 286 | ) |
286 | 287 | assert data["news_list"][0]["likes"] == 0 |
| 288 | + |
| 289 | + |
| 290 | +@pytest.mark.asyncio |
| 291 | +async def test_news_likes_endpoint( |
| 292 | + session: AsyncSession, |
| 293 | + async_client: AsyncClient, |
| 294 | + community: Community, |
| 295 | + valid_auth_headers: Mapping[str, str], |
| 296 | +): |
| 297 | + news_data = { |
| 298 | + "title": "Test News", |
| 299 | + "content": "Test news content.", |
| 300 | + "category": "test_category", |
| 301 | + "tags": "test_tag", |
| 302 | + "source_url": "https://example.com/test-news", |
| 303 | + "social_media_url": "https://test.com/test_news", |
| 304 | + } |
| 305 | + response = await async_client.post( |
| 306 | + "/api/news", json=news_data, headers=valid_auth_headers |
| 307 | + ) |
| 308 | + assert response.status_code == status.HTTP_200_OK |
| 309 | + statement = select(News).where(News.title == news_data["title"]) |
| 310 | + result = await session.exec(statement) |
| 311 | + stored_news = result.first() |
| 312 | + assert stored_news is not None |
| 313 | + assert stored_news.likes == 0 |
| 314 | + |
| 315 | + emails = ["like@test.com", "like2@test.com"] |
| 316 | + |
| 317 | + # Add likes |
| 318 | + response = await async_client.post( |
| 319 | + f"/api/news/{stored_news.id}/like", |
| 320 | + json={"email": emails[0]}, |
| 321 | + headers=valid_auth_headers, |
| 322 | + ) |
| 323 | + assert response.status_code == status.HTTP_200_OK |
| 324 | + statement = select(News).where(News.title == news_data["title"]) |
| 325 | + result = await session.exec(statement) |
| 326 | + stored_news = result.first() |
| 327 | + assert stored_news.likes == 1 |
| 328 | + assert stored_news.user_email_list == f"['{encode_email(emails[0])}']" |
| 329 | + |
| 330 | + response = await async_client.post( |
| 331 | + f"/api/news/{stored_news.id}/like", |
| 332 | + json={"email": emails[1]}, |
| 333 | + headers=valid_auth_headers, |
| 334 | + ) |
| 335 | + assert response.status_code == status.HTTP_200_OK |
| 336 | + statement = select(News).where(News.title == news_data["title"]) |
| 337 | + result = await session.exec(statement) |
| 338 | + stored_news = result.first() |
| 339 | + assert stored_news.likes == 2 |
| 340 | + assert ( |
| 341 | + stored_news.user_email_list |
| 342 | + == f"['{encode_email(emails[0])}', '{encode_email(emails[1])}']" |
| 343 | + ) |
| 344 | + |
| 345 | + # Remove likes |
| 346 | + response = await async_client.delete( |
| 347 | + f"/api/news/{stored_news.id}/like", |
| 348 | + params={"email": emails[0]}, |
| 349 | + headers=valid_auth_headers, |
| 350 | + ) |
| 351 | + assert response.status_code == status.HTTP_200_OK |
| 352 | + statement = select(News).where(News.title == news_data["title"]) |
| 353 | + result = await session.exec(statement) |
| 354 | + stored_news = result.first() |
| 355 | + assert stored_news.likes == 1 |
| 356 | + assert stored_news.user_email_list == f"['{encode_email(emails[1])}']" |
| 357 | + |
| 358 | + response = await async_client.delete( |
| 359 | + f"/api/news/{stored_news.id}/like", |
| 360 | + params={"email": emails[1]}, |
| 361 | + headers=valid_auth_headers, |
| 362 | + ) |
| 363 | + assert response.status_code == status.HTTP_200_OK |
| 364 | + statement = select(News).where(News.title == news_data["title"]) |
| 365 | + result = await session.exec(statement) |
| 366 | + stored_news = result.first() |
| 367 | + assert stored_news.likes == 0 |
| 368 | + assert stored_news.user_email_list == "[]" |
0 commit comments