def test_usergroup_eq(): usergroup1 = Usergroup(4) usergroup2 = Usergroup(4) usergroup3 = Usergroup(7) assert usergroup1 == usergroup2 assert usergroup1 != usergroup3
def test_insert_retrieve_delete_group_user(test_database): user = User(1, name="test") test_database.insert_group_user(group=Usergroup(4), user=user) retrieved_group, retrieved_user = test_database.retrieve_group_user( where="group_id=%s AND user_id=%s", where_values=(4, 1)) assert retrieved_group.id == 4 assert retrieved_group.name == "Global Moderation Team" assert retrieved_group.mode is None assert retrieved_user.id == 1 assert retrieved_user.name == "test" test_database.delete_group_user(group=Usergroup(4), user=user) retrieved_group_user_relation = test_database.retrieve_group_user( where="group_id=%s AND user_id=%s", where_values=(4, 1)) assert retrieved_group_user_relation is None
def test_insert_retrieve_multiple_group_users(test_database): user = User(1, name="test") test_database.insert_group_user(group=Usergroup(4), user=user) test_database.insert_group_user(group=Usergroup(4), user=User(2, name="test2")) test_database.insert_group_user(group=Usergroup(7), user=user) retrieved_group_user_relations = test_database.retrieve_group_users( where="user_id=%s", where_values=(1, )) retrieved_groups = [] retrieved_users = [] for retrieved_group, retrieved_user in retrieved_group_user_relations: retrieved_groups.append(retrieved_group) retrieved_users.append(retrieved_user) assert Usergroup(4) in retrieved_groups assert Usergroup(7) in retrieved_groups assert retrieved_users == [user, user]
async def test_insert_retrieve_event_group_change_hybrid(test_database): event_old = Event(_type="add", time=from_string("2020-01-01 00:00:00"), user=User(2, name="sometwo"), group=Usergroup(7, mode="osu")) event = Event(_type="add", time=datetime.utcnow(), user=User(2, name="sometwo"), group=Usergroup(7, mode="taiko")) test_database.insert_event(event_old) test_database.insert_event(event) retrieved_event = await test_database.retrieve_event("type=%s", ("add", ), order_by="time DESC") assert retrieved_event.type == event.type assert retrieved_event.time == event.time assert retrieved_event.group == event.group assert retrieved_event.group.mode == event.group.mode assert retrieved_event.user == event.user assert retrieved_event == event
async def test_insert_retrieve_event_group_change(test_database): event = Event(_type="add", time=datetime.utcnow(), user=User(2, name="sometwo"), group=Usergroup(7, mode="osu")) test_database.insert_event(event) retrieved_event = await test_database.retrieve_event("type=%s", ("add", )) assert retrieved_event.type == event.type assert retrieved_event.time == event.time assert retrieved_event.group == event.group assert retrieved_event.group.mode == event.group.mode assert retrieved_event.user == event.user assert retrieved_event == event
def retrieve_group_users( self, where: str, where_values: tuple = None ) -> Generator[Tuple[Usergroup, User], None, None]: """Returns a generator of all group user relations from the database matching the given WHERE clause.""" fetched_rows = self.retrieve_table_data(table="group_users", where=where, where_values=where_values, selection="group_id, user_id") for row in (fetched_rows or []): group = Usergroup(row[0]) user = self.retrieve_user("id=%s", (row[1], )) yield (group, user)
async def retrieve_events( self, where: str, where_values: tuple = None, extensive: bool = False) -> Generator[Event, None, None]: """Returns an asynchronous generator of all events from the database matching the given WHERE clause. Optionally retrieve extensively so that more can be queried (e.g. user name, beatmap creator/artist/title).""" if not extensive: fetched_rows = self.__fetch_events(where, where_values) else: fetched_rows = self.__fetch_events_extensive(where, where_values) for row in (fetched_rows or []): await asyncio.sleep( 0 ) # Return control back to the event loop, granting other tasks a window to start/resume. _type = row[0] time = row[1] beatmapset = self.retrieve_beatmapset( "id=%s", (row[2], )) if row[2] else None discussion = self.retrieve_discussion( "id=%s", (row[3], )) if row[3] else None user = self.retrieve_user("id=%s", (row[4], )) if row[4] else None group = Usergroup( row[5], mode=row[6] if row[6] else None) if row[5] else None newspost = self.retrieve_newspost("id=%s", (row[7], )) if row[7] else None content = row[8] yield Event(_type, time, beatmapset, discussion, user, group, newspost, content=content)
def test_usergroup_str(): usergroup = Usergroup(4) assert str(usergroup) == "Global Moderation Team"
def test_usergroup_hash(): assert hash(Usergroup(4))
def test_usergroup_eq_different_types(): assert Usergroup(4) != "string"
def test_usergroup_str_id(): usergroup = Usergroup("4") assert usergroup.id == 4 assert usergroup.name == "Global Moderation Team"
def test_usergroup(): usergroup = Usergroup(4) assert usergroup.id == 4 assert usergroup.name == "Global Moderation Team"
async def retrieve_events( self, where: str, where_values: tuple = None, group_by: str = None, order_by: str = None, limit: int = None, extensive: bool = False) -> Generator[Event, None, None]: """Returns an asynchronous generator of all events from the database matching the given WHERE clause. Optionally retrieve extensively so that more can be queried (e.g. user name, beatmap creator/artist/title).""" if not extensive: fetched_rows = self.__fetch_events(where, where_values, order_by, limit) else: fetched_rows = self.__fetch_events_extensive( where, where_values, order_by, limit) for row in (fetched_rows or []): await asyncio.sleep( 0 ) # Return control back to the event loop, granting other tasks a window to start/resume. # Treat deleted beatmapsets/discussions as if not stored. with suppress(DeletedContextError): _type = row[0] time = row[1] beatmapset = self.retrieve_beatmapset( "id=%s", (row[2], )) if row[2] else None discussion = self.retrieve_discussion( "id=%s", (row[3], ), beatmapset=beatmapset) if row[3] else None user = self.retrieve_user("id=%s", (row[4], )) if row[4] else None group = Usergroup(row[5], mode=row[6] if row[6] else None) if row[5] else None newspost = self.retrieve_newspost( "id=%s", (row[7], )) if row[7] else None content = row[8] if beatmapset: status_time = time if _type == types.SEV: reset_event = await self.retrieve_event( where="(type=%s OR type=%s) AND discussion_id=%s", where_values=("disqualify", "nomination_reset", discussion.id)) if reset_event: status_time = reset_event.time # Dependent on when the event happened, hence why this is here and not in `retrieve_beatmapset`. beatmapset.status = self.retrieve_beatmapset_status( where="beatmapset_id=%s AND time < %s", where_values=(beatmapset.id, status_time), order_by="time DESC") yield Event(_type, time, beatmapset, discussion, user, group, newspost, content=content)