import sys from typing import List import pytest from tinydb.storages import MemoryStorage from grung.db import GrungDB from grung.types import Field, Record class User(Record): _fields = [Field("name"), Field("email", unique=True)] class Group(Record): _fields = [Field("name", unique=True), Field("users", List[User])] @pytest.fixture def db(): _db = GrungDB.with_schema(sys.modules[__name__], storage=MemoryStorage) _db.create_table(User) _db.create_table(Group) yield _db print(_db) def test_crud(db): user = User(name="john", 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.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 # pointers players = Group(name="players", users=[john_something]) players = db.save(players) players.users[0]["name"] = "fnord" db.save(players) # modify records players.users = [] db.save(players) after_update = db.Group.get(doc_id=players.doc_id) assert after_update.users == [] # delete db.delete(players) assert len(db.Group) == 0