diff --git a/geomagio/api/db/MetadataDatabaseFactory.py b/geomagio/api/db/MetadataDatabaseFactory.py index 19463248c20d753430cf889b6a3018e2a184e2e8..b2274e8c4e1e0618fa532333144f377e802418b1 100644 --- a/geomagio/api/db/MetadataDatabaseFactory.py +++ b/geomagio/api/db/MetadataDatabaseFactory.py @@ -15,17 +15,11 @@ class MetadataDatabaseFactory(object): self.database = database async def create_metadata(self, meta: Metadata) -> Metadata: - print(1) query = metadata_table.insert() - print(2) meta.status = meta.status or "new" - print(3) values = meta.model_dump(exclude={"id", "metadata_id"}, exclude_none=True) - print(4) query = query.values(**values) - print(5) meta.id = await self.database.execute(query) - print(6) return meta async def get_metadata( diff --git a/geomagio/metadata/Metadata.py b/geomagio/metadata/Metadata.py index 7cae043007c9c4020d26a3b040c611fc6ec7a9d5..53f605f0767da2378b16a2257f60c1f862d0dd65 100644 --- a/geomagio/metadata/Metadata.py +++ b/geomagio/metadata/Metadata.py @@ -2,7 +2,7 @@ from datetime import timezone from typing import Dict, Optional from obspy import UTCDateTime -from pydantic import field_validator, field_serializer, BaseModel +from pydantic import field_validator, field_serializer, BaseModel, Field from .MetadataCategory import MetadataCategory from ..pydantic_utcdatetime import CustomUTCDateTimeType @@ -52,7 +52,9 @@ class Metadata(BaseModel): metadata_id: Optional[int] = None # author created_by: Optional[str] = None - created_time: Optional[CustomUTCDateTimeType] = None + created_time: CustomUTCDateTimeType = Field( + default_factory=lambda: UTCDateTime() + ) # editor updated_by: Optional[str] = None updated_time: Optional[CustomUTCDateTimeType] = None @@ -104,8 +106,3 @@ class Metadata(BaseModel): if self.endtime is not None: self.endtime = self.endtime.datetime.replace(tzinfo=timezone.utc) return self.endtime - - @field_validator("created_time") - @classmethod - def set_default_created_time(cls, created_time: UTCDateTime = None) -> UTCDateTime: - return created_time or UTCDateTime() diff --git a/test/db/MetadataDatabaseFactory_test.py b/test/db/MetadataDatabaseFactory_test.py index 6a7072807bb55444b204823d87fae54d490c1533..d77050014e075f0264339e2819f9b636224da8d6 100644 --- a/test/db/MetadataDatabaseFactory_test.py +++ b/test/db/MetadataDatabaseFactory_test.py @@ -1,15 +1,17 @@ +import datetime import unittest -from unittest.mock import AsyncMock, patch, MagicMock +from unittest.mock import AsyncMock, patch from databases import Database +from obspy import UTCDateTime + from geomagio.api.db import MetadataDatabaseFactory from geomagio.metadata import Metadata, MetadataCategory -from geomagio.api.db.metadata_table import metadata as metadata_table class TestMetadataDatabaseFactory(unittest.IsolatedAsyncioTestCase): @patch("databases.Database.execute", new_callable=AsyncMock) - async def test_create_metadata(self, mock_execute): + async def test_create_metadata_defaults(self, mock_execute): test_data = Metadata( category=MetadataCategory.INSTRUMENT, created_by="test_metadata.py", @@ -42,6 +44,7 @@ class TestMetadataDatabaseFactory(unittest.IsolatedAsyncioTestCase): await MetadataDatabaseFactory(database=db).create_metadata(test_data) + # assert data_valid, priority, and status are set to the correct defaults expected_values = { "category": "instrument", "created_by": "test_metadata.py", @@ -73,11 +76,160 @@ class TestMetadataDatabaseFactory(unittest.IsolatedAsyncioTestCase): "status": "new" } - expected_insert = metadata_table.insert().values(**expected_values) - mock_execute.assert_called_once() - mock_params = mock_execute.call_args.args[0].compile().params + called_params = mock_execute.call_args.args[0].compile().params + + assert called_params == expected_values + + # @patch("databases.Database.execute", new_callable=AsyncMock) + # async def test_create_metadata_with_ids(self, mock_execute): + # now = datetime.datetime.now(tz=datetime.timezone.utc) + # test_data = Metadata( + # id=1234, + # created_time=now, + # metadata_id=5678, + # category=MetadataCategory.INSTRUMENT, + # created_by="test_metadata.py", + # network="NT", + # station="BDT", + # metadata={ + # "type": "FGE", + # "channels": { + # "U": [{"channel": "U_Volt", "offset": 0, "scale": 313.2}], + # "V": [{"channel": "V_Volt", "offset": 0, "scale": 312.3}], + # "W": [{"channel": "W_Volt", "offset": 0, "scale": 312.0}], + # }, + # "electronics": { + # "serial": "E0542", + # "x-scale": 313.2, + # "y-scale": 312.3, + # "z-scale": 312.0, + # "temperature-scale": 0.01, + # }, + # "sensor": { + # "serial": "S0419", + # "x-constant": 36958, + # "y-constant": 36849, + # "z-constant": 36811, + # }, + # }, + # ) + + # db = Database("sqlite:///:memory:") + + # await MetadataDatabaseFactory(database=db).create_metadata(test_data) + + # # assert id is removed + # expected_values = { + # "created_time": now, + # "category": "instrument", + # "created_by": "test_metadata.py", + # "network": "NT", + # "station": "BDT", + # "metadata": { + # "type": "FGE", + # "channels": { + # "U": [{"channel": "U_Volt", "offset": 0, "scale": 313.2}], + # "V": [{"channel": "V_Volt", "offset": 0, "scale": 312.3}], + # "W": [{"channel": "W_Volt", "offset": 0, "scale": 312.0}], + # }, + # "electronics": { + # "serial": "E0542", + # "x-scale": 313.2, + # "y-scale": 312.3, + # "z-scale": 312.0, + # "temperature-scale": 0.01, + # }, + # "sensor": { + # "serial": "S0419", + # "x-constant": 36958, + # "y-constant": 36849, + # "z-constant": 36811, + # }, + # }, + # "data_valid": True, + # "priority": 1, + # "status": "new" + # } + + # mock_execute.assert_called_once() + # called_params = mock_execute.call_args.args[0].compile().params + + # assert called_params == expected_values + + # @patch("databases.Database.execute", new_callable=AsyncMock) + # async def test_create_metadata_with_metadata_id(self, mock_execute): + # test_data = Metadata( + # metadata_id=5678, + # category=MetadataCategory.INSTRUMENT, + # created_by="test_metadata.py", + # network="NT", + # station="BDT", + # metadata={ + # "type": "FGE", + # "channels": { + # "U": [{"channel": "U_Volt", "offset": 0, "scale": 313.2}], + # "V": [{"channel": "V_Volt", "offset": 0, "scale": 312.3}], + # "W": [{"channel": "W_Volt", "offset": 0, "scale": 312.0}], + # }, + # "electronics": { + # "serial": "E0542", + # "x-scale": 313.2, + # "y-scale": 312.3, + # "z-scale": 312.0, + # "temperature-scale": 0.01, + # }, + # "sensor": { + # "serial": "S0419", + # "x-constant": 36958, + # "y-constant": 36849, + # "z-constant": 36811, + # }, + # }, + # ) + + # db = Database("sqlite:///:memory:") + + # await MetadataDatabaseFactory(database=db).create_metadata(test_data) + + # # assert metadata_id is removed on values + # expected_values = { + # "metadata_id": 5678, + # "category": "instrument", + # "created_by": "test_metadata.py", + # "network": "NT", + # "station": "BDT", + # "metadata": { + # "type": "FGE", + # "channels": { + # "U": [{"channel": "U_Volt", "offset": 0, "scale": 313.2}], + # "V": [{"channel": "V_Volt", "offset": 0, "scale": 312.3}], + # "W": [{"channel": "W_Volt", "offset": 0, "scale": 312.0}], + # }, + # "electronics": { + # "serial": "E0542", + # "x-scale": 313.2, + # "y-scale": 312.3, + # "z-scale": 312.0, + # "temperature-scale": 0.01, + # }, + # "sensor": { + # "serial": "S0419", + # "x-constant": 36958, + # "y-constant": 36849, + # "z-constant": 36811, + # }, + # }, + # "data_valid": True, + # "priority": 1, + # "status": "new" + # } + + # expected_insert = metadata_table.insert().values(**expected_values) + # expected_params = expected_insert.compile().params + - expected_params = expected_insert.compile().params + # mock_execute.assert_called_once() + # called_params = mock_execute.call_args.args[0].compile().params - assert mock_params == expected_params + # assert called_params == expected_params \ No newline at end of file