From c0c8aab455b9a339be5fd052f6023d0d1d35f7be Mon Sep 17 00:00:00 2001 From: NiveditJain Date: Sat, 30 Aug 2025 21:10:22 +0530 Subject: [PATCH 1/2] Minor fixes --- state-manager/app/main.py | 8 ++++---- state-manager/app/models/db/namespace.py | 8 -------- state-manager/app/models/db/state.py | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) delete mode 100644 state-manager/app/models/db/namespace.py diff --git a/state-manager/app/main.py b/state-manager/app/main.py index f1ab7cc5..a6eb2795 100644 --- a/state-manager/app/main.py +++ b/state-manager/app/main.py @@ -18,7 +18,6 @@ # injecting models from .models.db.state import State -from .models.db.namespace import Namespace from .models.db.graph_template_model import GraphTemplate from .models.db.registered_node import RegisteredNode @@ -42,7 +41,7 @@ async def lifespan(app: FastAPI): # initializing beanie client = AsyncMongoClient(settings.mongo_uri) db = client[settings.mongo_database_name] - await init_beanie(db, document_models=[State, Namespace, GraphTemplate, RegisteredNode]) + await init_beanie(db, document_models=[State, GraphTemplate, RegisteredNode]) logger.info("beanie dbs initialized") # initialize secret @@ -54,14 +53,15 @@ async def lifespan(app: FastAPI): yield # end of the server - logger.info("server shutting down") + await client.close() + logger.info("server stopped") app = FastAPI( lifespan=lifespan, title="Exosphere State Manager", description="Exosphere State Manager", - version="0.1.0", + version="0.0.2-beta", contact={ "name": "Nivedit Jain (Founder exosphere.host)", "email": "nivedit@exosphere.host", diff --git a/state-manager/app/models/db/namespace.py b/state-manager/app/models/db/namespace.py deleted file mode 100644 index 6d2f4e79..00000000 --- a/state-manager/app/models/db/namespace.py +++ /dev/null @@ -1,8 +0,0 @@ -from .base import BaseDatabaseModel -from pydantic import Field -from beanie import Indexed - - -class Namespace(BaseDatabaseModel): - - name: Indexed(str, unique=True) = Field(..., description="Name of the namespace") # type: ignore \ No newline at end of file diff --git a/state-manager/app/models/db/state.py b/state-manager/app/models/db/state.py index e37326b4..6ed350d2 100644 --- a/state-manager/app/models/db/state.py +++ b/state-manager/app/models/db/state.py @@ -75,6 +75,6 @@ class Settings: ("namespace_name", 1), ("node_name", 1), ], - name="idx_enqueue_after" + name="enqueue_query" ) ] \ No newline at end of file From 29aeaedcd82faadc49a98ed190a69ce7054a3d87 Mon Sep 17 00:00:00 2001 From: NiveditJain Date: Sat, 30 Aug 2025 21:20:35 +0530 Subject: [PATCH 2/2] Refactor unit tests in test_main.py for improved clarity and functionality - Removed version assertions from app initialization tests to streamline checks. - Updated the mocking of `init_beanie` to use `AsyncMock` for better async handling in lifespan tests. - Adjusted logging assertions to reflect accurate shutdown messages. - Cleaned up unused imports and improved overall test structure for better maintainability. --- state-manager/tests/unit/test_main.py | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/state-manager/tests/unit/test_main.py b/state-manager/tests/unit/test_main.py index 21f04a11..e7042b38 100644 --- a/state-manager/tests/unit/test_main.py +++ b/state-manager/tests/unit/test_main.py @@ -17,7 +17,6 @@ def test_app_initialization(self): assert isinstance(app, FastAPI) assert app.title == "Exosphere State Manager" assert app.description == "Exosphere State Manager" - assert app.version == "0.1.0" # Check contact info assert app.contact is not None @@ -113,7 +112,7 @@ class TestLifespan: 'MONGO_DATABASE_NAME': 'test_db', 'STATE_MANAGER_SECRET': 'test_secret' }) - @patch('app.main.init_beanie') + @patch('app.main.init_beanie', new_callable=AsyncMock) @patch('app.main.AsyncMongoClient') @patch('app.main.LogsManager') async def test_lifespan_startup_success(self, mock_logs_manager, mock_mongo_client, mock_init_beanie): @@ -123,12 +122,11 @@ async def test_lifespan_startup_success(self, mock_logs_manager, mock_mongo_clie mock_logs_manager.return_value.get_logger.return_value = mock_logger mock_client = MagicMock() + mock_client.close = AsyncMock() mock_mongo_client.return_value = mock_client mock_db = MagicMock() mock_client.__getitem__.return_value = mock_db - mock_init_beanie.return_value = AsyncMock() - # Create a mock FastAPI app for the lifespan mock_app = MagicMock() @@ -144,14 +142,14 @@ async def test_lifespan_startup_success(self, mock_logs_manager, mock_mongo_clie mock_logger.info.assert_any_call("secret initialized") # After context manager exits (shutdown) - mock_logger.info.assert_any_call("server shutting down") + mock_logger.info.assert_any_call("server stopped") @patch.dict(os.environ, { 'MONGO_URI': 'mongodb://test:27017', 'MONGO_DATABASE_NAME': 'test_db', 'STATE_MANAGER_SECRET': '' # Empty secret }) - @patch('app.main.init_beanie') + @patch('app.main.init_beanie', new_callable=AsyncMock) @patch('app.main.AsyncMongoClient') @patch('app.main.LogsManager') async def test_lifespan_empty_secret_raises_error(self, mock_logs_manager, mock_mongo_client, mock_init_beanie): @@ -160,12 +158,11 @@ async def test_lifespan_empty_secret_raises_error(self, mock_logs_manager, mock_ mock_logs_manager.return_value.get_logger.return_value = mock_logger mock_client = MagicMock() + mock_client.close = AsyncMock() mock_mongo_client.return_value = mock_client mock_db = MagicMock() mock_client.__getitem__.return_value = mock_db - mock_init_beanie.return_value = AsyncMock() - mock_app = MagicMock() with pytest.raises(ValueError, match="STATE_MANAGER_SECRET is not set"): @@ -177,7 +174,7 @@ async def test_lifespan_empty_secret_raises_error(self, mock_logs_manager, mock_ 'MONGO_DATABASE_NAME': 'test_db', 'STATE_MANAGER_SECRET': 'test_secret' }) - @patch('app.main.init_beanie') + @patch('app.main.init_beanie', new_callable=AsyncMock) @patch('app.main.AsyncMongoClient') @patch('app.main.LogsManager') async def test_lifespan_init_beanie_with_correct_models(self, mock_logs_manager, mock_mongo_client, mock_init_beanie): @@ -186,12 +183,11 @@ async def test_lifespan_init_beanie_with_correct_models(self, mock_logs_manager, mock_logs_manager.return_value.get_logger.return_value = mock_logger mock_client = MagicMock() + mock_client.close = AsyncMock() mock_mongo_client.return_value = mock_client mock_db = MagicMock() mock_client.__getitem__.return_value = mock_db - mock_init_beanie.return_value = AsyncMock() - mock_app = MagicMock() async with app_main.lifespan(mock_app): @@ -209,11 +205,10 @@ async def test_lifespan_init_beanie_with_correct_models(self, mock_logs_manager, # Import the expected models from app.models.db.state import State - from app.models.db.namespace import Namespace from app.models.db.graph_template_model import GraphTemplate from app.models.db.registered_node import RegisteredNode - expected_models = [State, Namespace, GraphTemplate, RegisteredNode] + expected_models = [State, GraphTemplate, RegisteredNode] assert document_models == expected_models @@ -326,10 +321,7 @@ def test_app_metadata(self): # Test description assert app.description == "Exosphere State Manager" - - # Test version - assert app.version == "0.1.0" - + # Test contact info assert app.contact is not None assert app.contact["name"] == "Nivedit Jain (Founder exosphere.host)"