Add CounterBot class and test file

This commit is contained in:
Johannes Rothe 2021-12-28 17:03:50 +01:00
parent d916aead52
commit fb4318693b
4 changed files with 84 additions and 1 deletions

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
# ---> Python *.db
*.swp
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]

0
__init__.py Normal file
View File

65
counter_bot.py Normal file
View File

@ -0,0 +1,65 @@
import sqlite3
from typing import List, Tuple
class CounterBot:
def __init__(self, db_name: str) -> None:
self.con = sqlite3.connect(db_name)
self.con.row_factory = sqlite3.Row
self.try_create_tables()
def try_create_tables(self) -> bool:
try:
with self.con:
self.con.execute(
"CREATE TABLE presence (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME VARCHAR UNIQUE, IS_PRESENT BOOL)"
)
print("Creating new table")
except sqlite3.OperationalError:
print("Table already exists in database, nothing to create.")
return True
def update_presence(self, name: str, is_present: bool) -> bool:
present_int = 1 if is_present else 0
with self.con:
self.con.execute(
f"INSERT INTO presence (NAME, IS_PRESENT) VALUES ('{name}', '{present_int}') ON CONFLICT(name) DO UPDATE SET is_present=excluded.is_present"
)
return True
return False
def get_full_entries(self) -> List[Tuple]:
with self.con:
return [
(x["name"], x["is_present"])
for x in self.con.execute(
"SELECT name, is_present FROM presence ORDER BY name"
)
]
def get_present_names(self) -> List[str]:
with self.con:
return [
x["name"]
for x in self.con.execute(
"SELECT name FROM presence WHERE is_present ORDER BY name"
)
]
def get_present_count(self) -> int:
with self.con:
return self.con.execute(
"SELECT COUNT(name) FROM presence WHERE is_present"
).fetchone()[0]
def clear_rows(self) -> None:
with self.con:
self.con.execute("DELETE FROM presence")
def main() -> None:
counter_bot = CounterBot("counter.db")
if __name__ == "__main__":
main()

17
test_counter_bot.py Normal file
View File

@ -0,0 +1,17 @@
import sqlite3
from .counter_bot import CounterBot
TEST_DB_NAME = "test.db"
counter_bot = CounterBot(TEST_DB_NAME)
counter_bot.clear_rows()
def test_get_present_count() -> None:
counter_bot.update_presence("Alice", True)
counter_bot.update_presence("Bob", True)
counter_bot.update_presence("Bob", False)
counter_bot.update_presence("Bob", True)
assert counter_bot.get_present_count() == 2
def test_present_names() -> None:
assert counter_bot.get_present_names() == ["Alice", "Bob"]