import requests import json from typing import List, Tuple from tests.createAPI.create_delete_artist import list_artists, create_artist_entries, delete_artist_entries from tests.createAPI.create_delete_presence import test_presence_entries, list_presences, create_presence_entries from tests.createAPI.create_delete_art import test_art_entries, list_art, create_art_entries, delete_art_entries test_art_presence_relations = [ {"art_hash": test_art_entries[0]["hash"], "presence_name": test_art_entries[0]["presences"][0][0], "presence_domain": test_art_entries[0]["presences"][0][1]}, {"art_hash": test_art_entries[1]["hash"], "presence_name": test_art_entries[1]["presences"][0][0], "presence_domain": test_art_entries[1]["presences"][0][1]}, {"art_hash": test_art_entries[2]["hash"], "presence_name": test_art_entries[2]["presences"][0][0], "presence_domain": test_art_entries[1]["presences"][0][1]}, {"art_hash": test_art_entries[2]["hash"], "presence_name": test_art_entries[2]["presences"][1][0], "presence_domain": test_art_entries[2]["presences"][1][1]}, ] def list_art_to_presence_relations(url: str, port: int): """ List all relations between art and presence entries :param url: :param port: :return: """ results = [] arts = list_art(url, port) for art in arts: r = requests.get(f"http://{url}:{port}/artnet/metadata/presence?art_id={art['id']}") if r.status_code != 200: raise Exception("Failed to query presences with art id!") result = json.loads(r.text) results.append(result) return results def art_hash_to_id(arts: List[dict]): """ Converts a list of arts into the format of {hash: id, hash1: id1} This allows reverse mapping of the usual ID->hash to hash->ID. :param arts: :return: """ result = {} for i in range(len(arts)): result[arts[i]["md5_hash"].strip()] = arts[i]["id"] return result def create_art_presence_relations(url: str, port: int): arts = list_art(url, port) art_hash_id = art_hash_to_id(arts) for i in range(len(test_art_presence_relations)): print(f"Creating art-presence relation with id:{art_hash_id[test_art_presence_relations[i]['art_hash']]} " f"presence_name:{test_art_presence_relations[i]['presence_name']} " f"presence_domain:{test_art_presence_relations[i]['presence_domain']}") r = create_art_presence_relation(url, port, art_id=art_hash_id[test_art_presence_relations[i]["art_hash"]], presence_name=test_art_presence_relations[i]["presence_name"], presence_domain=test_art_presence_relations[i]["presence_domain"]) if r.status_code != 200: print(f"Tried to create art-presence relation with name:{test_art_presence_relations[i]['presence_name']} " f"domain:{test_art_presence_relations[i]['presence_domain']}" f" art_id:{test_art_presence_relations[i]['art_id']}") print(f"Create Relation failed with {r.status_code} and reason {r.text}!") raise Exception("Couldn't create art-presence relation!") l = list_art_to_presence_relations(url, port) if len(l) == 3 and len(l[-1]) == 2: return True else: return False def create_art_presence_relation(url: str, port: int, presence_name: str, presence_domain: str, art_id: int): r = requests.post(f"http://{url}:{port}/artnet/metadata/art?id={art_id}", json={"presences": [{"name": presence_name, "domain": presence_domain}]}) return r def delete_art_presence_relations(url: str, port: int): arts = list_art(url, port) art_hash_id = art_hash_to_id(arts) for i in range(len(test_art_presence_relations)): print(f"Deleting art-presence relation with id:{art_hash_id[test_art_presence_relations[i]['art_hash']]} " f"presence_name:{test_art_presence_relations[i]['presence_name']} " f"presence_domain:{test_art_presence_relations[i]['presence_domain']}") r = delete_art_presence_relation(url, port, art_id=art_hash_id[test_art_presence_relations[i]["art_hash"]], presence_name=test_art_presence_relations[i]["presence_name"], presence_domain=test_art_presence_relations[i]["presence_domain"]) if r.status_code != 200: print(f"Tried to delete art-presence relation with name:{test_art_presence_relations[i]['presence_name']} " f"domain:{test_art_presence_relations[i]['presence_domain']}" f" art_id:{art_hash_id[test_art_presence_relations[i]['art_hash']]}") print(f"Deleting Relation failed with {r.status_code} and reason {r.text}!") raise Exception("Couldn't delete art-presence relation!") l = list_art_to_presence_relations(url, port) if len(l[0]) == 0 and len(l[1]) == 0 and len(l[2]) == 0: return True else: return False def delete_art_presence_relation(url: str, port: int, presence_name: str, presence_domain: str, art_id: int): return requests.delete(f"http://{url}:{port}/artnet/metadata/art?id={art_id}&presence_name={presence_name}" f"&presence_domain={presence_domain}") def run_art_presence_relation_test(url, port): print() print("----------------") if len(list_presences(url, port)) > 0: print("Deleting leftover presence entries via cascading from artists ...") delete_artist_entries(url, port) # deleting presences via cascading if len(list_art(url, port)) > 0: print("Deleting leftover art entries ...") delete_art_entries(url, port) print(f"Leftover entries for the test are " f"({len(list_presences(url, port))}) presences, " f"({len(list_art(url, port))}) art!") print("Setting up art and presences for the art-presence-relation test ...") create_artist_entries(url, port) create_presence_entries(url, port) create_art_entries(url, port) print(f"Starting art2presence test with " f"({len(list_presences(url, port))}) presences, " f"({len(list_art(url, port))}) art!") art = list_art(url, port) # debug presences = list_presences(url, port) # debug print() print("Starting the art-presence test ...") if sum([len(x) for x in list_art_to_presence_relations(url, port)]) != 4: # 3 expected from create_art_entries() print("Anomalous amount of presence-art relations ...") exit(1) print("Creating art-presence relations ...") create_result = create_art_presence_relations(url, port) print(f"Found {sum([len(x) for x in list_art_to_presence_relations(url, port)])} art-presence relations!") delete_result = delete_art_presence_relations(url, port) print(f"Found {sum([len(x) for x in list_art_to_presence_relations(url, port)])} art-presence relations!") delete_art_entries(url, port) delete_artist_entries(url, port) print(f"Ending art2presence test with " f"({len(list_presences(url, port))}) presences, " f"({len(list_art(url, port))}) art!") return create_result, delete_result