From 9fe017a6e3bba6d44676ed9d3c5de98e3484a806 Mon Sep 17 00:00:00 2001 From: Peery Date: Wed, 12 Jan 2022 00:05:09 +0100 Subject: [PATCH] Introduced TagCategory, bugfixes Fixed several bugs from previous commits (Bad distribution of changes across multiple commits). Introduced striping of string fields before send back as replies in main.py. Implemented POST and DELETE calls for /artnet/metadata/category Implemented tests for the new calls. --- database/models.py | 15 +- main.py | 58 +++++++- tests/createAPI/create_delete_tag_category.py | 133 ++++++++++++++++++ 3 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 tests/createAPI/create_delete_tag_category.py diff --git a/database/models.py b/database/models.py index 747f378..536edec 100644 --- a/database/models.py +++ b/database/models.py @@ -39,12 +39,15 @@ class Presence(BaseModel): orm_mode = True -class ArtnoID(BaseModel): - hash: Optional[str] - path: Optional[str] - title: Optional[str] = None - link: Optional[str] = None - presences: Optional[List[Presence]] +class TagCategorynoID(BaseModel): + name: str + + class Config: + orm_mode = True + + +class TagCategory(TagCategorynoID): + category_id: int class Config: orm_mode = True diff --git a/main.py b/main.py index ebcbd72..3d9b4d3 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,8 @@ import uvicorn from typing import List, Tuple from database.database import Database -from database.models import Art, ArtnoID, Presence, ArtistNoId +from database.database import DBPresence, DBArt2Presence +from database.models import Art, ArtnoID, Presence, ArtistNoId, TagnoID, TagCategory, TagCategorynoID app = FastAPI() db = Database() @@ -23,7 +24,7 @@ async def art(id: int = None, hash: str = None, tag_id: int = None): elif tag_id is not None: result = db.get_tag_art(tag_id) - if id is None and hash is None and tag_id is None: # TODO fix against listing enormous amounts of art (because all could be large) + if id is None and hash is None and tag_id is None: # TODO fix against listing enormous amounts of art (because "all" could be large) result = db.get_art_list() if result is not None: @@ -111,6 +112,17 @@ async def presence(name: str = None, domain: str = None, artist_id: int = None, #raise HTTPException(status_code=406, detail="You must query with at least one parameter!") if result is not None: + if isinstance(result, list): + for i in range(len(result)): + if isinstance(result[i], DBPresence): + result[i].name = result[i].name.strip() + result[i].domain = result[i].domain.strip() + elif isinstance(result[i], DBArt2Presence): + result[i].presence_name = result[i].presence_name.strip() + result[i].presence_domain = result[i].presence_domain.strip() + else: + result.name = result.name.strip() + result.domain = result.domain.strip() return result raise HTTPException(status_code=404, detail="Presence was not found!") @@ -199,6 +211,11 @@ async def topic(name: str = None, id: int = None, artist_id: int = None): result = db.get_artist_topics(artist_id) if result is not None: + if isinstance(result, list): + for i in range(len(result)): + result[i].name = result[i].name.strip() + else: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Topic was not found!") @@ -226,10 +243,20 @@ async def tag(id: int = None, name: str = None, fuzzy: bool = False, category: i result = db.get_category_tags(category) if result is not None: + if isinstance(result, list): + for i in range(len(result)): + result[i].name = result[i].name.strip() + else: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Tag was not found!") +@app.post("/artnet/metadata/tag") +async def tag(tag: TagnoID, id: int = None): + print(f"Received POST on /artnet/metadata/tag (id={id}) body: tag={tag}") + + @app.get("/artnet/metadata/category") async def category(name: str = None, id: int = None): name = unquote(name) if name is not None else None @@ -245,9 +272,36 @@ async def category(name: str = None, id: int = None): result = db.get_category_by_name(name) if result is not None: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Category not found!") +@app.post("/artnet/metadata/category") +async def category(category: TagCategorynoID, id: int = None): + print(f"Received GET on /artnet/metadata/category (id={id}, body: {category})") + if id is None: # create new name + try: + new_id = db.create_category_by_model(category).category_id + return {"id": new_id} + except ValueError as e: + raise HTTPException(status_code=422, detail=str(e)) + + else: + updated_category = TagCategory(category_id=id, name=category.name) + db.update_category_by_model(updated_category) + + return True + + +@app.delete("/artnet/metadata/category") +def category(id: int): + print(f"Received DELETE on /artnet/metadata/category (id={id})") + try: + db.delete_category_by_id(category_id=id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) + + if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000) diff --git a/tests/createAPI/create_delete_tag_category.py b/tests/createAPI/create_delete_tag_category.py new file mode 100644 index 0000000..13f2f29 --- /dev/null +++ b/tests/createAPI/create_delete_tag_category.py @@ -0,0 +1,133 @@ +import requests +from urllib.parse import quote +import json +from typing import List, Tuple + +test_tag_category_entries = [{"name": "category_name1", "id": None}, + {"name": "category_name2", "id": None}, + {"name": "category_name3", "id": None}] + + +def list_tag_categories(url: str, port: int): + """ + Return a list of all tag categories + :param url: + :param port: + :return: + """ + r = requests.get(f"http://{url}:{port}/artnet/metadata/category") + if r.status_code != 200: + raise Exception("Failed querying for tag category!") + categories = json.loads(r.text) + return categories + + +def get_category_by_ID(url: str, port: int, category_id: id): + r = requests.get(f"http://{url}:{port}/artnet/metadata/category?id={category_id}") + if r.status_code != 200: + raise Exception("Failed querying for tag category!") + + return json.loads(r.text) + + +def create_tag_categories(url: str, port: int): + """ + Create many tag categories for testing purposes + :param url: + :param port: + :return: + """ + for i in range(len(test_tag_category_entries)): + r = create_tag_category(url, port, name=test_tag_category_entries[i]["name"]) + if r.status_code != 200: + print(f"Create Category Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}") + raise Exception("Create Category Entry Test: FAILED") + else: + test_tag_category_entries[i]["id"] = int(json.loads(r.text)["id"]) + + +def update_category_entries(url: str, port: int): + for i in range(len(test_tag_category_entries)): + update_tag_category(url, port, category_id=test_tag_category_entries[i]["id"], name=f"Category #{i}") + updated_category = get_category_by_ID(url, port, test_tag_category_entries[i]["id"]) + + if updated_category['name'] != f"Category #{i}": + raise Exception("Updating the category name failed!") + + +def delete_category_entries(url: str, port: int): + categories = list_tag_categories(url, port) + + for i in range(len(categories)): + if "category_id" in categories[i].keys(): + r = delete_tag_category(url, port, category_id=categories[i]["category_id"]) + else: + r = delete_tag_category_by_name(url, port, name=categories[i]["name"]) + + if r.status_code != 200: + raise Exception(f"Could not delete tag category! {r.status_code}, {r.text}") + + print("Deleted category entries: SUCCESS") + + +def create_tag_category(url: str, port: int, name: str): + r = requests.post(f"http://{url}:{port}/artnet/metadata/category", + json={"name": name}) + return r + + +def update_tag_category(url: str, port: int, name: str, category_id: int): + r = requests.post(f"http://{url}:{port}/artnet/metadata/category?id={quote(str(category_id))}", + json={"name": name}) + return r + + +def delete_tag_category(url: str, port: int, category_id: int): + r = requests.delete(f"http://{url}:{port}/artnet/metadata/category?id={quote(str(category_id))}") + return r + + +def delete_tag_category_by_name(url: str, port: int, name: str): + r1 = requests.get(f"http://{url}:{port}/artnet/metadata/category?name={quote(name.strip())}") + if r1.status_code != 200: + raise ValueError("Could not delete tag category because it could not be found!") + data = json.loads(str(r1.text)) + category_id = data['category_id'] + + r = delete_tag_category(url, port, category_id=category_id) + return r + + +def run_tag_category_test(url: str, port: int): + print() + print("----------------") + + categories = list_tag_categories(url, port) + print(f"Starting tag name test with {len(categories)} categories!") + print("Starting the category test ...") + if len(list_tag_categories(url, port)) > 0: + print("Deleting previous category entries of tests ...") + delete_category_entries(url, port) + + print(f"Creating {len(test_tag_category_entries)} category entries ...") + create_tag_categories(url, port) + create_tag_result = False if not len(list_tag_categories(url, port)) == len(test_tag_category_entries) else True + print(f"Found {len(list_tag_categories(url, port))} category entries!") + if not create_tag_result: + print(f"Failure! Unexpected number of category entries!") + + print("Updating category entries with new data ...") + update_category_entries(url, port) + update_category_result = True + print("TODO") + print(f"Found {len(list_tag_categories(url, port))} category entries!") + + print("Deleting all category entries ...") + delete_category_entries(url, port) + delete_category_result = False if not len(list_tag_categories(url, port)) == 0 else True + print(f"Found {len(list_tag_categories(url, port))} category entries!") + + print("Category test complete!") + + return create_tag_result, update_category_result, delete_category_result +