1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-08-02 20:15:24 +02:00

feat: Add Households to Mealie (#3970)

This commit is contained in:
Michael Genson 2024-08-22 10:14:32 -05:00 committed by GitHub
parent 0c29cef17d
commit eb170cc7e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
315 changed files with 6975 additions and 3577 deletions

View file

@ -1,7 +1,9 @@
import json
from collections.abc import Generator
from uuid import UUID
from pytest import fixture
from sqlalchemy.orm import Session
from starlette.testclient import TestClient
from mealie.db.db_setup import session_context
@ -12,7 +14,7 @@ from tests.utils import api_routes
from tests.utils.factories import random_string
def build_unique_user(group: str, api_client: TestClient) -> utils.TestUser:
def build_unique_user(session: Session, group: str, api_client: TestClient) -> utils.TestUser:
group = group or random_string(12)
registration = utils.user_registration_factory()
@ -26,19 +28,98 @@ def build_unique_user(group: str, api_client: TestClient) -> utils.TestUser:
user_data = api_client.get(api_routes.users_self, headers=token).json()
assert token is not None
user_id = user_data.get("id")
group_id = user_data.get("groupId")
household_id = user_data.get("householdId")
if not isinstance(user_id, UUID):
user_id = UUID(user_id)
if not isinstance(group_id, UUID):
group_id = UUID(group_id)
if not isinstance(household_id, UUID):
household_id = UUID(household_id)
return utils.TestUser(
_group_id=user_data.get("groupId"),
user_id=user_data.get("id"),
_group_id=group_id,
_household_id=household_id,
user_id=user_id,
email=user_data.get("email"),
username=user_data.get("username"),
password=registration.password,
token=token,
repos=get_repositories(session, group_id=group_id, household_id=household_id),
)
@fixture(scope="module")
def g2_user(admin_token, api_client: TestClient):
def h2_user(session: Session, admin_token, api_client: TestClient, unique_user: utils.TestUser):
"""Another user in the same group as `unique_user`, but in a different household"""
group = api_client.get(api_routes.groups_self, headers=unique_user.token).json()
household_name = random_string(12)
api_client.post(
api_routes.admin_households,
json={
"name": household_name,
"groupId": group["id"],
},
headers=admin_token,
)
user_data = {
"fullName": utils.random_string(),
"username": utils.random_string(),
"email": utils.random_email(),
"password": "useruser",
"group": group["name"],
"household": household_name,
"admin": False,
"tokens": [],
}
response = api_client.post(api_routes.users, json=user_data, headers=admin_token)
assert response.status_code == 201
# Log in as this user
form_data = {"username": user_data["email"], "password": "useruser"}
token = utils.login(form_data, api_client)
self_response = api_client.get(api_routes.users_self, headers=token)
assert self_response.status_code == 200
data = json.loads(self_response.text)
user_id = data["id"]
household_id = data["householdId"]
group_id = data["groupId"]
assert user_id
assert group_id
assert household_id
if not isinstance(user_id, UUID):
user_id = UUID(user_id)
if not isinstance(group_id, UUID):
group_id = UUID(group_id)
if not isinstance(household_id, UUID):
household_id = UUID(household_id)
try:
yield utils.TestUser(
user_id=user_id,
_group_id=group_id,
_household_id=household_id,
token=token,
email=user_data["email"],
username=user_data["username"],
password=user_data["password"],
repos=get_repositories(session, group_id=group_id, household_id=household_id),
)
finally:
# TODO: Delete User after test
pass
@fixture(scope="module")
def g2_user(session: Session, admin_token, api_client: TestClient):
group = random_string(12)
# Create the user
create_data = {
"fullName": utils.random_string(),
@ -46,11 +127,12 @@ def g2_user(admin_token, api_client: TestClient):
"email": utils.random_email(),
"password": "useruser",
"group": group,
"household": "Family",
"admin": False,
"tokens": [],
}
response = api_client.post(api_routes.admin_groups, json={"name": group}, headers=admin_token)
api_client.post(api_routes.admin_groups, json={"name": group}, headers=admin_token)
response = api_client.post(api_routes.users, json=create_data, headers=admin_token)
assert response.status_code == 201
@ -66,15 +148,25 @@ def g2_user(admin_token, api_client: TestClient):
user_id = json.loads(self_response.text).get("id")
group_id = json.loads(self_response.text).get("groupId")
household_id = json.loads(self_response.text).get("householdId")
if not isinstance(user_id, UUID):
user_id = UUID(user_id)
if not isinstance(group_id, UUID):
group_id = UUID(group_id)
if not isinstance(household_id, UUID):
household_id = UUID(household_id)
try:
yield utils.TestUser(
user_id=user_id,
_group_id=group_id,
_household_id=household_id,
token=token,
email=create_data["email"], # type: ignore
username=create_data.get("username"), # type: ignore
password=create_data.get("password"), # type: ignore
repos=get_repositories(session, group_id=group_id, household_id=household_id),
)
finally:
# TODO: Delete User after test
@ -82,7 +174,7 @@ def g2_user(admin_token, api_client: TestClient):
@fixture(scope="module")
def unique_user(api_client: TestClient):
def unique_user(session: Session, api_client: TestClient):
registration = utils.user_registration_factory()
response = api_client.post("/api/users/register", json=registration.model_dump(by_alias=True))
assert response.status_code == 201
@ -94,14 +186,27 @@ def unique_user(api_client: TestClient):
user_data = api_client.get(api_routes.users_self, headers=token).json()
assert token is not None
assert (user_id := user_data.get("id")) is not None
assert (group_id := user_data.get("groupId")) is not None
assert (household_id := user_data.get("householdId")) is not None
if not isinstance(user_id, UUID):
user_id = UUID(user_id)
if not isinstance(group_id, UUID):
group_id = UUID(group_id)
if not isinstance(household_id, UUID):
household_id = UUID(household_id)
try:
yield utils.TestUser(
_group_id=user_data.get("groupId"),
user_id=user_data.get("id"),
_group_id=group_id,
_household_id=household_id,
user_id=user_id,
email=user_data.get("email"),
username=user_data.get("username"),
password=registration.password,
token=token,
repos=get_repositories(session, group_id=group_id, household_id=household_id),
)
finally:
# TODO: Delete User after test
@ -109,8 +214,9 @@ def unique_user(api_client: TestClient):
@fixture(scope="module")
def user_tuple(admin_token, api_client: TestClient) -> Generator[list[utils.TestUser], None, None]:
def user_tuple(session: Session, admin_token, api_client: TestClient) -> Generator[list[utils.TestUser], None, None]:
group_name = utils.random_string()
# Create the user
create_data_1 = {
"fullName": utils.random_string(),
@ -118,6 +224,7 @@ def user_tuple(admin_token, api_client: TestClient) -> Generator[list[utils.Test
"email": utils.random_email(),
"password": "useruser",
"group": group_name,
"household": "Family",
"admin": False,
"tokens": [],
}
@ -128,6 +235,7 @@ def user_tuple(admin_token, api_client: TestClient) -> Generator[list[utils.Test
"email": utils.random_email(),
"password": "useruser",
"group": group_name,
"household": "Family",
"admin": False,
"tokens": [],
}
@ -147,14 +255,27 @@ def user_tuple(admin_token, api_client: TestClient) -> Generator[list[utils.Test
assert response.status_code == 200
user_data = json.loads(response.text)
user_id = user_data.get("id")
group_id = user_data.get("groupId")
household_id = user_data.get("householdId")
if not isinstance(user_id, UUID):
user_id = UUID(user_id)
if not isinstance(group_id, UUID):
group_id = UUID(group_id)
if not isinstance(household_id, UUID):
household_id = UUID(household_id)
users_out.append(
utils.TestUser(
_group_id=user_data.get("groupId"),
user_id=user_data.get("id"),
_group_id=group_id,
_household_id=household_id,
user_id=user_id,
username=user_data.get("username"),
email=user_data.get("email"),
password="useruser",
token=token,
repos=get_repositories(session, group_id=group_id, household_id=household_id),
)
)
@ -164,7 +285,7 @@ def user_tuple(admin_token, api_client: TestClient) -> Generator[list[utils.Test
pass
@fixture(scope="session")
@fixture(scope="module")
def user_token(admin_token, api_client: TestClient):
# Create the user
create_data = {
@ -191,7 +312,7 @@ def ldap_user():
# Create an LDAP user directly instead of using TestClient since we don't have
# a LDAP service set up
with session_context() as session:
db = get_repositories(session)
db = get_repositories(session, group_id=None, household_id=None)
user = db.users.create(
{
"username": utils.random_string(10),
@ -204,5 +325,5 @@ def ldap_user():
)
yield user
with session_context() as session:
db = get_repositories(session)
db = get_repositories(session, group_id=None, household_id=None)
db.users.delete(user.id)