2025-09-29 23:10:33 -07:00
|
|
|
from pprint import pprint as print
|
|
|
|
|
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
|
|
|
|
|
2025-09-24 21:34:32 -07:00
|
|
|
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():
|
2025-09-24 21:34:32 -07:00
|
|
|
_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")
|
2025-09-29 23:10:33 -07:00
|
|
|
players = examples.Group(name="players", members=[user])
|
2025-09-27 15:13:17 -07:00
|
|
|
|
|
|
|
with pytest.raises(PointerReferenceError):
|
|
|
|
players = db.save(players)
|
|
|
|
|
|
|
|
user = db.save(user)
|
2025-09-29 23:10:33 -07:00
|
|
|
players = db.save(examples.Group(name="players", members=[user]))
|
|
|
|
|
2025-09-29 23:21:33 -07:00
|
|
|
user = db.table("User").get(doc_id=user.doc_id)
|
2025-09-29 23:10:33 -07:00
|
|
|
assert user.groups.uid == players.uid
|
2025-09-27 15:13:17 -07:00
|
|
|
|
2025-09-29 23:10:33 -07:00
|
|
|
assert players.members[0].groups.uid == players.uid
|
2025-09-28 10:33:44 -07:00
|
|
|
|
|
|
|
|
|
|
|
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]))
|
2025-09-29 23:40:25 -07:00
|
|
|
tos = db.table("Group").get(doc_id=tos.doc_id)
|
|
|
|
snw = db.table("Group").get(doc_id=snw.doc_id)
|
2025-09-28 10:33:44 -07:00
|
|
|
assert tos in starfleet.groups
|
|
|
|
assert snw in starfleet.groups
|
2025-09-29 23:10:33 -07:00
|
|
|
|
2025-09-29 23:40:25 -07:00
|
|
|
assert tos.parent.uid == starfleet.uid
|
|
|
|
|
2025-09-29 23:10:33 -07:00
|
|
|
unique_users = set([user for group in starfleet.groups for user in group.members])
|
|
|
|
|
2025-09-29 23:21:33 -07:00
|
|
|
kirk = db.table("User").get(doc_id=kirk.doc_id)
|
2025-09-29 23:10:33 -07:00
|
|
|
assert kirk in unique_users
|
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):
|
2025-09-29 23:10:33 -07:00
|
|
|
# create crew members
|
2025-09-28 11:11:34 -07:00
|
|
|
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"))
|
|
|
|
|
2025-09-29 23:10:33 -07:00
|
|
|
# create the crew record
|
2025-09-28 11:11:34 -07:00
|
|
|
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
|
|
|
|
|
2025-09-29 23:10:33 -07:00
|
|
|
# update the crew members so they have the backreference to crew
|
2025-09-29 23:21:33 -07:00
|
|
|
kirk = db.table("User").get(doc_id=kirk.doc_id)
|
|
|
|
bones = db.table("User").get(doc_id=bones.doc_id)
|
|
|
|
ricky = db.table("User").get(doc_id=ricky.doc_id)
|
2025-09-29 23:10:33 -07:00
|
|
|
|
2025-09-28 11:11:34 -07:00
|
|
|
assert kirk in crew.members
|
|
|
|
assert bones in crew.members
|
|
|
|
assert ricky in crew.members
|
2025-09-28 12:12:05 -07:00
|
|
|
|
|
|
|
Group = Query()
|
|
|
|
crew = db.Group.search(Group.name == "Crew", recurse=False)
|
|
|
|
assert f"User::{kirk.uid}" in crew[0].members
|