1+ import pytest
2+ from httpx import AsyncClient
3+
4+ from tests .conftest import auth_header , create_test_user , login_user
5+
6+ @pytest .mark .anyio
7+ async def test_get_posts_empty (client : AsyncClient ):
8+ response = await client .get ("/api/posts" )
9+
10+ assert response .status_code == 200
11+ data = response .json ()
12+ assert data ["posts" ] == []
13+ assert data ["total" ] == 0
14+ assert data ["has_more" ] is False
15+
16+
17+ @pytest .mark .anyio
18+ async def test_get_post_not_found (client : AsyncClient ):
19+ response = await client .get ("/api/posts/999" )
20+
21+ assert response .status_code == 404
22+ assert response .json ()["detail" ] == "Post not found"
23+
24+
25+ @pytest .mark .anyio
26+ async def test_create_post_success (client : AsyncClient ):
27+ user = await create_test_user (client )
28+ token = await login_user (client )
29+ headers = auth_header (token )
30+
31+ response = await client .post (
32+ "/api/posts" ,
33+ json = {"title" : "My First Post" , "content" : "This is the content" },
34+ headers = headers ,
35+ )
36+
37+ assert response .status_code == 201
38+ data = response .json ()
39+ assert data ["title" ] == "My First Post"
40+ assert data ["content" ] == "This is the content"
41+ assert data ["user_id" ] == user ["id" ]
42+ assert "id" in data
43+ assert "date_posted" in data
44+ assert data ["author" ]["username" ] == "testuser"
45+
46+
47+ @pytest .mark .anyio
48+ async def test_create_post_unauthorized (client : AsyncClient ):
49+ response = await client .post (
50+ "/api/posts" ,
51+ json = {"title" : "Test Post" , "content" : "Test content" },
52+ )
53+
54+ assert response .status_code == 401
55+ assert response .json ()["detail" ] == "Not authenticated"
56+
57+
58+ @pytest .mark .anyio
59+ async def test_update_post_success (client : AsyncClient ):
60+ await create_test_user (client )
61+ token = await login_user (client )
62+ headers = auth_header (token )
63+
64+ response = await client .post (
65+ "/api/posts" ,
66+ json = {"title" : "Original Title" , "content" : "Original content" },
67+ headers = headers ,
68+ )
69+ post_id = response .json ()["id" ]
70+
71+ response = await client .patch (
72+ f"/api/posts/{ post_id } " ,
73+ json = {"title" : "Updated Title" },
74+ headers = headers ,
75+ )
76+
77+ assert response .status_code == 200
78+ data = response .json ()
79+ assert data ["title" ] == "Updated Title"
80+ assert data ["content" ] == "Original content"
81+
82+
83+ @pytest .mark .anyio
84+ async def test_update_post_wrong_user (client : AsyncClient ):
85+ await create_test_user (client , username = "user1" , email = "user1@example.com" )
86+ token1 = await login_user (client , email = "user1@example.com" )
87+
88+ response = await client .post (
89+ "/api/posts" ,
90+ json = {"title" : "User 1's Post" , "content" : "Only user 1 can edit this" },
91+ headers = auth_header (token1 ),
92+ )
93+ post_id = response .json ()["id" ]
94+
95+ await create_test_user (client , username = "user2" , email = "user2@example.com" )
96+ token2 = await login_user (client , email = "user2@example.com" )
97+
98+ response = await client .patch (
99+ f"/api/posts/{ post_id } " ,
100+ json = {"title" : "Hacked Title" },
101+ headers = auth_header (token2 ),
102+ )
103+
104+ assert response .status_code == 403
105+ assert response .json ()["detail" ] == "Not authorized to update this post"
106+
107+
108+ @pytest .mark .anyio
109+ async def test_get_posts_with_pagination (client : AsyncClient ):
110+ await create_test_user (client )
111+ token = await login_user (client )
112+ headers = auth_header (token )
113+
114+ for i in range (5 ):
115+ response = await client .post (
116+ "/api/posts" ,
117+ json = {"title" : f"Post { i } " , "content" : f"Content for post { i } " },
118+ headers = headers ,
119+ )
120+ assert response .status_code == 201
121+
122+ response = await client .get ("/api/posts" )
123+ assert response .status_code == 200
124+ data = response .json ()
125+ assert data ["total" ] == 5
126+ assert len (data ["posts" ]) == 5
127+ assert data ["has_more" ] is False
128+
129+ response = await client .get ("/api/posts?limit=2" )
130+ assert response .status_code == 200
131+ data = response .json ()
132+ assert data ["total" ] == 5
133+ assert len (data ["posts" ]) == 2
134+ assert data ["has_more" ] is True
135+
136+ response = await client .get ("/api/posts?skip=2&limit=2" )
137+ assert response .status_code == 200
138+ data = response .json ()
139+ assert data ["total" ] == 5
140+ assert len (data ["posts" ]) == 2
141+ assert data ["skip" ] == 2
142+ assert data ["limit" ] == 2
143+
144+
145+
146+
147+
0 commit comments