grung-db/test/test_db.py

98 lines
2.9 KiB
Python
Raw Normal View History

2025-09-24 19:51:39 -07:00
import pytest
2025-09-28 11:11:34 -07:00
from tinydb import Query
2025-09-24 19:51:39 -07:00
from tinydb.storages import MemoryStorage
from grung import examples
2025-09-24 19:51:39 -07:00
from grung.db import GrungDB
2025-09-27 15:13:17 -07:00
from grung.exceptions import PointerReferenceError, UniqueConstraintError
2025-09-24 19:51:39 -07:00
@pytest.fixture
def db():
_db = GrungDB.with_schema(examples, storage=MemoryStorage)
2025-09-24 19:51:39 -07:00
yield _db
print(_db)
def test_crud(db):
2025-09-27 15:13:17 -07:00
user = examples.User(name="john", number=23, email="john@foo")
2025-09-24 19:51:39 -07:00
assert user.uid
assert user._metadata.fields["uid"].unique
# insert
john_something = db.save(user)
last_insert_id = john_something.doc_id
# read back
assert db.User.get(doc_id=last_insert_id) == john_something
assert john_something.name == user.name
2025-09-27 15:13:17 -07:00
assert john_something.number == 23
2025-09-24 19:51:39 -07:00
assert john_something.email == user.email
assert john_something.uid == user.uid
# update
john_something.name = "james?"
before_update = db.User.get(doc_id=john_something.doc_id)
after_update = db.save(john_something)
assert after_update == john_something
assert before_update != after_update
2025-09-27 15:13:17 -07:00
# delete
db.delete(john_something)
assert len(db.User) == 0
2025-09-24 19:51:39 -07:00
2025-09-27 15:13:17 -07:00
def test_pointers(db):
user = examples.User(name="john", email="john@foo")
players = examples.Group(name="players", members=[user], groups=[])
2025-09-27 15:13:17 -07:00
with pytest.raises(PointerReferenceError):
players = db.save(players)
user = db.save(user)
players.members[0] = user
2025-09-27 15:13:17 -07:00
players = db.save(players)
assert players.members[0] == user
def test_subgroups(db):
kirk = db.save(examples.User(name="James T. Kirk", email="riskybiznez@starfleet"))
pike = db.save(examples.User(name="Christopher Pike", email="hitit@starfleet"))
tos = db.save(examples.Group(name="The Original Series", members=[kirk]))
snw = db.save(examples.Group(name="Strange New Worlds", members=[pike]))
starfleet = db.save(examples.Group(name="Starfleet", groups=[tos, snw]))
assert tos in starfleet.groups
assert snw in starfleet.groups
assert kirk in set([user for group in starfleet.groups for user in group.members])
2025-09-27 12:09:43 -07:00
def test_unique(db):
user1 = examples.User(name="john", email="john@foo")
user2 = examples.User(name="john", email="john@foo")
user1 = db.save(user1)
with pytest.raises(UniqueConstraintError):
user2 = db.save(user2)
db.save(user1)
2025-09-28 11:11:34 -07:00
def test_search(db):
kirk = db.save(examples.User(name="Captain James T. Kirk", email="riskybiznez@starfleet"))
bones = db.save(examples.User(name="Doctor McCoy", email="dammitjim@starfleet"))
ricky = db.save(examples.User(name="Ensign Ricky Redshirt", email="invincible@starfleet"))
crew = db.save(examples.Group(name="Crew", members=[kirk, bones, ricky]))
User = Query()
captains = db.User.search(User.name.matches("Captain"))
assert len(captains) == 1
Group = Query()
crew = db.Group.search(Group.name == "Crew")[0]
assert kirk in crew.members
assert bones in crew.members
assert ricky in crew.members