Skip to content

Commit 4d7cbfb

Browse files
committed
add test
1 parent b8140bd commit 4d7cbfb

File tree

8 files changed

+105
-67
lines changed

8 files changed

+105
-67
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ test:
3434
pytest tests/ --cov-report=
3535

3636
cov: deps
37-
coverage run -m pytest tests/
38-
coverage report --show-missing -m
37+
coverage run --branch -m pytest tests/
38+
coverage report --show-missing -m --omit=tests/*,conftest.py
3939
coverage xml
4040
coverage html
4141

fast_tmp/admin/depends.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def decode_access_token_from_data(
2626

2727

2828
def get_user(username: str, session: Session) -> Optional[User]:
29-
3029
res = session.execute(
3130
select(User) # type: ignore
3231
.where(User.username == username)

fast_tmp/admin/endpoint.py

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, List, Optional
1+
from typing import List, Optional
22

33
from fastapi import APIRouter, Depends
44
from pydantic import BaseModel
@@ -13,6 +13,7 @@
1313
from ..models import User
1414
from ..site.utils import clean_data_to_model, get_pk
1515
from .depends import decode_access_token_from_data
16+
from .responses import BaseRes, key_error, not_found_instance
1617

1718
router = APIRouter()
1819

@@ -29,12 +30,6 @@ class ListDataWithPage(BaseModel): # 带分页的数据
2930
total: int = 0
3031

3132

32-
class BaseRes(BaseModel):
33-
status: int = 0
34-
msg: str = ""
35-
data: Any = {}
36-
37-
3833
@router.get("/{resource}/list")
3934
def list_view(
4035
request: Request,
@@ -76,13 +71,12 @@ def update_data(
7671
if not user:
7772
return RedirectResponse(request.url_for("admin:login"))
7873
data = clean_data_to_model(page_model.update_fields, data)
79-
params = dict(request.query_params)
80-
pks = get_pk(page_model.model)
81-
w = []
82-
for k, v in params.items():
83-
if pks.get(k) is not None:
84-
w.append(pks[k] == v)
74+
w = get_pks(page_model, request)
75+
if isinstance(w, BaseRes):
76+
return w
8577
old_data = session.execute(select(page_model.model).where(*w)).scalar_one_or_none()
78+
if not old_data:
79+
return not_found_instance
8680
page_model.update_model(old_data, data)
8781
session.commit()
8882
return BaseRes()
@@ -98,15 +92,13 @@ def update_view(
9892
if not user:
9993
return RedirectResponse(request.url_for("admin:login"))
10094

101-
params = dict(request.query_params)
102-
pks = get_pk(page_model.model)
103-
w = []
104-
for k, v in params.items():
105-
if pks.get(k) is not None:
106-
w.append(pks[k] == v)
107-
data = session.execute(select(page_model.update_fields).where(*w))
108-
for i in data:
109-
return BaseRes(data=dict(i))
95+
w = get_pks(page_model, request)
96+
if isinstance(w, BaseRes):
97+
return w
98+
data = session.execute(select(page_model.update_fields).where(*w)).fetchone()
99+
if not data:
100+
return not_found_instance
101+
return BaseRes(data=dict(data))
110102

111103

112104
@router.post("/{resource}/create")
@@ -137,17 +129,24 @@ def delete_one(
137129
if not user:
138130
return RedirectResponse(request.url_for("admin:login"))
139131

132+
w = get_pks(page_model, request)
133+
if isinstance(w, BaseRes):
134+
return w
135+
session.execute(delete(page_model.model).where(*w))
136+
session.commit()
137+
return BaseRes()
138+
139+
140+
def get_pks(page_model: ModelAdmin, request: Request):
140141
params = dict(request.query_params)
141142
pks = get_pk(page_model.model)
142143
w = []
143144
for k, v in params.items():
144145
if pks.get(k) is not None:
145146
w.append(pks[k] == v)
146147
else:
147-
return BaseRes(status=400, msg="主键错误")
148-
session.execute(delete(page_model.model).where(*w))
149-
session.commit()
150-
return BaseRes()
148+
return key_error
149+
return w
151150

152151

153152
class DIDS(BaseModel):

fast_tmp/admin/responses.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
from starlette.requests import Request
2-
from starlette.responses import RedirectResponse
3-
from starlette.status import HTTP_303_SEE_OTHER
1+
from typing import Any
42

3+
from pydantic import BaseModel
54

6-
def redirect(request: Request, view: str, **params):
7-
return RedirectResponse(
8-
url=request.app.admin_path + request.app.url_path_for(view, **params),
9-
status_code=HTTP_303_SEE_OTHER,
10-
)
5+
6+
class BaseRes(BaseModel):
7+
status: int = 0
8+
msg: str = ""
9+
data: Any = {}
10+
11+
12+
key_error = BaseRes(status=400, msg="主键错误")
13+
not_found_instance = BaseRes(status=404, msg="找不到对象")

fast_tmp/admin/schema/page.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from typing import List, Optional, Tuple, Union
22

3-
from pydantic import BaseModel, Field
4-
53
from fast_tmp.admin.schema.abstract_schema import BaseAmisModel
64

75
from .enums import TypeEnum
@@ -31,31 +29,32 @@ class HBox(BaseAmisModel):
3129
columns: List[BaseAmisModel]
3230

3331

34-
class AppPage(BaseModel):
35-
"""
36-
app的子页
37-
"""
38-
39-
label: str
40-
icon: str
41-
url: str
42-
schema_: Page = Field(..., alias="schema")
43-
# schemaApi: Optional[str] = None
44-
link: Optional[str] = None
45-
redirect: Optional[str] = None
46-
rewrite: Optional[str] = None
47-
isDefaultPage: Optional[str] = None
48-
49-
# visible:Optional[bool]=None
50-
def dict(self, *args, **kwargs):
51-
kwargs["exclude_none"] = True
52-
res: dict = super().dict(*args, **kwargs)
53-
return res
54-
55-
56-
class AppPageGroup(BaseModel):
57-
label: str
58-
children: List[AppPage]
32+
#
33+
# class AppPage(BaseModel):
34+
# """
35+
# app的子页
36+
# """
37+
#
38+
# label: str
39+
# icon: str
40+
# url: str
41+
# schema_: Page = Field(..., alias="schema")
42+
# # schemaApi: Optional[str] = None
43+
# link: Optional[str] = None
44+
# redirect: Optional[str] = None
45+
# rewrite: Optional[str] = None
46+
# isDefaultPage: Optional[str] = None
47+
#
48+
# # visible:Optional[bool]=None
49+
# def dict(self, *args, **kwargs):
50+
# kwargs["exclude_none"] = True
51+
# res: dict = super().dict(*args, **kwargs)
52+
# return res
53+
54+
55+
# class AppPageGroup(BaseModel):
56+
# label: str
57+
# children: List[AppPage]
5958

6059

6160
# class App(BaseAmisModel):

fast_tmp/admin/server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from fast_tmp.utils.token import create_access_token
1919

2020
from ..jinja_extension.tags import register_tags
21-
from .endpoint import BaseRes, router
21+
from .endpoint import router
22+
from .responses import BaseRes
2223

2324
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=settings.LOGIN_URL)
2425
base_path = os.path.dirname(__file__)

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[flake8]
2-
ignore = D203,E501,C901,W503
2+
ignore = D203,E501,C901,W503,F841
33
exclude =
44
.git,
55
__pycache__,

tests/test_a.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,44 @@ def test_crud():
5050
# login
5151
login_post_res = client.post("/admin/login", data={"username": "crud_user", "password": "crud_user"})
5252
assert login_post_res.status_code == 307
53+
assert login_post_res.next.path_url == "/admin/"
5354
# list
5455
user_list = client.get("/admin/User/list")
5556
assert user_list.status_code == 200
56-
assert user_list.text == '{"status":0,"msg":"","data":{"items":[{"id":1,"username":"root","is_active":true},{"id":2,"username":"crud_user","is_active":true}],"total":2}}'
57+
assert user_list.text.count('"username":"crud_user"') == 1
58+
user_data = user_list.json()["data"]
59+
assert user_data["total"] == 2
60+
for i in user_data["items"]:
61+
if i.get("username") == "crud_user":
62+
user_id = i.get("id")
63+
break
64+
else:
65+
raise Exception("not found user id")
66+
# update
67+
user_update = client.get(f"/admin/User/update?id={user_id}")
68+
assert user_update.status_code == 200
69+
assert user_update.text.count('"password":') == 1
70+
user_update_p = client.put(f"/admin/User/update?id={user_id}", json={"password": "root"})
71+
assert user_update_p.status_code == 200
72+
assert user_update_p.json()["status"] == 0
73+
# test error pk
74+
user_delete_err = client.delete(f"/admin/User/delete?ids={user_id}")
75+
error_data = user_delete_err.json()
76+
assert error_data["status"] == 400
77+
assert error_data["msg"] == "主键错误"
78+
error_data = client.put(f"/admin/User/update?ids={user_id}", json={"password": "root"}).json()
79+
assert error_data["status"] == 400
80+
assert error_data["msg"] == "主键错误"
81+
# delete
82+
user_delete = client.delete(f"/admin/User/delete?id={user_id}")
83+
assert user_delete.status_code == 200
84+
85+
86+
def test_not_singin():
87+
client = TestClient(app)
88+
assert client.get("/admin/User/list").text.count("Login to your account") == 1
89+
assert client.post("/admin/User/create", json={"username": "crud_user1", "password": "tt"}).status_code == 307
90+
assert client.get("/admin/User/update?id=1").text.count("Login to your account") == 1
91+
assert client.put("/admin/User/update?id=1", json={"password": "asdfadf"}).status_code == 307
92+
assert client.delete("/admin/User/delete?id=1").status_code == 307
93+
assert client.get("/admin/User/schema").text.count("Login to your account") == 1

0 commit comments

Comments
 (0)