Added admin interface to manage channels and enabled plugins (#9)
* Added base admin login/logout flows * Ignore local database * Channel model * Admin interface for channels and plugins * Added database tests along with workflows * Added some docstrings * Ignore .coverage file * Creating plugins docs WIP * Documentation * Black everything * Some documentation * Coverage for the plugins package as well * DB Fixes * Absolute FROM in Dockerfile * Database and logging fixes * Slack: Support private channels * Added pre-commit * black'd * Fixed UserQuery.create * Fixed ChannelPluginQuery.create exists call * Added ChannelPlugin menu for debugging * Ignore sqlite databases * Updated contributing docs
This commit is contained in:
parent
456d144a7d
commit
57b413dd1b
45 changed files with 2210 additions and 421 deletions
109
tests/test_db.py
Normal file
109
tests/test_db.py
Normal file
|
@ -0,0 +1,109 @@
|
|||
import os.path
|
||||
import tempfile
|
||||
from dataclasses import dataclass
|
||||
from unittest import mock
|
||||
|
||||
import dataset
|
||||
import pytest
|
||||
|
||||
from butterrobot import db
|
||||
|
||||
|
||||
@dataclass
|
||||
class DummyItem:
|
||||
id: int
|
||||
foo: str
|
||||
|
||||
|
||||
class DummyQuery(db.Query):
|
||||
tablename = "dummy"
|
||||
obj = DummyItem
|
||||
|
||||
|
||||
class MockDatabase:
|
||||
def __init__(self):
|
||||
self.temp_dir = tempfile.TemporaryDirectory()
|
||||
|
||||
def __enter__(self):
|
||||
db_path = os.path.join(self.temp_dir.name, "db.sqlite")
|
||||
db.db = dataset.connect(f"sqlite:///{db_path}")
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.temp_dir.cleanup()
|
||||
|
||||
|
||||
def test_query_create_ok():
|
||||
with MockDatabase():
|
||||
assert DummyQuery.create(foo="bar")
|
||||
|
||||
|
||||
def test_query_delete_ok():
|
||||
with MockDatabase():
|
||||
item_id = DummyQuery.create(foo="bar")
|
||||
assert DummyQuery.delete(item_id)
|
||||
|
||||
|
||||
def test_query_exists_by_id_ok():
|
||||
with MockDatabase():
|
||||
assert not DummyQuery.exists(id=1)
|
||||
item_id = DummyQuery.create(foo="bar")
|
||||
assert DummyQuery.exists(id=item_id)
|
||||
|
||||
|
||||
def test_query_exists_by_attribute_ok():
|
||||
with MockDatabase():
|
||||
assert not DummyQuery.exists(id=1)
|
||||
item_id = DummyQuery.create(foo="bar")
|
||||
assert DummyQuery.exists(foo="bar")
|
||||
|
||||
|
||||
def test_query_get_ok():
|
||||
with MockDatabase():
|
||||
item_id = DummyQuery.create(foo="bar")
|
||||
item = DummyQuery.get(id=item_id)
|
||||
assert item.id
|
||||
|
||||
|
||||
def test_query_all_ok():
|
||||
with MockDatabase():
|
||||
assert len(list(DummyQuery.all())) == 0
|
||||
[DummyQuery.create(foo="bar") for i in range(0, 3)]
|
||||
assert len(list(DummyQuery.all())) == 3
|
||||
|
||||
|
||||
def test_update_ok():
|
||||
with MockDatabase():
|
||||
expected = "bar2"
|
||||
item_id = DummyQuery.create(foo="bar")
|
||||
assert DummyQuery.update(item_id, foo=expected)
|
||||
item = DummyQuery.get(id=item_id)
|
||||
assert item.foo == expected
|
||||
|
||||
|
||||
def test_create_user_sets_password_ok():
|
||||
password = "password"
|
||||
with MockDatabase():
|
||||
user_id = db.UserQuery.create(username="foo", password=password)
|
||||
user = db.UserQuery.get(id=user_id)
|
||||
assert user.password == db.UserQuery._hash_password(password)
|
||||
|
||||
|
||||
def test_user_check_credentials_ok():
|
||||
with MockDatabase():
|
||||
username = "foo"
|
||||
password = "bar"
|
||||
user_id = db.UserQuery.create(username=username, password=password)
|
||||
user = db.UserQuery.get(id=user_id)
|
||||
user = db.UserQuery.check_credentials(username, password)
|
||||
assert isinstance(user, db.UserQuery.obj)
|
||||
|
||||
|
||||
def test_user_check_credentials_ko():
|
||||
with MockDatabase():
|
||||
username = "foo"
|
||||
password = "bar"
|
||||
user_id = db.UserQuery.create(username=username, password=password)
|
||||
user = db.UserQuery.get(id=user_id)
|
||||
assert not db.UserQuery.check_credentials(username, "error")
|
||||
assert not db.UserQuery.check_credentials("error", password)
|
||||
assert not db.UserQuery.check_credentials("error", "error")
|
Loading…
Add table
Add a link
Reference in a new issue