model.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import peewee
  2. import pytest
  3. import lc.config as c
  4. import lc.error as e
  5. import lc.request as r
  6. import lc.model as m
  7. class TestDB:
  8. def setup_method(self, _):
  9. c.DB.init(":memory:")
  10. c.DB.create_tables(m.MODELS)
  11. def teardown_method(self, _):
  12. c.DB.close()
  13. def mk_user(self, name="gdritter", password="foo") -> m.User:
  14. return m.User.from_request(r.User(
  15. name=name,
  16. password=password,
  17. ))
  18. def test_create_user(self):
  19. name = "gdritter"
  20. u = self.mk_user(name=name)
  21. # it should be the only thing in the db
  22. all_users = m.User.select()
  23. assert len(all_users) == 1
  24. assert all_users[0].id == u.id
  25. assert all_users[0].name == name
  26. # we should be able to find it with the given name, too
  27. named_user = m.User.get(m.User.name == name)
  28. assert named_user.id == u.id
  29. assert named_user.name == name
  30. def test_user_passwords(self):
  31. name = "gdritter"
  32. password = "foo"
  33. u = self.mk_user(name=name, password=password)
  34. print(u.name, u.passhash)
  35. assert u.authenticate(password)
  36. assert u.authenticate("wrong password") is False
  37. def test_no_duplicate_users(self):
  38. name = "gdritter"
  39. u1 = self.mk_user(name=name)
  40. with pytest.raises(e.UserExists):
  41. u2 = self.mk_user(name=name)
  42. def test_get_or_create_tag(self):
  43. u = self.mk_user()
  44. tag_name = "food"
  45. t = m.Tag.get_or_create_tag(u, tag_name)
  46. # we should be able to find the tag with the given name
  47. named_tags = m.Tag.select(m.Tag.user == u and m.Tag.name == tag_name)
  48. assert len(named_tags) == 1
  49. # subsequent calls to get_or_create_tag should return the same db row
  50. t2 = m.Tag.get_or_create_tag(u, tag_name)
  51. assert t.id == t2.id
  52. def test_find_hierarchy(self):
  53. u = self.mk_user()
  54. t = m.Tag.get_or_create_tag(u, "food/bread/rye")
  55. # this should have created three DB rows: for 'food', for
  56. # 'food/bread', and for 'food/bread/rye':
  57. assert len(m.Tag.select()) == 3
  58. # searching for a prefix of the tag should yield the same
  59. # parent tag
  60. assert t.parent.id == m.Tag.get(name="food/bread").id
  61. assert t.parent.parent.id == m.Tag.get(name="food").id
  62. # creating a new hierarchical tag with a shared prefix should
  63. # only create the new child tag
  64. t2 = m.Tag.get_or_create_tag(u, "food/bread/baguette")
  65. print([t.name for t in m.Tag.select()])
  66. assert len(m.Tag.select()) == 4
  67. # it should share the same parent tags
  68. assert t2.parent.id == t.parent.id
  69. assert t2.parent.parent.id == t.parent.parent.id
  70. # trying to get a hierarchical tag should result in the same
  71. # one already entered
  72. assert t.id == m.Tag.get(name="food/bread/rye").id
  73. assert t2.id == m.Tag.get(name="food/bread/baguette").id