import pytest from tinydb.storages import MemoryStorage from grung import examples from grung.db import GrungDB from grung.exceptions import PointerReferenceError, UniqueConstraintError @pytest.fixture def db(): _db = GrungDB.with_schema(examples, storage=MemoryStorage) yield _db print(_db) def test_crud(db): user = examples.User(name="john", number=23, email="john@foo") 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 assert john_something.number == 23 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 # delete db.delete(john_something) assert len(db.User) == 0 def test_pointers(db): user = examples.User(name="john", email="john@foo") players = examples.Group(name="players", users=[user]) with pytest.raises(PointerReferenceError): players = db.save(players) user = db.save(user) players.users[0] = user players = db.save(players) assert players.users[0] == user 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)