From e4d34f0e42d22fbd9f2a22377efeda869c8fb64e Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Thu, 15 Jun 2023 14:18:57 +0800 Subject: [PATCH] feat: add database test --- backend/src/module/database/bangumi.py | 21 ++++++----- backend/src/module/database/orm/select.py | 13 +++++-- backend/src/test/test_database.py | 45 +++++++++++++++++++++++ 3 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 backend/src/test/test_database.py diff --git a/backend/src/module/database/bangumi.py b/backend/src/module/database/bangumi.py index ad3a273a..6d0919f5 100644 --- a/backend/src/module/database/bangumi.py +++ b/backend/src/module/database/bangumi.py @@ -5,13 +5,18 @@ from module.database.orm import Connector from module.ab_decorator import locked from module.database.connector import DataConnector from module.models import BangumiData +from module.conf import DATA_PATH logger = logging.getLogger(__name__) class BangumiDatabase(Connector): - def __init__(self): - super().__init__(table_name="bangumi", data=self.__data_to_db(BangumiData())) + def __init__(self, database: str = DATA_PATH): + super().__init__( + table_name="bangumi", + data=self.__data_to_db(BangumiData()), + database=database, + ) def update_table(self): self.update.table() @@ -116,7 +121,7 @@ class BangumiDatabase(Connector): return [self.__db_to_data(x) for x in all_data] def search_id(self, _id: int) -> BangumiData | None: - dict_data = self.select.one(_id) + dict_data = self.select.one(conditions={"id": _id}) # condition = {"id": _id} # dict_data = self._search_data(table_name=self.__table_name, condition=condition) if dict_data is None: @@ -134,11 +139,12 @@ class BangumiDatabase(Connector): # return self.__db_to_data(dict_data) def match_poster(self, bangumi_name: str) -> str: - condition = {"title_raw": bangumi_name} + condition = {"official_title": bangumi_name} keys = ["poster_link"] data = self.select.one( keys=keys, - condition=condition, + conditions=condition, + combine_operator="INSTR", ) if not data: return "" @@ -187,7 +193,4 @@ class BangumiDatabase(Connector): if __name__ == "__main__": with BangumiDatabase() as db: - datas = db.not_added() - for data in datas: - print(data) - # print(db.not_complete()) + print(db.match_poster("久保")) diff --git a/backend/src/module/database/orm/select.py b/backend/src/module/database/orm/select.py index 21da0079..198c2ff5 100644 --- a/backend/src/module/database/orm/select.py +++ b/backend/src/module/database/orm/select.py @@ -31,8 +31,9 @@ class Select: combine_operator: str = "AND", ): if keys is None: - keys = ["*"] - columns = ", ".join(keys) + columns = "*" + else: + columns = ", ".join(keys) condition_sql = self.__select_condition(conditions, combine_operator) self._connector.execute( f""" @@ -81,9 +82,13 @@ class Select: if not conditions: raise ValueError("No conditions provided.") if combine_operator not in ["AND", "OR", "INSTR"]: - raise ValueError("Invalid combine_operator, must be 'AND' or 'OR'.") + raise ValueError( + "Invalid combine_operator, must be 'AND' or 'OR' or 'INSTR'." + ) if combine_operator == "INSTR": - condition_sql = f" {combine_operator} {' AND '.join([f'({key} = :{key})' for key in conditions.keys()])}" + condition_sql = f" AND ".join( + [f"INSTR({key}, :{key})" for key in conditions.keys()] + ) else: condition_sql = f" {combine_operator} ".join( [f"{key} = :{key}" for key in conditions.keys()] diff --git a/backend/src/test/test_database.py b/backend/src/test/test_database.py new file mode 100644 index 00000000..f7fc94f5 --- /dev/null +++ b/backend/src/test/test_database.py @@ -0,0 +1,45 @@ +from module.database import BangumiDatabase +from module.models import BangumiData + + +def test_database(): + TEST_PATH = "test/test.db" + test_data = BangumiData( + id=1, + official_title="test", + year="2021", + title_raw="test", + season=1, + season_raw="第一季", + group_name="test", + dpi="720p", + source="test", + subtitle="test", + eps_collect=False, + offset=0, + filter=["720p", "\\d+-\\d+"], + rss_link=["test"], + poster_link="/test/test.jpg", + added=False, + rule_name=None, + save_path=None, + deleted=False, + ) + with BangumiDatabase(database=TEST_PATH) as database: + # create table + database.update_table() + # insert + database.insert_one(test_data) + assert database.search_id(1) == test_data + + # update + test_data.official_title = "test2" + database.update_one(test_data) + assert database.search_id(1) == test_data + + # search poster + assert database.match_poster("test") == "/test/test.jpg" + + # delete + database.delete_one(1) + assert database.search_id(1) is None