From dc84bbaa480e6a40a8db8c74ac70fccca61e65ef Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Thu, 3 Apr 2025 18:07:54 +0100 Subject: [PATCH 01/15] quality of life changes for preferences --- server/src/preferences.py | 55 ++++++++++++++++++++++++++++++--------- server/src/signup.py | 12 ++++++--- server/src/wayfinding.py | 10 ++++--- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/server/src/preferences.py b/server/src/preferences.py index 857008f..c734a51 100644 --- a/server/src/preferences.py +++ b/server/src/preferences.py @@ -16,35 +16,66 @@ def __init__(self, api, logger: logging.Logger): def set_Preferences( self, - ): + ): @self.app.post("/setPreferences") async def set_Preferences(request: userPersonalizedSettings): self.logger.info("Received user personalized settings:") self.db_handle_preferences(request) - return {"message": "Successfully saved user preferences"} - + return {"message": "Successfully saved user preferences"} + def db_handle_preferences(self, request): db = DataBase() db.connect_db() - db.add_entry( - "user_personalized_settings", request.request_into_dictionary() + dict = request.request_into_dictionary() + + for key, val in dict.items(): + db.update_entry( + "user_personalized_settings", dict["username"], key, val + ) + self.logger.info("User preferences updated in the database") + db.close_con() + + def db_initialise_preferences(self, username): + db = DataBase() + db.connect_db() + + dict = { + "username": username, + "bike": False, + "private_vehicle": False, + "accessibility": False, + "motorways": False, + "tolls": False, + "bus": False, + "car": False, + "train": False, + "walk": False, + "tram": False, + "personal_bike": False, + } + + db.add_entry("user_personalized_settings", dict) + self.logger.info( + "User has signed up and a preferences entry has been created" ) - self.logger.info("User preferences saved to database") db.close_con() - + def db_get_preferences(self, username): db = DataBase() db.connect_db() - motorwayPref = db.search_entry("user_personalized_settings", username, 'motorways') - tollsPref = db.search_entry("user_personalized_settings", username, 'tolls') + motorwayPref = db.search_entry( + "user_personalized_settings", username, "motorways" + ) + tollsPref = db.search_entry( + "user_personalized_settings", username, "tolls" + ) self.logger.info("User preferences retrieved from database") print("preferences retrieved from db", motorwayPref, tollsPref) db.close_con() - return { + return { "motorways": motorwayPref, "tolls": tollsPref, } - class userPersonalizedSettings(BaseModel): @@ -63,7 +94,7 @@ class userPersonalizedSettings(BaseModel): def request_into_dictionary(self): return { - "username": self.username, + "username": self.username, "bike": self.bike, "private_vehicle": self.privateVehicle, "accessibility": self.accessibility, diff --git a/server/src/signup.py b/server/src/signup.py index 25da311..b164233 100644 --- a/server/src/signup.py +++ b/server/src/signup.py @@ -1,9 +1,13 @@ from pydantic import BaseModel - -# May need to be changed in future with restructure of DB connection -import logging from fastapi import HTTPException from .Database_class import DataBase +from src.preferences import Preferences +import logging +from fastapi import FastAPI + +app = FastAPI() +logger = logging.getLogger("test_logger") +preferences = Preferences(api=app, logger=logger) class Signup: @@ -54,6 +58,8 @@ def signup_user(self, username: str, password: str): self.logger.info(f"User {username} signed up") db.close_con() + + preferences.db_initialise_preferences(username) return True diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index 94dda0d..377ff48 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -15,6 +15,7 @@ logger = logging.getLogger("test_logger") preferences = Preferences(api=app, logger=logger) + @router.post("/wayfinding/get_routes") def get_routes( origin: str = Body(...), @@ -32,7 +33,8 @@ def get_routes( "key": GOOGLE_MAPS_API_KEY, } response = requests.get(url, params=parameters) - return response.json() + return response.json() + @router.post("/wayfinding/preferences/get_routes") def get_routes_with_preferences( @@ -47,14 +49,14 @@ def get_routes_with_preferences( preferencesList = preferences.db_get_preferences(username) print(preferencesList) if not preferencesList: - logger.error(f"No preferences found for user {username}. Using default route.") + logger.error(f"No preferences found {username}. Using default route.") return get_routes( origin=origin, destination=destination, mode=mode, alternatives=alternatives, ) - + if preferencesList["tolls"] and preferencesList["motorways"]: toAvoid = "tolls|highways" elif preferencesList["tolls"]: @@ -63,7 +65,7 @@ def get_routes_with_preferences( toAvoid = "motorways" else: toAvoid = "" - + url = "https://maps.googleapis.com/maps/api/directions/json" parameters = { "origin": origin, From 5a28c211fd2b4d8cced99ac1ebeb0952f5af66ea Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 10:05:56 +0100 Subject: [PATCH 02/15] creating branch fix-pref --- server/src/wayfinding.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index 377ff48..5dd2f03 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -11,9 +11,6 @@ GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") router = APIRouter() -app = FastAPI() -logger = logging.getLogger("test_logger") -preferences = Preferences(api=app, logger=logger) @router.post("/wayfinding/get_routes") @@ -46,7 +43,7 @@ def get_routes_with_preferences( ): print(username) - preferencesList = preferences.db_get_preferences(username) + preferencesList = Preferences.db_get_preferences(username) print(preferencesList) if not preferencesList: logger.error(f"No preferences found {username}. Using default route.") From 7b86c428a4bee634822c277ed507f2ee9ecbb09a Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 10:39:10 +0100 Subject: [PATCH 03/15] wayfinding routing issue fix. --- server/src/main.py | 17 ++++++-- server/src/preferences.py | 3 +- server/src/wayfinding.py | 87 ++++++++++++++++++++------------------- 3 files changed, 60 insertions(+), 47 deletions(-) diff --git a/server/src/main.py b/server/src/main.py index ef1b502..f2566e3 100644 --- a/server/src/main.py +++ b/server/src/main.py @@ -7,10 +7,12 @@ import sys from src.signup import Signup from src.login import Login -from src.wayfinding import router # Import the API routes +from src.wayfinding import router as wayfinding_router +from src.preferences import router as preferences_router from src.weatherApi import weatherAPI from src.preferences import Preferences from src.networking import Networking +from src.wayfinding import wayfinding_router_setup class Server: @@ -21,15 +23,22 @@ def __init__(self): # Initialize FastAPI app self.app = FastAPI() # Include the API routes from the my_routes.py file - self.app.include_router(router) - + # Instantiate components self.signup_logic = Signup(self.app, self.logger) self.login_logic = Login(self.app, self.logger) - self.preferences_logic = Preferences(self.app, self.logger) self.connection_manager = ConnectionManager() self.weather_api = weatherAPI() self.networking = Networking(self.app, self.logger) + self.preferences_logic = Preferences(self.app, self.logger) + + wayfinding_router = wayfinding_router_setup( + preferences_logic=self.preferences_logic, + logger=self.logger, + ) + + self.app.include_router(wayfinding_router, prefix="/wayfinding") + self.app.include_router(preferences_router, prefix="/preferences") # Configure CORS self.configure_cors() diff --git a/server/src/preferences.py b/server/src/preferences.py index c734a51..e4cc2a8 100644 --- a/server/src/preferences.py +++ b/server/src/preferences.py @@ -1,9 +1,10 @@ import logging -from fastapi import Body +from fastapi import Body, APIRouter from dotenv import load_dotenv from pydantic import BaseModel from src.Database_class import DataBase +router = APIRouter() class Preferences: def __init__(self, api, logger: logging.Logger): diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index 5dd2f03..e2a25ca 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -2,16 +2,15 @@ import os from fastapi import APIRouter, Body from dotenv import load_dotenv -from src.preferences import Preferences import logging -from fastapi import FastAPI +from src.preferences import Preferences load_dotenv() GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") router = APIRouter() - +logger = logging.getLogger("test_logger") @router.post("/wayfinding/get_routes") def get_routes( @@ -33,46 +32,50 @@ def get_routes( return response.json() -@router.post("/wayfinding/preferences/get_routes") -def get_routes_with_preferences( - origin: str = Body(...), - destination: str = Body(...), - mode: str = Body(...), - alternatives: bool = Body(...), - username: str = Body(...), -): +def wayfinding_router_setup(preferences_logic: Preferences, logger): + router = APIRouter() + + @router.post("/preferences/get_routes") + def get_routes_with_preferences( + origin: str = Body(...), + destination: str = Body(...), + mode: str = Body(...), + alternatives: bool = Body(...), + username: str = Body(...), + ): - print(username) - preferencesList = Preferences.db_get_preferences(username) - print(preferencesList) - if not preferencesList: - logger.error(f"No preferences found {username}. Using default route.") - return get_routes( - origin=origin, - destination=destination, - mode=mode, - alternatives=alternatives, - ) + print(username) + preferencesList = preferences_logic.db_get_preferences(username) + print(preferencesList) + if not preferencesList: + logger.error(f"No preferences found {username}. Using default route.") + return get_routes( + origin=origin, + destination=destination, + mode=mode, + alternatives=alternatives, + ) - if preferencesList["tolls"] and preferencesList["motorways"]: - toAvoid = "tolls|highways" - elif preferencesList["tolls"]: - toAvoid = "tolls" - elif preferencesList["motorways"]: - toAvoid = "motorways" - else: - toAvoid = "" + if preferencesList["tolls"] and preferencesList["motorways"]: + toAvoid = "tolls|highways" + elif preferencesList["tolls"]: + toAvoid = "tolls" + elif preferencesList["motorways"]: + toAvoid = "motorways" + else: + toAvoid = "" - url = "https://maps.googleapis.com/maps/api/directions/json" - parameters = { - "origin": origin, - "destination": destination, - "mode": mode.lower(), - "alternatives": str(alternatives).lower(), - "key": GOOGLE_MAPS_API_KEY, - "username": username, - "avoid": toAvoid - } + url = "https://maps.googleapis.com/maps/api/directions/json" + parameters = { + "origin": origin, + "destination": destination, + "mode": mode.lower(), + "alternatives": str(alternatives).lower(), + "key": GOOGLE_MAPS_API_KEY, + "username": username, + "avoid": toAvoid + } - response = requests.get(url, params=parameters) - return response.json() + response = requests.get(url, params=parameters) + return response.json() + return router From 864b40cdc302308533da5b33719136007cc693e3 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:01:39 +0100 Subject: [PATCH 04/15] linting changes and fixes --- server/src/signup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/signup.py b/server/src/signup.py index 494db96..3b2cca8 100644 --- a/server/src/signup.py +++ b/server/src/signup.py @@ -3,7 +3,6 @@ from .Database_class import DataBase from src.preferences import Preferences import logging -from fastapi import FastAPI logger = logging.getLogger("test_logger") From 2d476195835e4106a680d15fa804aec02ba1f6de Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:01:55 +0100 Subject: [PATCH 05/15] more linting changes and fixes --- server/src/main.py | 10 +++++----- server/src/preferences.py | 1 + server/src/signup.py | 3 ++- server/src/wayfinding.py | 5 +++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/server/src/main.py b/server/src/main.py index 6e63628..51858d3 100644 --- a/server/src/main.py +++ b/server/src/main.py @@ -22,22 +22,22 @@ def __init__(self): # Initialize FastAPI app self.app = FastAPI() # Include the API routes from the my_routes.py file - + # Instantiate components - + self.login_logic = Login(self.app, self.logger) self.connection_manager = ConnectionManager() self.weather_api = weatherAPI() self.networking = Networking(self.app, self.logger) self.preferences_logic = Preferences(self.app, self.logger) - self.signup_logic = Signup(self.app, self.logger, self.preferences_logic) - + self.signup_logic = Signup(self.app, self.logger, + self.preferences_logic) + wayfinding_router = wayfinding_router_setup( preferences_logic=self.preferences_logic, logger=self.logger, ) - self.app.include_router(wayfinding_router, prefix="/wayfinding") self.app.include_router(preferences_router, prefix="/preferences") diff --git a/server/src/preferences.py b/server/src/preferences.py index e4cc2a8..ce91ce9 100644 --- a/server/src/preferences.py +++ b/server/src/preferences.py @@ -6,6 +6,7 @@ router = APIRouter() + class Preferences: def __init__(self, api, logger: logging.Logger): diff --git a/server/src/signup.py b/server/src/signup.py index 3b2cca8..a8fc474 100644 --- a/server/src/signup.py +++ b/server/src/signup.py @@ -9,7 +9,8 @@ class Signup: - def __init__(self, api, logger: logging.Logger, preferences_logic: Preferences): + def __init__(self, api, logger: logging.Logger, + preferences_logic: Preferences): self.app = api self.logger = logger self.preferences = preferences_logic diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index e2a25ca..72ed471 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -12,6 +12,7 @@ router = APIRouter() logger = logging.getLogger("test_logger") + @router.post("/wayfinding/get_routes") def get_routes( origin: str = Body(...), @@ -34,7 +35,7 @@ def get_routes( def wayfinding_router_setup(preferences_logic: Preferences, logger): router = APIRouter() - + @router.post("/preferences/get_routes") def get_routes_with_preferences( origin: str = Body(...), @@ -48,7 +49,7 @@ def get_routes_with_preferences( preferencesList = preferences_logic.db_get_preferences(username) print(preferencesList) if not preferencesList: - logger.error(f"No preferences found {username}. Using default route.") + logger.error(f"No preferences {username}. Using default route.") return get_routes( origin=origin, destination=destination, From c861e88ec62f9c016fa07cf39c73193df0376a25 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:06:56 +0100 Subject: [PATCH 06/15] fixed tests --- server/tests/test_signup.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 62c1862..72dfcfc 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -6,6 +6,11 @@ from src.signup import Signup +class MockPreferences: + def db_initialise_preferences(self, username): + # No-op mock or print for test visibility + print(f"Mocked: db_initialise_preferences called with {username}") + @pytest.fixture def test_app(): """ @@ -14,7 +19,8 @@ def test_app(): """ app = FastAPI() logger = logging.getLogger("test_logger") - signup = Signup(api=app, logger=logger) # noqa: F841 + mock_preferences = MockPreferences() + signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) # noqa: F841 return TestClient(app) From 3514238d46a669bfeda664d93a495dc5b43dc358 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:07:56 +0100 Subject: [PATCH 07/15] test fixes --- server/tests/test_signup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 72dfcfc..c0f5a72 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -7,8 +7,8 @@ class MockPreferences: + # mocking preferences class for signup to instantiate properly def db_initialise_preferences(self, username): - # No-op mock or print for test visibility print(f"Mocked: db_initialise_preferences called with {username}") @pytest.fixture @@ -20,7 +20,7 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) # noqa: F841 + signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) return TestClient(app) From e4a0a70753fc8436d9d1c8a06b194fcf96252f06 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:08:38 +0100 Subject: [PATCH 08/15] testing changes --- server/tests/test_signup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index c0f5a72..e448384 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -7,9 +7,8 @@ class MockPreferences: - # mocking preferences class for signup to instantiate properly def db_initialise_preferences(self, username): - print(f"Mocked: db_initialise_preferences called with {username}") + print("Mocking preferences class for signup to instantiate properly") @pytest.fixture def test_app(): From 85fb6e6432e7c42bfdf0c273a5f118cb317e9070 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:11:33 +0100 Subject: [PATCH 09/15] linting fixes --- server/tests/test_signup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index e448384..b53526f 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -19,7 +19,8 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) + signup = Signup(api=app, logger=logger, + preferences_logic=mock_preferences) # noqa return TestClient(app) From 88cdbe997543e7165ac620ab0095844383b85175 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:12:21 +0100 Subject: [PATCH 10/15] linting fixes --- server/tests/test_signup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index b53526f..3d26d2d 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -20,7 +20,7 @@ def test_app(): logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() signup = Signup(api=app, logger=logger, - preferences_logic=mock_preferences) # noqa + preferences_logic=mock_preferences) # noqa: F841 return TestClient(app) From 9a03e8b31f45058deff530b430abd61e3d8ff640 Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:20:49 +0100 Subject: [PATCH 11/15] linting --- server/tests/test_signup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 3d26d2d..0ce4c64 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -8,7 +8,7 @@ class MockPreferences: def db_initialise_preferences(self, username): - print("Mocking preferences class for signup to instantiate properly") + print(f"Mocking preferences") @pytest.fixture def test_app(): @@ -19,8 +19,7 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup(api=app, logger=logger, - preferences_logic=mock_preferences) # noqa: F841 + signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) # noqa: F841 return TestClient(app) From 8c660cd60479636856cf97f7d0484992e37e2c4e Mon Sep 17 00:00:00 2001 From: JasonBoutlas Date: Fri, 4 Apr 2025 11:23:37 +0100 Subject: [PATCH 12/15] fix:linting --- server/tests/test_signup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 0ce4c64..6967f01 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -19,7 +19,8 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup(api=app, logger=logger, preferences_logic=mock_preferences) # noqa: F841 + signup = Signup( # noqa: F841 + api=app, logger=logger, preferences_logic=mock_preferences) return TestClient(app) From ae681dd4c10c0f9922ce258c60869e5e7404bce0 Mon Sep 17 00:00:00 2001 From: Ma-Golden <125670894+Ma-Golden@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:27:01 +0100 Subject: [PATCH 13/15] fix: lint --- server/tests/test_signup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 3d26d2d..bc76340 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -10,6 +10,7 @@ class MockPreferences: def db_initialise_preferences(self, username): print("Mocking preferences class for signup to instantiate properly") + @pytest.fixture def test_app(): """ @@ -19,8 +20,8 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup(api=app, logger=logger, - preferences_logic=mock_preferences) # noqa: F841 + signup = Signup( # noqa: F841 + api=app, logger=logger, preferences_logic=mock_preferences) return TestClient(app) From 0bfc7288c2db204ec6e9e5e2987971f1948b73d6 Mon Sep 17 00:00:00 2001 From: Ma-Golden <125670894+Ma-Golden@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:27:23 +0100 Subject: [PATCH 14/15] Revert "fix: lint" This reverts commit ae681dd4c10c0f9922ce258c60869e5e7404bce0. --- server/tests/test_signup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index bc76340..3d26d2d 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -10,7 +10,6 @@ class MockPreferences: def db_initialise_preferences(self, username): print("Mocking preferences class for signup to instantiate properly") - @pytest.fixture def test_app(): """ @@ -20,8 +19,8 @@ def test_app(): app = FastAPI() logger = logging.getLogger("test_logger") mock_preferences = MockPreferences() - signup = Signup( # noqa: F841 - api=app, logger=logger, preferences_logic=mock_preferences) + signup = Signup(api=app, logger=logger, + preferences_logic=mock_preferences) # noqa: F841 return TestClient(app) From 1618c4f26444815b4c0f054c06dac80e22e2ca76 Mon Sep 17 00:00:00 2001 From: Ma-Golden <125670894+Ma-Golden@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:28:40 +0100 Subject: [PATCH 15/15] fix:lint --- server/tests/test_signup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 6967f01..8bd7739 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -8,7 +8,8 @@ class MockPreferences: def db_initialise_preferences(self, username): - print(f"Mocking preferences") + print("Mocking preferences") + @pytest.fixture def test_app():