2024-03-27 12:53:46 +00:00
|
|
|
import datetime
|
|
|
|
|
2023-08-17 13:55:41 +00:00
|
|
|
import pytest
|
2024-05-02 08:26:32 +00:00
|
|
|
import time_machine
|
2024-03-15 18:58:06 +00:00
|
|
|
|
2023-04-09 09:37:04 +00:00
|
|
|
from canaille.app import models
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
|
2023-05-20 15:17:46 +00:00
|
|
|
def test_model_comparison(testclient, backend):
|
2023-04-09 09:37:04 +00:00
|
|
|
foo1 = models.User(
|
2023-05-17 16:19:05 +00:00
|
|
|
user_name="foo",
|
|
|
|
family_name="foo",
|
|
|
|
formatted_name="foo",
|
|
|
|
)
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(foo1)
|
2023-04-09 09:37:04 +00:00
|
|
|
bar = models.User(
|
2023-05-17 16:19:05 +00:00
|
|
|
user_name="bar",
|
|
|
|
family_name="bar",
|
2023-05-18 14:35:14 +00:00
|
|
|
formatted_name="bar",
|
2023-05-17 16:19:05 +00:00
|
|
|
)
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(bar)
|
2024-04-14 15:30:59 +00:00
|
|
|
foo2 = backend.get(models.User, id=foo1.id)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
assert foo1 == foo2
|
|
|
|
assert foo1 != bar
|
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(foo1)
|
|
|
|
backend.delete(bar)
|
2023-05-18 14:35:14 +00:00
|
|
|
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-05-20 16:28:31 +00:00
|
|
|
def test_model_lifecycle(testclient, backend):
|
2023-04-09 09:37:04 +00:00
|
|
|
user = models.User(
|
2023-05-17 16:19:05 +00:00
|
|
|
user_name="user_name",
|
|
|
|
family_name="family_name",
|
|
|
|
formatted_name="formatted_name",
|
|
|
|
)
|
|
|
|
|
2024-04-05 12:53:49 +00:00
|
|
|
assert not user.id
|
2024-04-10 13:44:11 +00:00
|
|
|
assert not backend.query(models.User)
|
|
|
|
assert not backend.query(models.User, id=user.id)
|
|
|
|
assert not backend.query(models.User, id="invalid")
|
2024-04-14 15:30:59 +00:00
|
|
|
assert not backend.get(models.User, id=user.id)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-10 13:44:11 +00:00
|
|
|
assert backend.query(models.User) == [user]
|
|
|
|
assert backend.query(models.User, id=user.id) == [user]
|
|
|
|
assert not backend.query(models.User, id="invalid")
|
2024-04-14 15:30:59 +00:00
|
|
|
assert backend.get(models.User, id=user.id) == user
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
user.family_name = "new_family_name"
|
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.family_name == "new_family_name"
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 20:51:58 +00:00
|
|
|
backend.reload(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.family_name == "family_name"
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-10 13:44:11 +00:00
|
|
|
assert not backend.query(models.User, id=user.id)
|
2024-04-14 15:30:59 +00:00
|
|
|
assert not backend.get(models.User, id=user.id)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(user)
|
2024-04-28 14:18:24 +00:00
|
|
|
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-05-20 15:17:46 +00:00
|
|
|
def test_model_attribute_edition(testclient, backend):
|
2023-04-09 09:37:04 +00:00
|
|
|
user = models.User(
|
2023-05-17 16:19:05 +00:00
|
|
|
user_name="user_name",
|
|
|
|
family_name="family_name",
|
|
|
|
formatted_name="formatted_name",
|
|
|
|
display_name="display_name",
|
2023-06-22 13:14:07 +00:00
|
|
|
emails=["email1@user.com", "email2@user.com"],
|
2023-05-17 16:19:05 +00:00
|
|
|
)
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.user_name == "user_name"
|
|
|
|
assert user.family_name == "family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
assert user.emails == ["email1@user.com", "email2@user.com"]
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
user = backend.get(models.User, id=user.id)
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.user_name == "user_name"
|
|
|
|
assert user.family_name == "family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
assert user.emails == ["email1@user.com", "email2@user.com"]
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
user.family_name = "new_family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
user.emails = ["email1@user.com"]
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.family_name == "new_family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
assert user.emails == ["email1@user.com"]
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
user = backend.get(models.User, id=user.id)
|
2023-11-15 17:20:13 +00:00
|
|
|
assert user.family_name == "new_family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
assert user.emails == ["email1@user.com"]
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2023-11-15 17:20:13 +00:00
|
|
|
user.display_name = ""
|
|
|
|
assert not user.display_name
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
assert not user.display_name
|
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
|
2023-05-20 15:17:46 +00:00
|
|
|
def test_model_indexation(testclient, backend):
|
2023-04-09 09:37:04 +00:00
|
|
|
user = models.User(
|
2023-05-17 16:19:05 +00:00
|
|
|
user_name="user_name",
|
|
|
|
family_name="family_name",
|
|
|
|
formatted_name="formatted_name",
|
2023-06-22 13:14:07 +00:00
|
|
|
emails=["email1@user.com", "email2@user.com"],
|
2023-05-17 16:19:05 +00:00
|
|
|
)
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
assert backend.get(models.User, family_name="family_name") == user
|
|
|
|
assert not backend.get(models.User, family_name="new_family_name")
|
|
|
|
assert backend.get(models.User, emails=["email1@user.com"]) == user
|
|
|
|
assert backend.get(models.User, emails=["email2@user.com"]) == user
|
|
|
|
assert not backend.get(models.User, emails=["email3@user.com"])
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
user.family_name = "new_family_name"
|
2023-06-22 13:14:07 +00:00
|
|
|
user.emails = ["email2@user.com"]
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
assert backend.get(models.User, family_name="family_name") != user
|
|
|
|
assert backend.get(models.User, emails=["email1@user.com"]) != user
|
|
|
|
assert not backend.get(models.User, emails=["email3@user.com"])
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
assert not backend.get(models.User, family_name="family_name")
|
|
|
|
assert backend.get(models.User, family_name="new_family_name") == user
|
|
|
|
assert not backend.get(models.User, emails=["email1@user.com"])
|
|
|
|
assert backend.get(models.User, emails=["email2@user.com"]) == user
|
|
|
|
assert not backend.get(models.User, emails=["email3@user.com"])
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
2024-04-14 15:30:59 +00:00
|
|
|
assert not backend.get(models.User, family_name="family_name")
|
|
|
|
assert not backend.get(models.User, family_name="new_family_name")
|
|
|
|
assert not backend.get(models.User, emails=["email1@user.com"])
|
|
|
|
assert not backend.get(models.User, emails=["email2@user.com"])
|
|
|
|
assert not backend.get(models.User, emails=["email3@user.com"])
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
|
2023-11-21 13:27:57 +00:00
|
|
|
def test_fuzzy_unique_attribute(user, moderator, admin, backend):
|
2024-04-10 13:44:11 +00:00
|
|
|
assert set(backend.query(models.User)) == {user, moderator, admin}
|
2024-04-10 13:52:16 +00:00
|
|
|
assert set(backend.fuzzy(models.User, "Jack")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "Jack", ["formatted_name"])) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "Jack", ["user_name"])) == set()
|
|
|
|
assert set(backend.fuzzy(models.User, "Jack", ["user_name", "formatted_name"])) == {
|
2023-04-09 09:37:04 +00:00
|
|
|
moderator
|
|
|
|
}
|
2024-04-10 13:52:16 +00:00
|
|
|
assert set(backend.fuzzy(models.User, "moderator")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "oderat")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "oDeRat")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "ack")) == {moderator}
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
|
2023-11-21 13:27:57 +00:00
|
|
|
def test_fuzzy_multiple_attribute(user, moderator, admin, backend):
|
2024-04-10 13:44:11 +00:00
|
|
|
assert set(backend.query(models.User)) == {user, moderator, admin}
|
2024-04-10 13:52:16 +00:00
|
|
|
assert set(backend.fuzzy(models.User, "jack@doe.com")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "jack@doe.com", ["emails"])) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "jack@doe.com", ["formatted_name"])) == set()
|
|
|
|
assert set(
|
|
|
|
backend.fuzzy(models.User, "jack@doe.com", ["emails", "formatted_name"])
|
|
|
|
) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "ack@doe.co")) == {moderator}
|
|
|
|
assert set(backend.fuzzy(models.User, "doe.com")) == {user, moderator, admin}
|
2023-11-21 13:27:57 +00:00
|
|
|
|
|
|
|
|
2023-05-20 15:17:46 +00:00
|
|
|
def test_model_references(testclient, user, foo_group, admin, bar_group, backend):
|
2024-04-01 16:38:12 +00:00
|
|
|
assert foo_group.members == [user]
|
|
|
|
assert user.groups == [foo_group]
|
2024-04-10 13:44:11 +00:00
|
|
|
assert foo_group in backend.query(models.Group, members=user)
|
|
|
|
assert user in backend.query(models.User, groups=foo_group)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
assert user not in bar_group.members
|
|
|
|
assert bar_group not in user.groups
|
|
|
|
user.groups = user.groups + [bar_group]
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2024-04-14 20:51:58 +00:00
|
|
|
backend.reload(bar_group)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
assert user in bar_group.members
|
|
|
|
assert bar_group in user.groups
|
|
|
|
|
|
|
|
bar_group.members = [admin]
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(bar_group)
|
2024-04-14 20:51:58 +00:00
|
|
|
backend.reload(user)
|
2023-05-17 16:19:05 +00:00
|
|
|
|
|
|
|
assert user not in bar_group.members
|
|
|
|
assert bar_group not in user.groups
|
|
|
|
|
|
|
|
|
2024-03-27 12:53:46 +00:00
|
|
|
def test_model_creation_edition_datetime(testclient, backend):
|
|
|
|
if "ldap" in backend.__class__.__module__:
|
|
|
|
pytest.skip()
|
|
|
|
|
2024-05-02 08:26:32 +00:00
|
|
|
with time_machine.travel("2020-01-01 02:00:00+00:00", tick=False):
|
2024-03-27 12:53:46 +00:00
|
|
|
user = models.User(
|
|
|
|
user_name="foo",
|
|
|
|
family_name="foo",
|
|
|
|
formatted_name="foo",
|
|
|
|
)
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2024-03-27 12:53:46 +00:00
|
|
|
assert user.created == datetime.datetime(
|
|
|
|
2020, 1, 1, 2, tzinfo=datetime.timezone.utc
|
|
|
|
)
|
|
|
|
assert user.last_modified == datetime.datetime(
|
|
|
|
2020, 1, 1, 2, tzinfo=datetime.timezone.utc
|
|
|
|
)
|
|
|
|
|
2024-05-02 08:26:32 +00:00
|
|
|
with time_machine.travel("2021-01-01 02:00:00+00:00", tick=False):
|
2024-03-27 12:53:46 +00:00
|
|
|
user.family_name = "bar"
|
2024-04-14 18:31:43 +00:00
|
|
|
backend.save(user)
|
2024-03-27 12:53:46 +00:00
|
|
|
assert user.created == datetime.datetime(
|
|
|
|
2020, 1, 1, 2, tzinfo=datetime.timezone.utc
|
|
|
|
)
|
|
|
|
assert user.last_modified == datetime.datetime(
|
|
|
|
2021, 1, 1, 2, tzinfo=datetime.timezone.utc
|
|
|
|
)
|
|
|
|
|
2024-04-14 18:37:52 +00:00
|
|
|
backend.delete(user)
|