11import pytest
22
33@pytest .mark .asyncio
4- async def test_templates (auth_client ):
4+ async def test_templates (admin_client ):
55 # Create template
6- response = await auth_client .post ("/api/templates" , json = {
6+ response = await admin_client .post ("/api/templates" , json = {
77 "name" : "Test Template" ,
88 "description" : "Desc" ,
99 "content_md" : "# Tmpl Content"
@@ -12,54 +12,101 @@ async def test_templates(auth_client):
1212 tmpl_id = response .json ()["id" ]
1313
1414 # List templates
15- response = await auth_client .get ("/api/templates" )
15+ response = await admin_client .get ("/api/templates" )
1616 assert response .status_code == 200
1717 assert any (t ["id" ] == tmpl_id for t in response .json ())
1818
1919 # Update template
20- response = await auth_client .put (f"/api/templates/{ tmpl_id } " , json = {
20+ response = await admin_client .put (f"/api/templates/{ tmpl_id } " , json = {
2121 "name" : "Updated Tmpl"
2222 })
2323 assert response .status_code == 200
2424 assert response .json ()["name" ] == "Updated Tmpl"
2525
2626 # Delete template
27- response = await auth_client .delete (f"/api/templates/{ tmpl_id } " )
27+ response = await admin_client .delete (f"/api/templates/{ tmpl_id } " )
2828 assert response .status_code == 200
2929 assert response .json () == {"ok" : True }
3030
3131
3232@pytest .mark .asyncio
33- async def test_create_duplicate_template_name_returns_409 (auth_client ):
33+ async def test_create_duplicate_template_name_returns_409 (admin_client ):
3434 payload = {"name" : "Unique409Name" , "description" : "d" , "content_md" : "# A" }
35- r1 = await auth_client .post ("/api/templates" , json = payload )
35+ r1 = await admin_client .post ("/api/templates" , json = payload )
3636 assert r1 .status_code == 201
3737
38- r2 = await auth_client .post ("/api/templates" , json = payload )
38+ r2 = await admin_client .post ("/api/templates" , json = payload )
3939 assert r2 .status_code == 409
4040
4141 # cleanup
42- await auth_client .delete (f"/api/templates/{ r1 .json ()['id' ]} " )
42+ await admin_client .delete (f"/api/templates/{ r1 .json ()['id' ]} " )
4343
4444
4545@pytest .mark .asyncio
46- async def test_update_template_to_duplicate_name_returns_409 (auth_client ):
47- t1 = (await auth_client .post ("/api/templates" , json = {
46+ async def test_update_template_to_duplicate_name_returns_409 (admin_client ):
47+ t1 = (await admin_client .post ("/api/templates" , json = {
4848 "name" : "Tmpl409A" , "content_md" : "a"
4949 })).json ()
50- t2 = (await auth_client .post ("/api/templates" , json = {
50+ t2 = (await admin_client .post ("/api/templates" , json = {
5151 "name" : "Tmpl409B" , "content_md" : "b"
5252 })).json ()
5353
54- r = await auth_client .put (f"/api/templates/{ t2 ['id' ]} " , json = {"name" : "Tmpl409A" })
54+ r = await admin_client .put (f"/api/templates/{ t2 ['id' ]} " , json = {"name" : "Tmpl409A" })
5555 assert r .status_code == 409
5656
5757 # cleanup
58- await auth_client .delete (f"/api/templates/{ t1 ['id' ]} " )
59- await auth_client .delete (f"/api/templates/{ t2 ['id' ]} " )
58+ await admin_client .delete (f"/api/templates/{ t1 ['id' ]} " )
59+ await admin_client .delete (f"/api/templates/{ t2 ['id' ]} " )
6060
6161
6262@pytest .mark .asyncio
63- async def test_delete_nonexistent_template_returns_404 (auth_client ):
64- r = await auth_client .delete ("/api/templates/999999" )
63+ async def test_delete_nonexistent_template_returns_404 (admin_client ):
64+ r = await admin_client .delete ("/api/templates/999999" )
6565 assert r .status_code == 404
66+
67+
68+ @pytest .mark .asyncio
69+ async def test_non_admin_cannot_create_template (auth_client ):
70+ r = await auth_client .post ("/api/templates" , json = {
71+ "name" : "Forbidden" , "content_md" : "x"
72+ })
73+ assert r .status_code == 403
74+
75+
76+ @pytest .mark .asyncio
77+ async def test_non_admin_cannot_update_template (auth_client , admin_client ):
78+ created = (await admin_client .post ("/api/templates" , json = {
79+ "name" : "OwnedByAdmin" , "content_md" : "x"
80+ })).json ()
81+ try :
82+ r = await auth_client .put (
83+ f"/api/templates/{ created ['id' ]} " , json = {"name" : "Hijacked" }
84+ )
85+ assert r .status_code == 403
86+ finally :
87+ await admin_client .delete (f"/api/templates/{ created ['id' ]} " )
88+
89+
90+ @pytest .mark .asyncio
91+ async def test_non_admin_cannot_delete_template (auth_client , admin_client ):
92+ created = (await admin_client .post ("/api/templates" , json = {
93+ "name" : "OwnedByAdmin2" , "content_md" : "x"
94+ })).json ()
95+ try :
96+ r = await auth_client .delete (f"/api/templates/{ created ['id' ]} " )
97+ assert r .status_code == 403
98+ finally :
99+ await admin_client .delete (f"/api/templates/{ created ['id' ]} " )
100+
101+
102+ @pytest .mark .asyncio
103+ async def test_non_admin_can_still_list_templates (auth_client , admin_client ):
104+ created = (await admin_client .post ("/api/templates" , json = {
105+ "name" : "Listable" , "content_md" : "x"
106+ })).json ()
107+ try :
108+ r = await auth_client .get ("/api/templates" )
109+ assert r .status_code == 200
110+ assert any (t ["id" ] == created ["id" ] for t in r .json ())
111+ finally :
112+ await admin_client .delete (f"/api/templates/{ created ['id' ]} " )
0 commit comments