diff --git a/admin/config.py b/admin/config.py index c738fa6c..0d4f462a 100644 --- a/admin/config.py +++ b/admin/config.py @@ -51,9 +51,9 @@ ThingAdmin, TransducerObservationAdmin, ) -from db.asset import Asset from db.aquifer_system import AquiferSystem from db.aquifer_type import AquiferType +from db.asset import Asset from db.contact import Contact from db.data_provenance import DataProvenance from db.deployment import Deployment @@ -64,13 +64,13 @@ from db.lexicon import LexiconCategory, LexiconTerm from db.location import Location from db.nma_legacy import ( - ChemistrySampleInfo, - NMAMinorTraceChemistry, - NMARadionuclides, - NMAHydraulicsData, - SoilRockResults, - Stratigraphy, - SurfaceWaterData, + NMA_Chemistry_SampleInfo, + NMA_MinorTraceChemistry, + NMA_Radionuclides, + NMA_HydraulicsData, + NMA_Soil_Rock_Results, + NMA_Stratigraphy, + NMA_SurfaceWaterData, ) from db.notes import Notes from db.observation import Observation @@ -140,13 +140,13 @@ def create_admin(app): # Samples admin.add_view(SampleAdmin(Sample)) - admin.add_view(ChemistrySampleInfoAdmin(ChemistrySampleInfo)) - admin.add_view(SurfaceWaterDataAdmin(SurfaceWaterData)) + admin.add_view(ChemistrySampleInfoAdmin(NMA_Chemistry_SampleInfo)) + admin.add_view(SurfaceWaterDataAdmin(NMA_SurfaceWaterData)) # Hydraulics - admin.add_view(HydraulicsDataAdmin(NMAHydraulicsData)) - admin.add_view(RadionuclidesAdmin(NMARadionuclides)) - admin.add_view(MinorTraceChemistryAdmin(NMAMinorTraceChemistry)) + admin.add_view(HydraulicsDataAdmin(NMA_HydraulicsData)) + admin.add_view(RadionuclidesAdmin(NMA_Radionuclides)) + admin.add_view(MinorTraceChemistryAdmin(NMA_MinorTraceChemistry)) # Field admin.add_view(FieldEventAdmin(FieldEvent)) @@ -169,10 +169,10 @@ def create_admin(app): admin.add_view(LexiconCategoryAdmin(LexiconCategory)) # Stratigraphy - admin.add_view(StratigraphyAdmin(Stratigraphy)) + admin.add_view(StratigraphyAdmin(NMA_Stratigraphy)) # SoilRockResults - admin.add_view(SoilRockResultsAdmin(SoilRockResults)) + admin.add_view(SoilRockResultsAdmin(NMA_Soil_Rock_Results)) # Future: Add more views here as they are implemented # admin.add_view(SampleAdmin) diff --git a/admin/views/hydraulicsdata.py b/admin/views/hydraulicsdata.py index a860411c..d081dbce 100644 --- a/admin/views/hydraulicsdata.py +++ b/admin/views/hydraulicsdata.py @@ -22,7 +22,7 @@ class HydraulicsDataAdmin(OcotilloModelView): """ - Admin view for NMAHydraulicsData model. + Admin view for NMA_HydraulicsData model. """ # ========== Basic Configuration ========== diff --git a/admin/views/minor_trace_chemistry.py b/admin/views/minor_trace_chemistry.py index 19478573..3db6e8a0 100644 --- a/admin/views/minor_trace_chemistry.py +++ b/admin/views/minor_trace_chemistry.py @@ -17,6 +17,8 @@ MinorTraceChemistryAdmin view for legacy NMA_MinorTraceChemistry. """ +import uuid + from starlette.requests import Request from starlette_admin.fields import HasOne @@ -25,14 +27,17 @@ class MinorTraceChemistryAdmin(OcotilloModelView): """ - Admin view for NMAMinorTraceChemistry model. + Admin view for NMA_MinorTraceChemistry model. """ # ========== Basic Configuration ========== + identity = "n-m-a_-minor-trace-chemistry" name = "Minor Trace Chemistry" label = "Minor Trace Chemistry" icon = "fa fa-flask" + pk_attr = "global_id" + pk_type = uuid.UUID def can_create(self, request: Request) -> bool: return False @@ -47,7 +52,7 @@ def can_delete(self, request: Request) -> bool: list_fields = [ "global_id", - HasOne("chemistry_sample_info", identity="chemistry-sample-info"), + HasOne("chemistry_sample_info", identity="n-m-a_-chemistry_-sample-info"), "analyte", "sample_value", "units", @@ -84,7 +89,7 @@ def can_delete(self, request: Request) -> bool: fields = [ "global_id", - HasOne("chemistry_sample_info", identity="chemistry-sample-info"), + HasOne("chemistry_sample_info", identity="n-m-a_-chemistry_-sample-info"), "analyte", "symbol", "sample_value", diff --git a/admin/views/radionuclides.py b/admin/views/radionuclides.py index ec452932..be990c42 100644 --- a/admin/views/radionuclides.py +++ b/admin/views/radionuclides.py @@ -22,7 +22,7 @@ class RadionuclidesAdmin(OcotilloModelView): """ - Admin view for NMARadionuclides model. + Admin view for NMA_Radionuclides model. """ # ========== Basic Configuration ========== diff --git a/alembic/versions/6e1c90f6135a_add_unique_constraint_to_.py b/alembic/versions/6e1c90f6135a_add_unique_constraint_to_.py index 02deb58f..dd2fa9ba 100644 --- a/alembic/versions/6e1c90f6135a_add_unique_constraint_to_.py +++ b/alembic/versions/6e1c90f6135a_add_unique_constraint_to_.py @@ -1,4 +1,4 @@ -"""add unique constraint to NMAMinorTraceChemistry +"""add unique constraint to NMA_MinorTraceChemistry Revision ID: 6e1c90f6135a Revises: 95d8b982cd5d @@ -9,9 +9,6 @@ from typing import Sequence, Union from alembic import op -import geoalchemy2 -import sqlalchemy as sa -import sqlalchemy_utils # revision identifiers, used by Alembic. revision: str = "6e1c90f6135a" diff --git a/alembic/versions/7c02d9f8f412_create_nmawaterlevelscontinuouspressuredaily.py b/alembic/versions/7c02d9f8f412_create_nmawaterlevelscontinuouspressuredaily.py index 680d5f8d..c7f3604c 100644 --- a/alembic/versions/7c02d9f8f412_create_nmawaterlevelscontinuouspressuredaily.py +++ b/alembic/versions/7c02d9f8f412_create_nmawaterlevelscontinuouspressuredaily.py @@ -1,4 +1,4 @@ -"""Create legacy NMAWaterLevelsContinuousPressureDaily table. +"""Create legacy NMA_WaterLevelsContinuous_Pressure_Daily table. Revision ID: 7c02d9f8f412 Revises: 2101e0b029dc @@ -7,8 +7,8 @@ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/db/nma_legacy.py b/db/nma_legacy.py index 4dfe453a..72f39804 100644 --- a/db/nma_legacy.py +++ b/db/nma_legacy.py @@ -44,7 +44,7 @@ from db.thing import Thing -class NMAWaterLevelsContinuousPressureDaily(Base): +class NMA_WaterLevelsContinuous_Pressure_Daily(Base): """ Legacy view of the WaterLevelsContinuous_Pressure_Daily table from AMPAPI. @@ -90,7 +90,7 @@ class NMAWaterLevelsContinuousPressureDaily(Base): cond_dl_ms_cm: Mapped[Optional[float]] = mapped_column("CONDDL (mS/cm)", Float) -class ViewNGWMNWellConstruction(Base): +class NMA_view_NGWMN_WellConstruction(Base): """ Legacy NGWMN well construction view. @@ -120,7 +120,7 @@ class ViewNGWMNWellConstruction(Base): ) -class ViewNGWMNWaterLevels(Base): +class NMA_view_NGWMN_WaterLevels(Base): """ Legacy NGWMN water levels view. """ @@ -140,7 +140,7 @@ class ViewNGWMNWaterLevels(Base): public_release: Mapped[Optional[bool]] = mapped_column("PublicRelease", Boolean) -class ViewNGWMNLithology(Base): +class NMA_view_NGWMN_Lithology(Base): """ Legacy NGWMN lithology view. """ @@ -160,7 +160,7 @@ class ViewNGWMNLithology(Base): ) -class NMAHydraulicsData(Base): +class NMA_HydraulicsData(Base): """ Legacy HydraulicsData table from AMPAPI. """ @@ -207,7 +207,7 @@ class NMAHydraulicsData(Base): thing: Mapped["Thing"] = relationship("Thing") -class Stratigraphy(Base): +class NMA_Stratigraphy(Base): """Legacy stratigraphy (lithology log) data from AMPAPI.""" __tablename__ = "NMA_Stratigraphy" @@ -238,7 +238,7 @@ class Stratigraphy(Base): thing: Mapped["Thing"] = relationship("Thing", back_populates="stratigraphy_logs") -class ChemistrySampleInfo(Base): +class NMA_Chemistry_SampleInfo(Base): """ Legacy Chemistry SampleInfo table from AMPAPI. """ @@ -296,29 +296,29 @@ class ChemistrySampleInfo(Base): "Thing", back_populates="chemistry_sample_infos" ) - minor_trace_chemistries: Mapped[List["NMAMinorTraceChemistry"]] = relationship( - "NMAMinorTraceChemistry", + minor_trace_chemistries: Mapped[List["NMA_MinorTraceChemistry"]] = relationship( + "NMA_MinorTraceChemistry", back_populates="chemistry_sample_info", cascade="all, delete-orphan", passive_deletes=True, ) - radionuclides: Mapped[List["NMARadionuclides"]] = relationship( - "NMARadionuclides", + radionuclides: Mapped[List["NMA_Radionuclides"]] = relationship( + "NMA_Radionuclides", back_populates="chemistry_sample_info", cascade="all, delete-orphan", passive_deletes=True, ) - major_chemistries: Mapped[List["NMAMajorChemistry"]] = relationship( - "NMAMajorChemistry", + major_chemistries: Mapped[List["NMA_MajorChemistry"]] = relationship( + "NMA_MajorChemistry", back_populates="chemistry_sample_info", cascade="all, delete-orphan", passive_deletes=True, ) - field_parameters: Mapped[List["FieldParameters"]] = relationship( - "FieldParameters", + field_parameters: Mapped[List["NMA_FieldParameters"]] = relationship( + "NMA_FieldParameters", back_populates="chemistry_sample_info", cascade="all, delete-orphan", passive_deletes=True, @@ -334,7 +334,7 @@ def validate_thing_id(self, key, value): return value -class AssociatedData(Base): +class NMA_AssociatedData(Base): """ Legacy AssociatedData table from NM_Aquifer. """ @@ -358,7 +358,7 @@ class AssociatedData(Base): thing: Mapped["Thing"] = relationship("Thing") -class SurfaceWaterData(Base): +class NMA_SurfaceWaterData(Base): """ Legacy SurfaceWaterData table from AMPAPI. """ @@ -391,7 +391,7 @@ class SurfaceWaterData(Base): data_source: Mapped[Optional[str]] = mapped_column("DataSource", String(255)) -class SurfaceWaterPhotos(Base): +class NMA_SurfaceWaterPhotos(Base): """ Legacy SurfaceWaterPhotos table from NM_Aquifer. """ @@ -409,7 +409,7 @@ class SurfaceWaterPhotos(Base): ) -class WeatherData(Base): +class NMA_WeatherData(Base): """ Legacy WeatherData table from AMPAPI. """ @@ -426,7 +426,7 @@ class WeatherData(Base): object_id: Mapped[int] = mapped_column("OBJECTID", Integer, primary_key=True) -class WeatherPhotos(Base): +class NMA_WeatherPhotos(Base): """ Legacy WeatherPhotos table from NM_Aquifer. """ @@ -444,7 +444,7 @@ class WeatherPhotos(Base): ) -class SoilRockResults(Base): +class NMA_Soil_Rock_Results(Base): """ Legacy Soil_Rock_Results table from NM_Aquifer. """ @@ -465,7 +465,7 @@ class SoilRockResults(Base): thing: Mapped["Thing"] = relationship("Thing") -class NMAMinorTraceChemistry(Base): +class NMA_MinorTraceChemistry(Base): """ Legacy MinorandTraceChemistry table from AMPAPI. @@ -506,21 +506,21 @@ class NMAMinorTraceChemistry(Base): volume_unit: Mapped[Optional[str]] = mapped_column(String(20)) # --- Relationships --- - chemistry_sample_info: Mapped["ChemistrySampleInfo"] = relationship( - "ChemistrySampleInfo", back_populates="minor_trace_chemistries" + chemistry_sample_info: Mapped["NMA_Chemistry_SampleInfo"] = relationship( + "NMA_Chemistry_SampleInfo", back_populates="minor_trace_chemistries" ) @validates("chemistry_sample_info_id") def validate_chemistry_sample_info_id(self, key, value): - """Prevent orphan NMAMinorTraceChemistry - must have a parent ChemistrySampleInfo.""" + """Prevent orphan NMA_MinorTraceChemistry - must have a parent ChemistrySampleInfo.""" if value is None: raise ValueError( - "NMAMinorTraceChemistry requires a parent ChemistrySampleInfo" + "NMA_MinorTraceChemistry requires a parent NMA_Chemistry_SampleInfo" ) return value -class NMARadionuclides(Base): +class NMA_Radionuclides(Base): """ Legacy Radionuclides table from NM_Aquifer_Dev_DB. """ @@ -563,26 +563,26 @@ class NMARadionuclides(Base): wclab_id: Mapped[Optional[str]] = mapped_column("WCLab_ID", String(25)) thing: Mapped["Thing"] = relationship("Thing") - chemistry_sample_info: Mapped["ChemistrySampleInfo"] = relationship( - "ChemistrySampleInfo", back_populates="radionuclides" + chemistry_sample_info: Mapped["NMA_Chemistry_SampleInfo"] = relationship( + "NMA_Chemistry_SampleInfo", back_populates="radionuclides" ) @validates("thing_id") def validate_thing_id(self, key, value): if value is None: raise ValueError( - "NMARadionuclides requires a Thing (thing_id cannot be None)" + "NMA_Radionuclides requires a Thing (thing_id cannot be None)" ) return value @validates("sample_pt_id") def validate_sample_pt_id(self, key, value): if value is None: - raise ValueError("NMARadionuclides requires a SamplePtID") + raise ValueError("NMA_Radionuclides requires a SamplePtID") return value -class NMAMajorChemistry(Base): +class NMA_MajorChemistry(Base): """ Legacy MajorChemistry table from NM_Aquifer_Dev_DB. """ @@ -619,18 +619,18 @@ class NMAMajorChemistry(Base): analyses_agency: Mapped[Optional[str]] = mapped_column("AnalysesAgency", String(50)) wclab_id: Mapped[Optional[str]] = mapped_column("WCLab_ID", String(25)) - chemistry_sample_info: Mapped["ChemistrySampleInfo"] = relationship( - "ChemistrySampleInfo", back_populates="major_chemistries" + chemistry_sample_info: Mapped["NMA_Chemistry_SampleInfo"] = relationship( + "NMA_Chemistry_SampleInfo", back_populates="major_chemistries" ) @validates("sample_pt_id") def validate_sample_pt_id(self, key, value): if value is None: - raise ValueError("NMAMajorChemistry requires a SamplePtID") + raise ValueError("NMA_MajorChemistry requires a SamplePtID") return value -class FieldParameters(Base): +class NMA_FieldParameters(Base): """ Legacy FieldParameters table from AMPAPI. Stores field measurements (pH, Temp, etc.) linked to ChemistrySampleInfo. @@ -688,8 +688,8 @@ class FieldParameters(Base): wc_lab_id: Mapped[Optional[str]] = mapped_column("WCLab_ID", String(25)) # Relationships - chemistry_sample_info: Mapped["ChemistrySampleInfo"] = relationship( - "ChemistrySampleInfo", back_populates="field_parameters" + chemistry_sample_info: Mapped["NMA_Chemistry_SampleInfo"] = relationship( + "NMA_Chemistry_SampleInfo", back_populates="field_parameters" ) @validates("sample_pt_id") diff --git a/db/thing.py b/db/thing.py index 4365245f..8c3f4d31 100644 --- a/db/thing.py +++ b/db/thing.py @@ -47,7 +47,7 @@ from db.thing_geologic_formation_association import ( ThingGeologicFormationAssociation, ) - from db.nma_legacy import ChemistrySampleInfo, Stratigraphy + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_Stratigraphy class Thing( @@ -305,15 +305,15 @@ class Thing( ) # One-To-Many: A Thing can have many ChemistrySampleInfos (legacy NMA data). - chemistry_sample_infos: Mapped[List["ChemistrySampleInfo"]] = relationship( - "ChemistrySampleInfo", + chemistry_sample_infos: Mapped[List["NMA_Chemistry_SampleInfo"]] = relationship( + "NMA_Chemistry_SampleInfo", back_populates="thing", cascade="all, delete-orphan", passive_deletes=True, ) - stratigraphy_logs: Mapped[List["Stratigraphy"]] = relationship( - "Stratigraphy", + stratigraphy_logs: Mapped[List["NMA_Stratigraphy"]] = relationship( + "NMA_Stratigraphy", back_populates="thing", cascade="all, delete-orphan", passive_deletes=True, diff --git a/features/admin/minor_trace_chemistry_admin.feature b/features/admin/minor_trace_chemistry_admin.feature index b0034b96..a49ba6a3 100644 --- a/features/admin/minor_trace_chemistry_admin.feature +++ b/features/admin/minor_trace_chemistry_admin.feature @@ -12,7 +12,7 @@ Feature: Minor Trace Chemistry Admin View @smoke @list-view Scenario: View minor trace chemistry list with default columns - When I navigate to "/admin/n-m-a-minor-trace-chemistry/list" + When I navigate to "/admin/n-m-a_-minor-trace-chemistry/list" Then I should see the minor trace chemistry list page And I should see the following columns: | Column Name | @@ -33,7 +33,7 @@ Feature: Minor Trace Chemistry Admin View | Arsenic | 0.005 | mg/L | | Uranium | 0.003 | mg/L | | Selenium | 0.001 | mg/L | - When I navigate to "/admin/n-m-a-minor-trace-chemistry/list" + When I navigate to "/admin/n-m-a_-minor-trace-chemistry/list" And I enter "Arsenic" in the search box Then I should see results containing "Arsenic" But I should not see "Uranium" in the results @@ -41,7 +41,7 @@ Feature: Minor Trace Chemistry Admin View @list-view @pagination Scenario: Paginate through minor trace chemistry list Given at least 100 minor trace chemistry records exist - When I navigate to "/admin/n-m-a-minor-trace-chemistry/list" + When I navigate to "/admin/n-m-a_-minor-trace-chemistry/list" Then I should see 50 records on page 1 And I should see pagination controls @@ -49,13 +49,13 @@ Feature: Minor Trace Chemistry Admin View @read-only @security Scenario: Create action is disabled - When I navigate to "/admin/n-m-a-minor-trace-chemistry/list" + When I navigate to "/admin/n-m-a_-minor-trace-chemistry/list" Then I should not see a "Create" button And I should not see a "New" button @read-only @security Scenario: Direct access to create page is forbidden - When I navigate to "/admin/n-m-a-minor-trace-chemistry/create" + When I navigate to "/admin/n-m-a_-minor-trace-chemistry/create" Then I should see a 403 Forbidden response Or I should be redirected to the list page @@ -109,6 +109,6 @@ Feature: Minor Trace Chemistry Admin View Scenario: Navigate to Minor Trace Chemistry from sidebar When I navigate to "/admin" And I click "Minor Trace Chemistry" in the sidebar - Then I should be on "/admin/n-m-a-minor-trace-chemistry/list" + Then I should be on "/admin/n-m-a_-minor-trace-chemistry/list" # ============= EOF ============================================= diff --git a/services/ngwmn_helper.py b/services/ngwmn_helper.py index 630da72c..84a8026d 100644 --- a/services/ngwmn_helper.py +++ b/services/ngwmn_helper.py @@ -14,6 +14,7 @@ # limitations under the License. # =============================================================================== from xml.etree import ElementTree as etree + from sqlalchemy import text # NSMAP = dict(xsi="http://www.w3.org/2001/XMLSchema-instance", xsd="http://www.w3.org/2001/XMLSchema") @@ -44,7 +45,7 @@ def make_well_construction_response(point_id, db): def make_waterlevels_response(point_id, db): sql = "select * from dbo.view_NGWMN_WaterLevels where PointID=:point_id order by DateMeasured" sql2 = ( - "select * from NMAWaterLevelsContinuous_Pressure_Daily where PointID=:point_id and QCed=1 order by " + "select * from NMA_WaterLevelsContinuous_Pressure_Daily where PointID=:point_id and QCed=1 order by " "DateMeasured" ) diff --git a/tests/__init__.py b/tests/__init__.py index 0782a2b6..32b5d145 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -13,28 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. # =============================================================================== -import os from functools import lru_cache + from dotenv import load_dotenv # Load .env file BEFORE importing anything else # Use override=True to override conflicting shell environment variables load_dotenv(override=True) -# for safety dont test on the production database port -os.environ["POSTGRES_PORT"] = "5432" -# Always use test database, never dev -os.environ["POSTGRES_DB"] = "ocotilloapi_test" - -# this should not be needed since all Pydantic serializes all datetimes as UTC -# furthermore, tzset is not supported on Windows, so this breaks cross-platform compatibility -# # Set timezone to UTC for consistent datetime handling in tests -# os.environ["TZ"] = "UTC" - -# # Also set time.tzset() to apply the timezone change -# import time - -# time.tzset() from fastapi.testclient import TestClient from fastapi_pagination import add_pagination diff --git a/tests/conftest.py b/tests/conftest.py index f3df65fd..dc51737c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,10 @@ import os -from dotenv import load_dotenv - import pytest from alembic import command from alembic.config import Config +from dotenv import load_dotenv + from core.initializers import init_lexicon, init_parameter from db import * from db.engine import session_ctx @@ -17,7 +17,7 @@ def pytest_configure(): load_dotenv(override=True) - os.environ.setdefault("POSTGRES_PORT", "5432") + os.environ.setdefault("POSTGRES_PORT", "54321") # Always use test database, never dev os.environ["POSTGRES_DB"] = "ocotilloapi_test" diff --git a/tests/features/steps/admin-minor-trace-chemistry.py b/tests/features/steps/admin-minor-trace-chemistry.py index e4cf15f3..acfcb434 100644 --- a/tests/features/steps/admin-minor-trace-chemistry.py +++ b/tests/features/steps/admin-minor-trace-chemistry.py @@ -18,9 +18,14 @@ These are fast integration tests - no HTTP calls, direct module testing. """ -from behave import when, then, given +from behave import when, then from behave.runner import Context +from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin + +ADMIN_IDENTITY = MinorTraceChemistryAdmin.identity +ADMIN_BASE_URL = f"/admin/{ADMIN_IDENTITY}" + def _ensure_admin_mounted(context): """Ensure admin is mounted on the test app.""" @@ -56,48 +61,45 @@ def step_impl(context: Context, view_name: str): @then("the Minor Trace Chemistry admin view should not allow create") def step_impl(context: Context): - from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin - from db.nma_legacy import NMAMinorTraceChemistry + from db.nma_legacy import NMA_MinorTraceChemistry - view = MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + view = MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) assert view.can_create(None) is False @then("the Minor Trace Chemistry admin view should not allow edit") def step_impl(context: Context): - from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin - from db.nma_legacy import NMAMinorTraceChemistry + from db.nma_legacy import NMA_MinorTraceChemistry - view = MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + view = MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) assert view.can_edit(None) is False @then("the Minor Trace Chemistry admin view should not allow delete") def step_impl(context: Context): - from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin - from db.nma_legacy import NMAMinorTraceChemistry + from db.nma_legacy import NMA_MinorTraceChemistry - view = MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + view = MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) assert view.can_delete(None) is False @when("I request the Minor Trace Chemistry admin list page") def step_impl(context: Context): _ensure_admin_mounted(context) - context.response = context.client.get("/admin/n-m-a-minor-trace-chemistry/list") + context.response = context.client.get(f"{ADMIN_BASE_URL}/list") @when("I request the Minor Trace Chemistry admin detail page for an existing record") def step_impl(context: Context): _ensure_admin_mounted(context) from db.engine import session_ctx - from db.nma_legacy import NMAMinorTraceChemistry + from db.nma_legacy import NMA_MinorTraceChemistry with session_ctx() as session: - record = session.query(NMAMinorTraceChemistry).first() + record = session.query(NMA_MinorTraceChemistry).first() if record: context.response = context.client.get( - f"/admin/n-m-a-minor-trace-chemistry/detail/{record.global_id}" + f"{ADMIN_BASE_URL}/detail/{record.global_id}" ) else: # No records exist, skip by setting a mock 200 response diff --git a/tests/integration/test_admin_minor_trace_chemistry.py b/tests/integration/test_admin_minor_trace_chemistry.py index cb082348..272256e5 100644 --- a/tests/integration/test_admin_minor_trace_chemistry.py +++ b/tests/integration/test_admin_minor_trace_chemistry.py @@ -28,9 +28,13 @@ from starlette.middleware.sessions import SessionMiddleware from admin.config import create_admin -from db.nma_legacy import NMAMinorTraceChemistry, ChemistrySampleInfo -from db.thing import Thing +from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin from db.engine import session_ctx +from db.nma_legacy import NMA_MinorTraceChemistry, NMA_Chemistry_SampleInfo +from db.thing import Thing + +ADMIN_IDENTITY = MinorTraceChemistryAdmin.identity +ADMIN_BASE_URL = f"/admin/{ADMIN_IDENTITY}" @pytest.fixture(scope="module") @@ -57,7 +61,7 @@ def admin_client(admin_app): def minor_trace_chemistry_record(): """Create a minor trace chemistry record for testing.""" with session_ctx() as session: - # First create a Thing (required for ChemistrySampleInfo) + # First create a Thing (required for NMA_Chemistry_SampleInfo) thing = Thing( name="Integration Test Well", thing_type="water well", @@ -67,8 +71,8 @@ def minor_trace_chemistry_record(): session.commit() session.refresh(thing) - # Create parent ChemistrySampleInfo - sample_info = ChemistrySampleInfo( + # Create parent NMA_Chemistry_SampleInfo + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid.uuid4(), sample_point_id="INTTEST01", thing_id=thing.id, @@ -78,7 +82,7 @@ def minor_trace_chemistry_record(): session.refresh(sample_info) # Create MinorTraceChemistry record - chemistry = NMAMinorTraceChemistry( + chemistry = NMA_MinorTraceChemistry( global_id=uuid.uuid4(), chemistry_sample_info_id=sample_info.sample_pt_id, analyte="Arsenic", @@ -106,7 +110,7 @@ class TestMinorTraceChemistryListView: def test_list_view_returns_200(self, admin_client): """List view should return 200 OK.""" - response = admin_client.get("/admin/n-m-a-minor-trace-chemistry/list") + response = admin_client.get(f"{ADMIN_BASE_URL}/list") assert response.status_code == 200, ( f"Expected 200, got {response.status_code}. " f"Response: {response.text[:500]}" @@ -114,16 +118,16 @@ def test_list_view_returns_200(self, admin_client): def test_list_view_contains_view_name(self, admin_client): """List view should contain the view name.""" - response = admin_client.get("/admin/n-m-a-minor-trace-chemistry/list") + response = admin_client.get(f"{ADMIN_BASE_URL}/list") assert response.status_code == 200 assert "Minor Trace Chemistry" in response.text def test_no_create_button_in_list_view(self, admin_client): """List view should not have a Create button for read-only view.""" - response = admin_client.get("/admin/n-m-a-minor-trace-chemistry/list") + response = admin_client.get(f"{ADMIN_BASE_URL}/list") assert response.status_code == 200 html = response.text.lower() - assert 'href="/admin/n-m-a-minor-trace-chemistry/create"' not in html + assert f'href="{ADMIN_BASE_URL}/create"' not in html class TestMinorTraceChemistryDetailView: @@ -132,7 +136,7 @@ class TestMinorTraceChemistryDetailView: def test_detail_view_returns_200(self, admin_client, minor_trace_chemistry_record): """Detail view should return 200 OK for existing record.""" pk = str(minor_trace_chemistry_record.global_id) - response = admin_client.get(f"/admin/n-m-a-minor-trace-chemistry/detail/{pk}") + response = admin_client.get(f"{ADMIN_BASE_URL}/detail/{pk}") assert response.status_code == 200, ( f"Expected 200, got {response.status_code}. " f"Response: {response.text[:500]}" @@ -143,16 +147,16 @@ def test_detail_view_shows_analyte( ): """Detail view should display the analyte.""" pk = str(minor_trace_chemistry_record.global_id) - response = admin_client.get(f"/admin/n-m-a-minor-trace-chemistry/detail/{pk}") + response = admin_client.get(f"{ADMIN_BASE_URL}/detail/{pk}") assert response.status_code == 200 assert "Arsenic" in response.text def test_detail_view_shows_parent_relationship( self, admin_client, minor_trace_chemistry_record ): - """Detail view should display the parent ChemistrySampleInfo.""" + """Detail view should display the parent NMA_Chemistry_SampleInfo.""" pk = str(minor_trace_chemistry_record.global_id) - response = admin_client.get(f"/admin/n-m-a-minor-trace-chemistry/detail/{pk}") + response = admin_client.get(f"{ADMIN_BASE_URL}/detail/{pk}") assert response.status_code == 200 # The parent relationship should be displayed somehow # Check for the field label @@ -161,9 +165,7 @@ def test_detail_view_shows_parent_relationship( def test_detail_view_404_for_nonexistent_record(self, admin_client): """Detail view should return 404 for non-existent record.""" fake_pk = str(uuid.uuid4()) - response = admin_client.get( - f"/admin/n-m-a-minor-trace-chemistry/detail/{fake_pk}" - ) + response = admin_client.get(f"{ADMIN_BASE_URL}/detail/{fake_pk}") assert response.status_code == 404 @@ -172,7 +174,7 @@ class TestMinorTraceChemistryReadOnlyRestrictions: def test_create_endpoint_forbidden(self, admin_client): """Create endpoint should be forbidden for read-only view.""" - response = admin_client.get("/admin/n-m-a-minor-trace-chemistry/create") + response = admin_client.get(f"{ADMIN_BASE_URL}/create") # Should be 403 or redirect, not 200 assert response.status_code in ( 403, @@ -183,7 +185,7 @@ def test_create_endpoint_forbidden(self, admin_client): def test_edit_endpoint_forbidden(self, admin_client, minor_trace_chemistry_record): """Edit endpoint should be forbidden for read-only view.""" pk = str(minor_trace_chemistry_record.global_id) - response = admin_client.get(f"/admin/n-m-a-minor-trace-chemistry/edit/{pk}") + response = admin_client.get(f"{ADMIN_BASE_URL}/edit/{pk}") # Should be 403 or redirect, not 200 assert response.status_code in ( 403, @@ -197,7 +199,7 @@ def test_delete_endpoint_forbidden( """Delete endpoint should be forbidden for read-only view.""" pk = str(minor_trace_chemistry_record.global_id) response = admin_client.post( - f"/admin/n-m-a-minor-trace-chemistry/delete", + f"{ADMIN_BASE_URL}/delete", data={"pks": [pk]}, ) # Should be 403, redirect, or 404/405 (route may not exist for read-only) diff --git a/tests/test_admin_minor_trace_chemistry.py b/tests/test_admin_minor_trace_chemistry.py index de184ff9..9777d0c8 100644 --- a/tests/test_admin_minor_trace_chemistry.py +++ b/tests/test_admin_minor_trace_chemistry.py @@ -25,7 +25,7 @@ from admin.config import create_admin from admin.views.minor_trace_chemistry import MinorTraceChemistryAdmin -from db.nma_legacy import NMAMinorTraceChemistry +from db.nma_legacy import NMA_MinorTraceChemistry class TestMinorTraceChemistryAdminRegistration: @@ -44,7 +44,7 @@ def test_minor_trace_chemistry_view_is_registered(self): def test_view_has_correct_label(self): """View should have proper label for sidebar display.""" - view = MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + view = MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) assert view.label == "Minor Trace Chemistry" def test_class_has_flask_icon_configured(self): @@ -60,7 +60,7 @@ class TestMinorTraceChemistryAdminReadOnly: @pytest.fixture def view(self): """Create a MinorTraceChemistryAdmin instance for testing.""" - return MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + return MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) def test_can_create_returns_false(self, view): """Create should be disabled for legacy data.""" @@ -89,7 +89,7 @@ class TestMinorTraceChemistryAdminListView: @pytest.fixture def view(self): """Create a MinorTraceChemistryAdmin instance for testing.""" - return MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + return MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) def test_list_fields_include_required_columns(self, view): """List view should show key chemistry data columns.""" @@ -136,7 +136,7 @@ class TestMinorTraceChemistryAdminFormView: @pytest.fixture def view(self): """Create a MinorTraceChemistryAdmin instance for testing.""" - return MinorTraceChemistryAdmin(NMAMinorTraceChemistry) + return MinorTraceChemistryAdmin(NMA_MinorTraceChemistry) def test_form_includes_all_chemistry_fields(self): """Form should include all relevant chemistry data fields in configuration.""" diff --git a/tests/test_associated_data_legacy.py b/tests/test_associated_data_legacy.py index a08e95bc..7919b049 100644 --- a/tests/test_associated_data_legacy.py +++ b/tests/test_associated_data_legacy.py @@ -14,9 +14,9 @@ # limitations under the License. # ============================================================================== """ -Unit tests for AssociatedData legacy model. +Unit tests for NMA_AssociatedData legacy model. -These tests verify the migration of columns from the legacy AssociatedData table. +These tests verify the migration of columns from the legacy NMA_AssociatedData table. Migrated columns: - LocationId -> location_id - PointID -> point_id @@ -29,13 +29,13 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import AssociatedData +from db.nma_legacy import NMA_AssociatedData def test_create_associated_data_all_fields(water_well_thing): """Test creating an associated data record with all fields.""" with session_ctx() as session: - record = AssociatedData( + record = NMA_AssociatedData( location_id=uuid4(), point_id="AA-0001", assoc_id=uuid4(), @@ -63,7 +63,7 @@ def test_create_associated_data_all_fields(water_well_thing): def test_create_associated_data_minimal(): """Test creating an associated data record with required fields only.""" with session_ctx() as session: - record = AssociatedData(assoc_id=uuid4()) + record = NMA_AssociatedData(assoc_id=uuid4()) session.add(record) session.commit() session.refresh(record) diff --git a/tests/test_chemistry_sampleinfo_legacy.py b/tests/test_chemistry_sampleinfo_legacy.py index 1b170110..2648befc 100644 --- a/tests/test_chemistry_sampleinfo_legacy.py +++ b/tests/test_chemistry_sampleinfo_legacy.py @@ -14,7 +14,7 @@ # limitations under the License. # =============================================================================== """ -Unit tests for ChemistrySampleInfo legacy model. +Unit tests for NMA_Chemistry_SampleInfo legacy model. These tests verify the migration of columns from the legacy Chemistry_SampleInfo table. Migrated columns: @@ -42,7 +42,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import ChemistrySampleInfo +from db.nma_legacy import NMA_Chemistry_SampleInfo def _next_sample_point_id() -> str: @@ -57,7 +57,7 @@ def _next_sample_pt_id(): def test_create_chemistry_sampleinfo_all_fields(water_well_thing): """Test creating a chemistry sample info record with all fields.""" with session_ctx() as session: - record = ChemistrySampleInfo( + record = NMA_Chemistry_SampleInfo( sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -95,7 +95,7 @@ def test_create_chemistry_sampleinfo_all_fields(water_well_thing): def test_create_chemistry_sampleinfo_minimal(water_well_thing): """Test creating a chemistry sample info record with minimal fields.""" with session_ctx() as session: - record = ChemistrySampleInfo( + record = NMA_Chemistry_SampleInfo( sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -116,7 +116,7 @@ def test_create_chemistry_sampleinfo_minimal(water_well_thing): def test_read_chemistry_sampleinfo_by_object_id(water_well_thing): """Test reading a chemistry sample info record by OBJECTID.""" with session_ctx() as session: - record = ChemistrySampleInfo( + record = NMA_Chemistry_SampleInfo( sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -124,7 +124,7 @@ def test_read_chemistry_sampleinfo_by_object_id(water_well_thing): session.add(record) session.commit() - fetched = session.get(ChemistrySampleInfo, record.sample_pt_id) + fetched = session.get(NMA_Chemistry_SampleInfo, record.sample_pt_id) assert fetched is not None assert fetched.sample_pt_id == record.sample_pt_id assert fetched.sample_point_id == record.sample_point_id @@ -137,7 +137,7 @@ def test_read_chemistry_sampleinfo_by_object_id(water_well_thing): def test_update_chemistry_sampleinfo(water_well_thing): """Test updating a chemistry sample info record.""" with session_ctx() as session: - record = ChemistrySampleInfo( + record = NMA_Chemistry_SampleInfo( sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -161,7 +161,7 @@ def test_update_chemistry_sampleinfo(water_well_thing): def test_delete_chemistry_sampleinfo(water_well_thing): """Test deleting a chemistry sample info record.""" with session_ctx() as session: - record = ChemistrySampleInfo( + record = NMA_Chemistry_SampleInfo( sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -172,7 +172,7 @@ def test_delete_chemistry_sampleinfo(water_well_thing): session.delete(record) session.commit() - fetched = session.get(ChemistrySampleInfo, record.sample_pt_id) + fetched = session.get(NMA_Chemistry_SampleInfo, record.sample_pt_id) assert fetched is None @@ -204,13 +204,13 @@ def test_chemistry_sampleinfo_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - ChemistrySampleInfo, column - ), f"Expected column '{column}' not found in ChemistrySampleInfo model" + NMA_Chemistry_SampleInfo, column + ), f"Expected column '{column}' not found in NMA_Chemistry_SampleInfo model" def test_chemistry_sampleinfo_table_name(): """Test that the table name follows convention.""" - assert ChemistrySampleInfo.__tablename__ == "NMA_Chemistry_SampleInfo" + assert NMA_Chemistry_SampleInfo.__tablename__ == "NMA_Chemistry_SampleInfo" # ============= EOF ============================================= diff --git a/tests/test_field_parameters_legacy.py b/tests/test_field_parameters_legacy.py index 0083fade..aa04174d 100644 --- a/tests/test_field_parameters_legacy.py +++ b/tests/test_field_parameters_legacy.py @@ -1,7 +1,7 @@ """ -Unit tests for FieldParameters legacy model. +Unit tests for NMA_FieldParameters legacy model. -These tests verify the migration of columns from the legacy FieldParameters table. +These tests verify the migration of columns from the legacy NMA_FieldParameters table. Migrated columns (excluding SSMA_TimeStamp): - SamplePtID -> sample_pt_id - SamplePointID -> sample_point_id @@ -22,15 +22,15 @@ from sqlalchemy.exc import IntegrityError, ProgrammingError from db.engine import session_ctx -from db.nma_legacy import ChemistrySampleInfo, FieldParameters +from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_FieldParameters def _next_sample_point_id() -> str: return f"SP-{uuid4().hex[:7]}" -def _create_sample_info(session, water_well_thing) -> ChemistrySampleInfo: - sample = ChemistrySampleInfo( +def _create_sample_info(session, water_well_thing) -> NMA_Chemistry_SampleInfo: + sample = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -48,7 +48,7 @@ def test_field_parameters_has_all_migrated_columns(): VERIFIES: The SQLAlchemy model matches the migration mapping contract. This ensures all Python-side attribute names exist as expected in the ORM. """ - mapper = inspect(FieldParameters) + mapper = inspect(NMA_FieldParameters) actual_columns = [column.key for column in mapper.attrs] expected_columns = [ @@ -70,7 +70,7 @@ def test_field_parameters_has_all_migrated_columns(): def test_field_parameters_table_name(): """Test that the table name follows convention.""" - assert FieldParameters.__tablename__ == "NMA_FieldParameters" + assert NMA_FieldParameters.__tablename__ == "NMA_FieldParameters" # ===================== Functional & CRUD Tests ========================= @@ -84,7 +84,7 @@ def test_field_parameters_persistence(water_well_thing): with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) test_global_id = uuid4() - new_fp = FieldParameters( + new_fp = NMA_FieldParameters( global_id=test_global_id, sample_pt_id=sample_info.sample_pt_id, sample_point_id="PT-123", @@ -100,7 +100,7 @@ def test_field_parameters_persistence(water_well_thing): session.commit() session.expire_all() - retrieved = session.get(FieldParameters, test_global_id) + retrieved = session.get(NMA_FieldParameters, test_global_id) assert retrieved.sample_value == 7.4 assert retrieved.field_parameter == "pH" assert retrieved.units == "SU" @@ -115,7 +115,7 @@ def test_object_id_auto_generation(water_well_thing): """Verifies that the OBJECTID (Identity) column auto-increments in Postgres.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - fp1 = FieldParameters( + fp1 = NMA_FieldParameters( sample_pt_id=sample_info.sample_pt_id, field_parameter="Temp", ) @@ -135,7 +135,7 @@ def test_create_field_parameters_all_fields(water_well_thing): """Test creating a field parameters record with all fields.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record = FieldParameters( + record = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id=sample_info.sample_point_id, @@ -165,7 +165,7 @@ def test_create_field_parameters_minimal(water_well_thing): """Test creating a field parameters record with minimal fields.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record = FieldParameters( + record = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -189,14 +189,14 @@ def test_read_field_parameters_by_global_id(water_well_thing): """Test reading a field parameters record by GlobalID.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record = FieldParameters( + record = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) session.add(record) session.commit() - fetched = session.get(FieldParameters, record.global_id) + fetched = session.get(NMA_FieldParameters, record.global_id) assert fetched is not None assert fetched.global_id == record.global_id @@ -209,12 +209,12 @@ def test_query_field_parameters_by_sample_point_id(water_well_thing): """Test querying field parameters by sample_point_id.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record1 = FieldParameters( + record1 = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id=sample_info.sample_point_id, ) - record2 = FieldParameters( + record2 = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id="OTHER-PT", @@ -223,8 +223,8 @@ def test_query_field_parameters_by_sample_point_id(water_well_thing): session.commit() # Use SQLAlchemy 2.0 style select/execute for ORM queries. - stmt = select(FieldParameters).filter( - FieldParameters.sample_point_id == sample_info.sample_point_id + stmt = select(NMA_FieldParameters).filter( + NMA_FieldParameters.sample_point_id == sample_info.sample_point_id ) results = session.execute(stmt).scalars().all() assert len(results) >= 1 @@ -241,7 +241,7 @@ def test_update_field_parameters(water_well_thing): """Test updating a field parameters record.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record = FieldParameters( + record = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -266,7 +266,7 @@ def test_delete_field_parameters(water_well_thing): """Test deleting a field parameters record.""" with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - record = FieldParameters( + record = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -276,7 +276,7 @@ def test_delete_field_parameters(water_well_thing): session.delete(record) session.commit() - fetched = session.get(FieldParameters, record.global_id) + fetched = session.get(NMA_FieldParameters, record.global_id) assert fetched is None session.delete(sample_info) @@ -289,10 +289,10 @@ def test_delete_field_parameters(water_well_thing): def test_orphan_prevention_constraint(): """ VERIFIES: 'SamplePtID IS NOT NULL' and Foreign Key presence. - Ensures the DB rejects records that aren't linked to a ChemistrySampleInfo. + Ensures the DB rejects records that aren't linked to a NMA_Chemistry_SampleInfo. """ with session_ctx() as session: - orphan = FieldParameters( + orphan = NMA_FieldParameters( field_parameter="pH", sample_value=7.0, ) @@ -310,7 +310,7 @@ def test_cascade_delete_behavior(water_well_thing): """ with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - fp = FieldParameters( + fp = NMA_FieldParameters( sample_pt_id=sample_info.sample_pt_id, field_parameter="Temperature", ) @@ -325,7 +325,7 @@ def test_cascade_delete_behavior(water_well_thing): session.expire_all() assert ( - session.get(FieldParameters, fp_id) is None + session.get(NMA_FieldParameters, fp_id) is None ), "Child record persisted after parent deletion." @@ -336,7 +336,7 @@ def test_update_cascade_propagation(water_well_thing): """ with session_ctx() as session: sample_info = _create_sample_info(session, water_well_thing) - fp = FieldParameters( + fp = NMA_FieldParameters( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, field_parameter="Dissolved Oxygen", @@ -350,7 +350,7 @@ def test_update_cascade_propagation(water_well_thing): session.flush() session.rollback() - fetched = session.get(FieldParameters, fp_id) + fetched = session.get(NMA_FieldParameters, fp_id) if fetched is not None: session.delete(fetched) session.delete(sample_info) diff --git a/tests/test_hydraulics_data_legacy.py b/tests/test_hydraulics_data_legacy.py index c4b224fd..a2493337 100644 --- a/tests/test_hydraulics_data_legacy.py +++ b/tests/test_hydraulics_data_legacy.py @@ -45,7 +45,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import NMAHydraulicsData +from db.nma_legacy import NMA_HydraulicsData def _next_global_id(): @@ -56,7 +56,7 @@ def _next_global_id(): def test_create_hydraulics_data_all_fields(water_well_thing): """Test creating a hydraulics data record with all fields.""" with session_ctx() as session: - record = NMAHydraulicsData( + record = NMA_HydraulicsData( global_id=_next_global_id(), well_id=uuid4(), point_id=water_well_thing.name, @@ -100,7 +100,7 @@ def test_create_hydraulics_data_all_fields(water_well_thing): def test_create_hydraulics_data_minimal(water_well_thing): """Test creating a hydraulics data record with minimal fields.""" with session_ctx() as session: - record = NMAHydraulicsData( + record = NMA_HydraulicsData( global_id=_next_global_id(), test_top=10, test_bottom=20, @@ -125,7 +125,7 @@ def test_create_hydraulics_data_minimal(water_well_thing): def test_read_hydraulics_data_by_global_id(water_well_thing): """Test reading a hydraulics data record by GlobalID.""" with session_ctx() as session: - record = NMAHydraulicsData( + record = NMA_HydraulicsData( global_id=_next_global_id(), test_top=5, test_bottom=15, @@ -134,7 +134,7 @@ def test_read_hydraulics_data_by_global_id(water_well_thing): session.add(record) session.commit() - fetched = session.get(NMAHydraulicsData, record.global_id) + fetched = session.get(NMA_HydraulicsData, record.global_id) assert fetched is not None assert fetched.global_id == record.global_id @@ -145,7 +145,7 @@ def test_read_hydraulics_data_by_global_id(water_well_thing): def test_query_hydraulics_data_by_point_id(water_well_thing): """Test querying hydraulics data by point_id.""" with session_ctx() as session: - record1 = NMAHydraulicsData( + record1 = NMA_HydraulicsData( global_id=_next_global_id(), well_id=uuid4(), point_id=water_well_thing.name, @@ -153,7 +153,7 @@ def test_query_hydraulics_data_by_point_id(water_well_thing): test_bottom=20, thing_id=water_well_thing.id, ) - record2 = NMAHydraulicsData( + record2 = NMA_HydraulicsData( global_id=_next_global_id(), point_id="OTHER-POINT", test_top=30, @@ -164,8 +164,8 @@ def test_query_hydraulics_data_by_point_id(water_well_thing): session.commit() results = ( - session.query(NMAHydraulicsData) - .filter(NMAHydraulicsData.point_id == water_well_thing.name) + session.query(NMA_HydraulicsData) + .filter(NMA_HydraulicsData.point_id == water_well_thing.name) .all() ) assert len(results) >= 1 @@ -180,7 +180,7 @@ def test_query_hydraulics_data_by_point_id(water_well_thing): def test_update_hydraulics_data(water_well_thing): """Test updating a hydraulics data record.""" with session_ctx() as session: - record = NMAHydraulicsData( + record = NMA_HydraulicsData( global_id=_next_global_id(), test_top=5, test_bottom=15, @@ -205,7 +205,7 @@ def test_update_hydraulics_data(water_well_thing): def test_delete_hydraulics_data(water_well_thing): """Test deleting a hydraulics data record.""" with session_ctx() as session: - record = NMAHydraulicsData( + record = NMA_HydraulicsData( global_id=_next_global_id(), test_top=5, test_bottom=15, @@ -217,7 +217,7 @@ def test_delete_hydraulics_data(water_well_thing): session.delete(record) session.commit() - fetched = session.get(NMAHydraulicsData, record.global_id) + fetched = session.get(NMA_HydraulicsData, record.global_id) assert fetched is None @@ -251,13 +251,13 @@ def test_hydraulics_data_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - NMAHydraulicsData, column - ), f"Expected column '{column}' not found in NMAHydraulicsData model" + NMA_HydraulicsData, column + ), f"Expected column '{column}' not found in NMA_HydraulicsData model" def test_hydraulics_data_table_name(): """Test that the table name follows convention.""" - assert NMAHydraulicsData.__tablename__ == "NMA_HydraulicsData" + assert NMA_HydraulicsData.__tablename__ == "NMA_HydraulicsData" # ============= EOF ============================================= diff --git a/tests/test_major_chemistry_legacy.py b/tests/test_major_chemistry_legacy.py index c1299f1c..7161ec74 100644 --- a/tests/test_major_chemistry_legacy.py +++ b/tests/test_major_chemistry_legacy.py @@ -40,7 +40,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import ChemistrySampleInfo, NMAMajorChemistry +from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MajorChemistry def _next_sample_point_id() -> str: @@ -51,7 +51,7 @@ def _next_sample_point_id() -> str: def test_create_major_chemistry_all_fields(water_well_thing): """Test creating a major chemistry record with all fields.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -59,7 +59,7 @@ def test_create_major_chemistry_all_fields(water_well_thing): session.add(sample_info) session.commit() - record = NMAMajorChemistry( + record = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id=sample_info.sample_point_id, @@ -95,7 +95,7 @@ def test_create_major_chemistry_all_fields(water_well_thing): def test_create_major_chemistry_minimal(water_well_thing): """Test creating a major chemistry record with minimal fields.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -103,7 +103,7 @@ def test_create_major_chemistry_minimal(water_well_thing): session.add(sample_info) session.commit() - record = NMAMajorChemistry( + record = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -125,7 +125,7 @@ def test_create_major_chemistry_minimal(water_well_thing): def test_read_major_chemistry_by_global_id(water_well_thing): """Test reading a major chemistry record by GlobalID.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -133,14 +133,14 @@ def test_read_major_chemistry_by_global_id(water_well_thing): session.add(sample_info) session.commit() - record = NMAMajorChemistry( + record = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) session.add(record) session.commit() - fetched = session.get(NMAMajorChemistry, record.global_id) + fetched = session.get(NMA_MajorChemistry, record.global_id) assert fetched is not None assert fetched.global_id == record.global_id @@ -152,7 +152,7 @@ def test_read_major_chemistry_by_global_id(water_well_thing): def test_query_major_chemistry_by_sample_point_id(water_well_thing): """Test querying major chemistry by sample_point_id.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -160,12 +160,12 @@ def test_query_major_chemistry_by_sample_point_id(water_well_thing): session.add(sample_info) session.commit() - record1 = NMAMajorChemistry( + record1 = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id=sample_info.sample_point_id, ) - record2 = NMAMajorChemistry( + record2 = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, sample_point_id="OTHER-PT", @@ -174,8 +174,8 @@ def test_query_major_chemistry_by_sample_point_id(water_well_thing): session.commit() results = ( - session.query(NMAMajorChemistry) - .filter(NMAMajorChemistry.sample_point_id == sample_info.sample_point_id) + session.query(NMA_MajorChemistry) + .filter(NMA_MajorChemistry.sample_point_id == sample_info.sample_point_id) .all() ) assert len(results) >= 1 @@ -191,7 +191,7 @@ def test_query_major_chemistry_by_sample_point_id(water_well_thing): def test_update_major_chemistry(water_well_thing): """Test updating a major chemistry record.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -199,7 +199,7 @@ def test_update_major_chemistry(water_well_thing): session.add(sample_info) session.commit() - record = NMAMajorChemistry( + record = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -223,7 +223,7 @@ def test_update_major_chemistry(water_well_thing): def test_delete_major_chemistry(water_well_thing): """Test deleting a major chemistry record.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -231,7 +231,7 @@ def test_delete_major_chemistry(water_well_thing): session.add(sample_info) session.commit() - record = NMAMajorChemistry( + record = NMA_MajorChemistry( global_id=uuid4(), sample_pt_id=sample_info.sample_pt_id, ) @@ -241,7 +241,7 @@ def test_delete_major_chemistry(water_well_thing): session.delete(record) session.commit() - fetched = session.get(NMAMajorChemistry, record.global_id) + fetched = session.get(NMA_MajorChemistry, record.global_id) assert fetched is None session.delete(sample_info) @@ -272,13 +272,13 @@ def test_major_chemistry_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - NMAMajorChemistry, column - ), f"Expected column '{column}' not found in NMAMajorChemistry model" + NMA_MajorChemistry, column + ), f"Expected column '{column}' not found in NMA_MajorChemistry model" def test_major_chemistry_table_name(): """Test that the table name follows convention.""" - assert NMAMajorChemistry.__tablename__ == "NMA_MajorChemistry" + assert NMA_MajorChemistry.__tablename__ == "NMA_MajorChemistry" # ============= EOF ============================================= diff --git a/tests/test_ngwmn_views_legacy.py b/tests/test_ngwmn_views_legacy.py index bef807fa..61b1d854 100644 --- a/tests/test_ngwmn_views_legacy.py +++ b/tests/test_ngwmn_views_legacy.py @@ -24,9 +24,9 @@ from db.engine import session_ctx from db.nma_legacy import ( - ViewNGWMNWellConstruction, - ViewNGWMNWaterLevels, - ViewNGWMNLithology, + NMA_view_NGWMN_WellConstruction, + NMA_view_NGWMN_WaterLevels, + NMA_view_NGWMN_Lithology, ) @@ -39,7 +39,7 @@ def _next_object_id() -> int: def test_create_ngwmn_well_construction(): """Test creating an NGWMN well construction record.""" with session_ctx() as session: - record = ViewNGWMNWellConstruction( + record = NMA_view_NGWMN_WellConstruction( point_id="NG-1001", casing_top=10.0, casing_bottom=100.0, @@ -78,20 +78,23 @@ def test_ngwmn_well_construction_columns(): for column in expected_columns: assert hasattr( - ViewNGWMNWellConstruction, column - ), f"Expected column '{column}' not found in ViewNGWMNWellConstruction model" + NMA_view_NGWMN_WellConstruction, column + ), f"Expected column '{column}' not found in NMA_view_NGWMN_WellConstruction model" def test_ngwmn_well_construction_table_name(): """Test that the table name follows convention.""" - assert ViewNGWMNWellConstruction.__tablename__ == "NMA_view_NGWMN_WellConstruction" + assert ( + NMA_view_NGWMN_WellConstruction.__tablename__ + == "NMA_view_NGWMN_WellConstruction" + ) # ===================== WaterLevels tests ========================== def test_create_ngwmn_water_levels(): """Test creating an NGWMN water levels record.""" with session_ctx() as session: - record = ViewNGWMNWaterLevels( + record = NMA_view_NGWMN_WaterLevels( point_id="NG-2001", date_measured=date(2024, 1, 1), depth_to_water_bgs=12.3, @@ -103,7 +106,7 @@ def test_create_ngwmn_water_levels(): session.add(record) session.commit() - fetched = session.get(ViewNGWMNWaterLevels, ("NG-2001", date(2024, 1, 1))) + fetched = session.get(NMA_view_NGWMN_WaterLevels, ("NG-2001", date(2024, 1, 1))) assert fetched is not None assert fetched.point_id == "NG-2001" @@ -125,20 +128,20 @@ def test_ngwmn_water_levels_columns(): for column in expected_columns: assert hasattr( - ViewNGWMNWaterLevels, column - ), f"Expected column '{column}' not found in ViewNGWMNWaterLevels model" + NMA_view_NGWMN_WaterLevels, column + ), f"Expected column '{column}' not found in NMA_view_NGWMN_WaterLevels model" def test_ngwmn_water_levels_table_name(): """Test that the table name follows convention.""" - assert ViewNGWMNWaterLevels.__tablename__ == "NMA_view_NGWMN_WaterLevels" + assert NMA_view_NGWMN_WaterLevels.__tablename__ == "NMA_view_NGWMN_WaterLevels" # ===================== Lithology tests ========================== def test_create_ngwmn_lithology(): """Test creating an NGWMN lithology record.""" with session_ctx() as session: - record = ViewNGWMNLithology( + record = NMA_view_NGWMN_Lithology( object_id=_next_object_id(), point_id="NG-3001", lithology="Sand", @@ -176,13 +179,13 @@ def test_ngwmn_lithology_columns(): for column in expected_columns: assert hasattr( - ViewNGWMNLithology, column - ), f"Expected column '{column}' not found in ViewNGWMNLithology model" + NMA_view_NGWMN_Lithology, column + ), f"Expected column '{column}' not found in NMA_view_NGWMN_Lithology model" def test_ngwmn_lithology_table_name(): """Test that the table name follows convention.""" - assert ViewNGWMNLithology.__tablename__ == "NMA_view_NGWMN_Lithology" + assert NMA_view_NGWMN_Lithology.__tablename__ == "NMA_view_NGWMN_Lithology" # ============= EOF ============================================= diff --git a/tests/test_nma_chemistry_lineage.py b/tests/test_nma_chemistry_lineage.py index b1e712b6..3cef600f 100644 --- a/tests/test_nma_chemistry_lineage.py +++ b/tests/test_nma_chemistry_lineage.py @@ -17,7 +17,7 @@ Unit tests for NMA Chemistry lineage OO associations. Lineage: - Thing (1) ---> (*) ChemistrySampleInfo (1) ---> (*) NMAMinorTraceChemistry + Thing (1) ---> (*) NMA_Chemistry_SampleInfo (1) ---> (*) NMA_MinorTraceChemistry Tests verify SQLAlchemy relationships enable OO navigation: - thing.chemistry_sample_infos @@ -82,27 +82,27 @@ def shared_well(): def test_models_importable(): """Models should be importable from db.nma_legacy.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry - assert ChemistrySampleInfo is not None - assert NMAMinorTraceChemistry is not None + assert NMA_Chemistry_SampleInfo is not None + assert NMA_MinorTraceChemistry is not None def test_nma_minor_trace_chemistry_table_name(): - """NMAMinorTraceChemistry should have correct table name.""" - from db.nma_legacy import NMAMinorTraceChemistry + """NMA_MinorTraceChemistry should have correct table name.""" + from db.nma_legacy import NMA_MinorTraceChemistry - assert NMAMinorTraceChemistry.__tablename__ == "NMA_MinorTraceChemistry" + assert NMA_MinorTraceChemistry.__tablename__ == "NMA_MinorTraceChemistry" def test_nma_minor_trace_chemistry_columns(): """ - NMAMinorTraceChemistry should have required columns. + NMA_MinorTraceChemistry should have required columns. Omitted legacy columns: globalid, objectid, ssma_timestamp, samplepointid, sampleptid, wclab_id """ - from db.nma_legacy import NMAMinorTraceChemistry + from db.nma_legacy import NMA_MinorTraceChemistry expected_columns = [ "global_id", # PK @@ -122,19 +122,19 @@ def test_nma_minor_trace_chemistry_columns(): ] for col in expected_columns: - assert hasattr(NMAMinorTraceChemistry, col), f"Missing column: {col}" + assert hasattr(NMA_MinorTraceChemistry, col), f"Missing column: {col}" def test_nma_minor_trace_chemistry_save_all_columns(shared_well): - """Can save NMAMinorTraceChemistry with all columns populated.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + """Can save NMA_MinorTraceChemistry with all columns populated.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing from datetime import date with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -143,7 +143,7 @@ def test_nma_minor_trace_chemistry_save_all_columns(shared_well): session.add(sample_info) session.commit() - mtc = NMAMinorTraceChemistry( + mtc = NMA_MinorTraceChemistry( global_id=_next_global_id(), chemistry_sample_info=sample_info, analyte="As", @@ -181,7 +181,7 @@ def test_nma_minor_trace_chemistry_save_all_columns(shared_well): session.commit() -# ===================== Thing → ChemistrySampleInfo association ========================== +# ===================== Thing → NMA_Chemistry_SampleInfo association ========================== def test_thing_has_chemistry_sample_infos_attribute(shared_well): @@ -215,14 +215,14 @@ def test_thing_chemistry_sample_infos_empty_by_default(): def test_assign_thing_to_sample_info(shared_well): - """Can assign Thing to ChemistrySampleInfo via object (not just ID).""" - from db.nma_legacy import ChemistrySampleInfo + """Can assign Thing to NMA_Chemistry_SampleInfo via object (not just ID).""" + from db.nma_legacy import NMA_Chemistry_SampleInfo from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -240,14 +240,14 @@ def test_assign_thing_to_sample_info(shared_well): def test_append_sample_info_to_thing(shared_well): - """Can append ChemistrySampleInfo to Thing's collection.""" - from db.nma_legacy import ChemistrySampleInfo + """Can append NMA_Chemistry_SampleInfo to Thing's collection.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -263,23 +263,23 @@ def test_append_sample_info_to_thing(shared_well): session.commit() -# ===================== ChemistrySampleInfo → Thing association ========================== +# ===================== NMA_Chemistry_SampleInfo → Thing association ========================== def test_sample_info_has_thing_attribute(): - """ChemistrySampleInfo should have thing relationship.""" - from db.nma_legacy import ChemistrySampleInfo + """NMA_Chemistry_SampleInfo should have thing relationship.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo - assert hasattr(ChemistrySampleInfo, "thing") + assert hasattr(NMA_Chemistry_SampleInfo, "thing") def test_sample_info_requires_thing(): - """ChemistrySampleInfo cannot be orphaned - must have a parent Thing.""" - from db.nma_legacy import ChemistrySampleInfo + """NMA_Chemistry_SampleInfo cannot be orphaned - must have a parent Thing.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo # Validator raises ValueError before database is even touched with pytest.raises(ValueError, match="requires a parent Thing"): - ChemistrySampleInfo( + NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -287,25 +287,25 @@ def test_sample_info_requires_thing(): ) -# ===================== ChemistrySampleInfo → NMAMinorTraceChemistry association ========================== +# ===================== NMA_Chemistry_SampleInfo → NMA_MinorTraceChemistry association ========================== def test_sample_info_has_minor_trace_chemistries_attribute(): - """ChemistrySampleInfo should have minor_trace_chemistries relationship.""" - from db.nma_legacy import ChemistrySampleInfo + """NMA_Chemistry_SampleInfo should have minor_trace_chemistries relationship.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo - assert hasattr(ChemistrySampleInfo, "minor_trace_chemistries") + assert hasattr(NMA_Chemistry_SampleInfo, "minor_trace_chemistries") def test_sample_info_minor_trace_chemistries_empty_by_default(shared_well): - """New ChemistrySampleInfo should have empty minor_trace_chemistries.""" - from db.nma_legacy import ChemistrySampleInfo + """New NMA_Chemistry_SampleInfo should have empty minor_trace_chemistries.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -322,14 +322,14 @@ def test_sample_info_minor_trace_chemistries_empty_by_default(shared_well): def test_assign_sample_info_to_mtc(shared_well): - """Can assign ChemistrySampleInfo to MinorTraceChemistry via object.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + """Can assign NMA_Chemistry_SampleInfo to MinorTraceChemistry via object.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -338,7 +338,7 @@ def test_assign_sample_info_to_mtc(shared_well): session.add(sample_info) session.commit() - mtc = NMAMinorTraceChemistry( + mtc = NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte="As", sample_value=0.01, @@ -357,14 +357,14 @@ def test_assign_sample_info_to_mtc(shared_well): def test_append_mtc_to_sample_info(shared_well): - """Can append MinorTraceChemistry to ChemistrySampleInfo's collection.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + """Can append MinorTraceChemistry to NMA_Chemistry_SampleInfo's collection.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -373,7 +373,7 @@ def test_append_mtc_to_sample_info(shared_well): session.add(sample_info) session.commit() - mtc = NMAMinorTraceChemistry( + mtc = NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte="U", sample_value=15.2, @@ -390,23 +390,23 @@ def test_append_mtc_to_sample_info(shared_well): session.commit() -# ===================== NMAMinorTraceChemistry → ChemistrySampleInfo association ========================== +# ===================== NMA_MinorTraceChemistry → NMA_Chemistry_SampleInfo association ========================== def test_mtc_has_chemistry_sample_info_attribute(): - """NMAMinorTraceChemistry should have chemistry_sample_info relationship.""" - from db.nma_legacy import NMAMinorTraceChemistry + """NMA_MinorTraceChemistry should have chemistry_sample_info relationship.""" + from db.nma_legacy import NMA_MinorTraceChemistry - assert hasattr(NMAMinorTraceChemistry, "chemistry_sample_info") + assert hasattr(NMA_MinorTraceChemistry, "chemistry_sample_info") def test_mtc_requires_chemistry_sample_info(): - """NMAMinorTraceChemistry cannot be orphaned - must have a parent.""" - from db.nma_legacy import NMAMinorTraceChemistry + """NMA_MinorTraceChemistry cannot be orphaned - must have a parent.""" + from db.nma_legacy import NMA_MinorTraceChemistry # Validator raises ValueError before database is even touched - with pytest.raises(ValueError, match="requires a parent ChemistrySampleInfo"): - NMAMinorTraceChemistry( + with pytest.raises(ValueError, match="requires a parent NMA_Chemistry_SampleInfo"): + NMA_MinorTraceChemistry( analyte="As", sample_value=0.01, units="mg/L", @@ -419,13 +419,13 @@ def test_mtc_requires_chemistry_sample_info(): def test_full_lineage_navigation(shared_well): """Can navigate full chain: mtc.chemistry_sample_info.thing""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -434,7 +434,7 @@ def test_full_lineage_navigation(shared_well): session.add(sample_info) session.commit() - mtc = NMAMinorTraceChemistry( + mtc = NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte="Se", sample_value=0.005, @@ -453,13 +453,13 @@ def test_full_lineage_navigation(shared_well): def test_reverse_lineage_navigation(shared_well): """Can navigate reverse: thing.chemistry_sample_infos[0].minor_trace_chemistries""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -468,7 +468,7 @@ def test_reverse_lineage_navigation(shared_well): session.add(sample_info) session.commit() - mtc = NMAMinorTraceChemistry( + mtc = NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte="Pb", sample_value=0.002, @@ -497,14 +497,14 @@ def test_reverse_lineage_navigation(shared_well): def test_cascade_delete_sample_info_deletes_mtc(shared_well): - """Deleting ChemistrySampleInfo should cascade delete its MinorTraceChemistries.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + """Deleting NMA_Chemistry_SampleInfo should cascade delete its MinorTraceChemistries.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -516,7 +516,7 @@ def test_cascade_delete_sample_info_deletes_mtc(shared_well): # Add multiple children for analyte in ["As", "U", "Se", "Pb"]: sample_info.minor_trace_chemistries.append( - NMAMinorTraceChemistry( + NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte=analyte, sample_value=0.01, @@ -527,7 +527,7 @@ def test_cascade_delete_sample_info_deletes_mtc(shared_well): sample_info_id = sample_info.sample_pt_id assert ( - session.query(NMAMinorTraceChemistry) + session.query(NMA_MinorTraceChemistry) .filter_by(chemistry_sample_info_id=sample_info_id) .count() == 4 @@ -539,7 +539,7 @@ def test_cascade_delete_sample_info_deletes_mtc(shared_well): # Children should be gone assert ( - session.query(NMAMinorTraceChemistry) + session.query(NMA_MinorTraceChemistry) .filter_by(chemistry_sample_info_id=sample_info_id) .count() == 0 @@ -547,8 +547,8 @@ def test_cascade_delete_sample_info_deletes_mtc(shared_well): def test_cascade_delete_thing_deletes_sample_infos(): - """Deleting Thing should cascade delete its ChemistrySampleInfos.""" - from db.nma_legacy import ChemistrySampleInfo + """Deleting Thing should cascade delete its NMA_Chemistry_SampleInfos.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo from db import Thing with session_ctx() as session: @@ -561,7 +561,7 @@ def test_cascade_delete_thing_deletes_sample_infos(): session.add(test_thing) session.commit() - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -570,7 +570,7 @@ def test_cascade_delete_thing_deletes_sample_infos(): session.add(sample_info) session.commit() - # SamplePtID is the PK for ChemistrySampleInfo. + # SamplePtID is the PK for NMA_Chemistry_SampleInfo. sample_info_id = sample_info.sample_pt_id # Delete thing @@ -579,15 +579,15 @@ def test_cascade_delete_thing_deletes_sample_infos(): # Use fresh session to verify cascade delete (avoid session cache) with session_ctx() as session: - assert session.get(ChemistrySampleInfo, sample_info_id) is None + assert session.get(NMA_Chemistry_SampleInfo, sample_info_id) is None # ===================== Multiple children ========================== def test_multiple_sample_infos_per_thing(): - """Thing can have multiple ChemistrySampleInfos.""" - from db.nma_legacy import ChemistrySampleInfo + """Thing can have multiple NMA_Chemistry_SampleInfos.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo from db import Thing with session_ctx() as session: @@ -601,7 +601,7 @@ def test_multiple_sample_infos_per_thing(): session.commit() for i in range(3): - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -619,14 +619,14 @@ def test_multiple_sample_infos_per_thing(): def test_multiple_mtc_per_sample_info(shared_well): - """ChemistrySampleInfo can have multiple MinorTraceChemistries.""" - from db.nma_legacy import ChemistrySampleInfo, NMAMinorTraceChemistry + """NMA_Chemistry_SampleInfo can have multiple MinorTraceChemistries.""" + from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db import Thing with session_ctx() as session: well = session.get(Thing, shared_well) - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( object_id=_next_object_id(), sample_pt_id=_next_sample_pt_id(), sample_point_id=_next_sample_point_id(), @@ -638,7 +638,7 @@ def test_multiple_mtc_per_sample_info(shared_well): analytes = ["As", "U", "Se", "Pb", "Cd", "Hg"] for analyte in analytes: sample_info.minor_trace_chemistries.append( - NMAMinorTraceChemistry( + NMA_MinorTraceChemistry( global_id=_next_global_id(), analyte=analyte, sample_value=0.01, diff --git a/tests/test_radionuclides_legacy.py b/tests/test_radionuclides_legacy.py index d77d877d..1e13e5b6 100644 --- a/tests/test_radionuclides_legacy.py +++ b/tests/test_radionuclides_legacy.py @@ -40,7 +40,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import ChemistrySampleInfo, NMARadionuclides +from db.nma_legacy import NMA_Chemistry_SampleInfo, NMA_Radionuclides def _next_sample_point_id() -> str: @@ -51,7 +51,7 @@ def _next_sample_point_id() -> str: def test_create_radionuclides_all_fields(water_well_thing): """Test creating a radionuclides record with all fields.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -59,7 +59,7 @@ def test_create_radionuclides_all_fields(water_well_thing): session.add(sample_info) session.commit() - record = NMARadionuclides( + record = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -96,7 +96,7 @@ def test_create_radionuclides_all_fields(water_well_thing): def test_create_radionuclides_minimal(water_well_thing): """Test creating a radionuclides record with minimal fields.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -104,7 +104,7 @@ def test_create_radionuclides_minimal(water_well_thing): session.add(sample_info) session.commit() - record = NMARadionuclides( + record = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -127,7 +127,7 @@ def test_create_radionuclides_minimal(water_well_thing): def test_read_radionuclides_by_global_id(water_well_thing): """Test reading a radionuclides record by GlobalID.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -135,7 +135,7 @@ def test_read_radionuclides_by_global_id(water_well_thing): session.add(sample_info) session.commit() - record = NMARadionuclides( + record = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -143,7 +143,7 @@ def test_read_radionuclides_by_global_id(water_well_thing): session.add(record) session.commit() - fetched = session.get(NMARadionuclides, record.global_id) + fetched = session.get(NMA_Radionuclides, record.global_id) assert fetched is not None assert fetched.global_id == record.global_id @@ -155,7 +155,7 @@ def test_read_radionuclides_by_global_id(water_well_thing): def test_query_radionuclides_by_sample_point_id(water_well_thing): """Test querying radionuclides by sample_point_id.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -163,13 +163,13 @@ def test_query_radionuclides_by_sample_point_id(water_well_thing): session.add(sample_info) session.commit() - record1 = NMARadionuclides( + record1 = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, sample_point_id=sample_info.sample_point_id, ) - record2 = NMARadionuclides( + record2 = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -179,8 +179,8 @@ def test_query_radionuclides_by_sample_point_id(water_well_thing): session.commit() results = ( - session.query(NMARadionuclides) - .filter(NMARadionuclides.sample_point_id == sample_info.sample_point_id) + session.query(NMA_Radionuclides) + .filter(NMA_Radionuclides.sample_point_id == sample_info.sample_point_id) .all() ) assert len(results) >= 1 @@ -196,7 +196,7 @@ def test_query_radionuclides_by_sample_point_id(water_well_thing): def test_update_radionuclides(water_well_thing): """Test updating a radionuclides record.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -204,7 +204,7 @@ def test_update_radionuclides(water_well_thing): session.add(sample_info) session.commit() - record = NMARadionuclides( + record = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -229,7 +229,7 @@ def test_update_radionuclides(water_well_thing): def test_delete_radionuclides(water_well_thing): """Test deleting a radionuclides record.""" with session_ctx() as session: - sample_info = ChemistrySampleInfo( + sample_info = NMA_Chemistry_SampleInfo( sample_pt_id=uuid4(), sample_point_id=_next_sample_point_id(), thing_id=water_well_thing.id, @@ -237,7 +237,7 @@ def test_delete_radionuclides(water_well_thing): session.add(sample_info) session.commit() - record = NMARadionuclides( + record = NMA_Radionuclides( global_id=uuid4(), thing_id=water_well_thing.id, sample_pt_id=sample_info.sample_pt_id, @@ -248,7 +248,7 @@ def test_delete_radionuclides(water_well_thing): session.delete(record) session.commit() - fetched = session.get(NMARadionuclides, record.global_id) + fetched = session.get(NMA_Radionuclides, record.global_id) assert fetched is None session.delete(sample_info) @@ -280,13 +280,13 @@ def test_radionuclides_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - NMARadionuclides, column - ), f"Expected column '{column}' not found in NMARadionuclides model" + NMA_Radionuclides, column + ), f"Expected column '{column}' not found in NMA_Radionuclides model" def test_radionuclides_table_name(): """Test that the table name follows convention.""" - assert NMARadionuclides.__tablename__ == "NMA_Radionuclides" + assert NMA_Radionuclides.__tablename__ == "NMA_Radionuclides" # ============= EOF ============================================= diff --git a/tests/test_soil_rock_results_legacy.py b/tests/test_soil_rock_results_legacy.py index 988a64bc..72ac70df 100644 --- a/tests/test_soil_rock_results_legacy.py +++ b/tests/test_soil_rock_results_legacy.py @@ -28,13 +28,13 @@ """ from db.engine import session_ctx -from db.nma_legacy import SoilRockResults +from db.nma_legacy import NMA_Soil_Rock_Results def test_create_soil_rock_results_all_fields(water_well_thing): """Test creating a soil/rock results record with all fields.""" with session_ctx() as session: - record = SoilRockResults( + record = NMA_Soil_Rock_Results( point_id="SR-0001", sample_type="Soil", date_sampled="2026-01-01", @@ -62,7 +62,7 @@ def test_create_soil_rock_results_all_fields(water_well_thing): def test_create_soil_rock_results_minimal(): """Test creating a soil/rock results record with required fields only.""" with session_ctx() as session: - record = SoilRockResults() + record = NMA_Soil_Rock_Results() session.add(record) session.commit() session.refresh(record) diff --git a/tests/test_surface_water_data_legacy.py b/tests/test_surface_water_data_legacy.py index 25965603..7955f302 100644 --- a/tests/test_surface_water_data_legacy.py +++ b/tests/test_surface_water_data_legacy.py @@ -14,9 +14,9 @@ # limitations under the License. # =============================================================================== """ -Unit tests for SurfaceWaterData legacy model. +Unit tests for NMA_SurfaceWaterData legacy model. -These tests verify the migration of columns from the legacy SurfaceWaterData table. +These tests verify the migration of columns from the legacy NMA_SurfaceWaterData table. Migrated columns: - SurfaceID -> surface_id - PointID -> point_id @@ -39,7 +39,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import SurfaceWaterData +from db.nma_legacy import NMA_SurfaceWaterData def _next_object_id() -> int: @@ -51,7 +51,7 @@ def _next_object_id() -> int: def test_create_surface_water_data_all_fields(): """Test creating a surface water data record with all fields.""" with session_ctx() as session: - record = SurfaceWaterData( + record = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1001", object_id=_next_object_id(), @@ -84,7 +84,7 @@ def test_create_surface_water_data_all_fields(): def test_create_surface_water_data_minimal(): """Test creating a surface water data record with minimal fields.""" with session_ctx() as session: - record = SurfaceWaterData( + record = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1002", object_id=_next_object_id(), @@ -106,7 +106,7 @@ def test_create_surface_water_data_minimal(): def test_read_surface_water_data_by_object_id(): """Test reading a surface water data record by OBJECTID.""" with session_ctx() as session: - record = SurfaceWaterData( + record = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1003", object_id=_next_object_id(), @@ -114,7 +114,7 @@ def test_read_surface_water_data_by_object_id(): session.add(record) session.commit() - fetched = session.get(SurfaceWaterData, record.object_id) + fetched = session.get(NMA_SurfaceWaterData, record.object_id) assert fetched is not None assert fetched.object_id == record.object_id assert fetched.point_id == "SW-1003" @@ -126,12 +126,12 @@ def test_read_surface_water_data_by_object_id(): def test_query_surface_water_data_by_point_id(): """Test querying surface water data by point_id.""" with session_ctx() as session: - record1 = SurfaceWaterData( + record1 = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1004", object_id=_next_object_id(), ) - record2 = SurfaceWaterData( + record2 = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1005", object_id=_next_object_id(), @@ -140,8 +140,8 @@ def test_query_surface_water_data_by_point_id(): session.commit() results = ( - session.query(SurfaceWaterData) - .filter(SurfaceWaterData.point_id == "SW-1004") + session.query(NMA_SurfaceWaterData) + .filter(NMA_SurfaceWaterData.point_id == "SW-1004") .all() ) assert len(results) >= 1 @@ -156,7 +156,7 @@ def test_query_surface_water_data_by_point_id(): def test_update_surface_water_data(): """Test updating a surface water data record.""" with session_ctx() as session: - record = SurfaceWaterData( + record = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1006", object_id=_next_object_id(), @@ -180,7 +180,7 @@ def test_update_surface_water_data(): def test_delete_surface_water_data(): """Test deleting a surface water data record.""" with session_ctx() as session: - record = SurfaceWaterData( + record = NMA_SurfaceWaterData( surface_id=uuid4(), point_id="SW-1007", object_id=_next_object_id(), @@ -191,7 +191,7 @@ def test_delete_surface_water_data(): session.delete(record) session.commit() - fetched = session.get(SurfaceWaterData, record.object_id) + fetched = session.get(NMA_SurfaceWaterData, record.object_id) assert fetched is None @@ -218,13 +218,13 @@ def test_surface_water_data_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - SurfaceWaterData, column - ), f"Expected column '{column}' not found in SurfaceWaterData model" + NMA_SurfaceWaterData, column + ), f"Expected column '{column}' not found in NMA_SurfaceWaterData model" def test_surface_water_data_table_name(): """Test that the table name follows convention.""" - assert SurfaceWaterData.__tablename__ == "NMA_SurfaceWaterData" + assert NMA_SurfaceWaterData.__tablename__ == "NMA_SurfaceWaterData" # ============= EOF ============================================= diff --git a/tests/test_surface_water_photos_legacy.py b/tests/test_surface_water_photos_legacy.py index 4660bf84..7f6416b5 100644 --- a/tests/test_surface_water_photos_legacy.py +++ b/tests/test_surface_water_photos_legacy.py @@ -14,9 +14,9 @@ # limitations under the License. # ============================================================================== """ -Unit tests for SurfaceWaterPhotos legacy model. +Unit tests for NMA_SurfaceWaterPhotos legacy model. -These tests verify the migration of columns from the legacy SurfaceWaterPhotos table. +These tests verify the migration of columns from the legacy NMA_SurfaceWaterPhotos table. Migrated columns: - SurfaceID -> surface_id - PointID -> point_id @@ -28,13 +28,13 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import SurfaceWaterPhotos +from db.nma_legacy import NMA_SurfaceWaterPhotos def test_create_surface_water_photos_all_fields(): """Test creating a surface water photos record with all fields.""" with session_ctx() as session: - record = SurfaceWaterPhotos( + record = NMA_SurfaceWaterPhotos( surface_id=uuid4(), point_id="SW-0001", ole_path="photo.jpg", @@ -58,7 +58,7 @@ def test_create_surface_water_photos_all_fields(): def test_create_surface_water_photos_minimal(): """Test creating a surface water photos record with required fields only.""" with session_ctx() as session: - record = SurfaceWaterPhotos( + record = NMA_SurfaceWaterPhotos( point_id="SW-0002", global_id=uuid4(), ) diff --git a/tests/test_waterlevelscontinuous_pressure_daily_legacy.py b/tests/test_waterlevelscontinuous_pressure_daily_legacy.py index e4769b6e..7328e405 100644 --- a/tests/test_waterlevelscontinuous_pressure_daily_legacy.py +++ b/tests/test_waterlevelscontinuous_pressure_daily_legacy.py @@ -24,7 +24,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import NMAWaterLevelsContinuousPressureDaily +from db.nma_legacy import NMA_WaterLevelsContinuous_Pressure_Daily def _next_global_id() -> str: @@ -41,7 +41,7 @@ def test_create_pressure_daily_all_fields(): """Test creating a pressure daily record with required fields.""" with session_ctx() as session: now = datetime(2024, 1, 1, 12, 0, 0) - record = NMAWaterLevelsContinuousPressureDaily( + record = NMA_WaterLevelsContinuous_Pressure_Daily( global_id=_next_global_id(), object_id=_next_object_id(), well_id="WELL-1", @@ -78,7 +78,7 @@ def test_create_pressure_daily_minimal(): """Test creating a pressure daily record with minimal fields.""" with session_ctx() as session: now = datetime(2024, 1, 2, 12, 0, 0) - record = NMAWaterLevelsContinuousPressureDaily( + record = NMA_WaterLevelsContinuous_Pressure_Daily( global_id=_next_global_id(), point_id="PD-1002", date_measured=now, @@ -101,7 +101,7 @@ def test_read_pressure_daily_by_global_id(): """Test reading a pressure daily record by GlobalID.""" with session_ctx() as session: now = datetime(2024, 1, 3, 12, 0, 0) - record = NMAWaterLevelsContinuousPressureDaily( + record = NMA_WaterLevelsContinuous_Pressure_Daily( global_id=_next_global_id(), point_id="PD-1003", date_measured=now, @@ -111,7 +111,9 @@ def test_read_pressure_daily_by_global_id(): session.add(record) session.commit() - fetched = session.get(NMAWaterLevelsContinuousPressureDaily, record.global_id) + fetched = session.get( + NMA_WaterLevelsContinuous_Pressure_Daily, record.global_id + ) assert fetched is not None assert fetched.global_id == record.global_id assert fetched.point_id == "PD-1003" @@ -125,7 +127,7 @@ def test_update_pressure_daily(): """Test updating a pressure daily record.""" with session_ctx() as session: now = datetime(2024, 1, 4, 12, 0, 0) - record = NMAWaterLevelsContinuousPressureDaily( + record = NMA_WaterLevelsContinuous_Pressure_Daily( global_id=_next_global_id(), point_id="PD-1004", date_measured=now, @@ -152,7 +154,7 @@ def test_delete_pressure_daily(): """Test deleting a pressure daily record.""" with session_ctx() as session: now = datetime(2024, 1, 5, 12, 0, 0) - record = NMAWaterLevelsContinuousPressureDaily( + record = NMA_WaterLevelsContinuous_Pressure_Daily( global_id=_next_global_id(), point_id="PD-1005", date_measured=now, @@ -165,7 +167,9 @@ def test_delete_pressure_daily(): session.delete(record) session.commit() - fetched = session.get(NMAWaterLevelsContinuousPressureDaily, record.global_id) + fetched = session.get( + NMA_WaterLevelsContinuous_Pressure_Daily, record.global_id + ) assert fetched is None @@ -196,14 +200,14 @@ def test_pressure_daily_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - NMAWaterLevelsContinuousPressureDaily, column + NMA_WaterLevelsContinuous_Pressure_Daily, column ), f"Expected column '{column}' not found in pressure daily model" def test_pressure_daily_table_name(): """Test that the table name follows convention.""" assert ( - NMAWaterLevelsContinuousPressureDaily.__tablename__ + NMA_WaterLevelsContinuous_Pressure_Daily.__tablename__ == "NMA_WaterLevelsContinuous_Pressure_Daily" ) diff --git a/tests/test_weather_data_legacy.py b/tests/test_weather_data_legacy.py index 7273fd96..cce28e66 100644 --- a/tests/test_weather_data_legacy.py +++ b/tests/test_weather_data_legacy.py @@ -14,9 +14,9 @@ # limitations under the License. # =============================================================================== """ -Unit tests for WeatherData legacy model. +Unit tests for NMA_WeatherData legacy model. -These tests verify the migration of columns from the legacy WeatherData table. +These tests verify the migration of columns from the legacy NMA_WeatherData table. Migrated columns (excluding SSMA_TimeStamp): - LocationId -> location_id - PointID -> point_id @@ -27,7 +27,7 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import WeatherData +from db.nma_legacy import NMA_WeatherData def _next_object_id() -> int: @@ -39,7 +39,7 @@ def _next_object_id() -> int: def test_create_weather_data_all_fields(): """Test creating a weather data record with all migrated fields.""" with session_ctx() as session: - record = WeatherData( + record = NMA_WeatherData( object_id=_next_object_id(), location_id=uuid4(), point_id="WX-1001", @@ -61,7 +61,7 @@ def test_create_weather_data_all_fields(): def test_create_weather_data_minimal(): """Test creating a weather data record with minimal fields.""" with session_ctx() as session: - record = WeatherData( + record = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1002", ) @@ -82,14 +82,14 @@ def test_create_weather_data_minimal(): def test_read_weather_data_by_object_id(): """Test reading a specific weather data record by OBJECTID.""" with session_ctx() as session: - record = WeatherData( + record = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1003", ) session.add(record) session.commit() - fetched = session.get(WeatherData, record.object_id) + fetched = session.get(NMA_WeatherData, record.object_id) assert fetched is not None assert fetched.object_id == record.object_id assert fetched.point_id == "WX-1003" @@ -101,11 +101,11 @@ def test_read_weather_data_by_object_id(): def test_query_weather_data_by_point_id(): """Test querying weather data by point_id.""" with session_ctx() as session: - record1 = WeatherData( + record1 = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1004", ) - record2 = WeatherData( + record2 = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1005", ) @@ -113,7 +113,9 @@ def test_query_weather_data_by_point_id(): session.commit() results = ( - session.query(WeatherData).filter(WeatherData.point_id == "WX-1004").all() + session.query(NMA_WeatherData) + .filter(NMA_WeatherData.point_id == "WX-1004") + .all() ) assert len(results) >= 1 assert all(r.point_id == "WX-1004" for r in results) @@ -127,7 +129,7 @@ def test_query_weather_data_by_point_id(): def test_update_weather_data(): """Test updating a weather data record.""" with session_ctx() as session: - record = WeatherData( + record = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1006", ) @@ -152,7 +154,7 @@ def test_update_weather_data(): def test_delete_weather_data(): """Test deleting a weather data record.""" with session_ctx() as session: - record = WeatherData( + record = NMA_WeatherData( object_id=_next_object_id(), point_id="WX-1007", ) @@ -162,14 +164,14 @@ def test_delete_weather_data(): session.delete(record) session.commit() - fetched = session.get(WeatherData, record.object_id) + fetched = session.get(NMA_WeatherData, record.object_id) assert fetched is None # ===================== Column existence tests ========================== def test_weather_data_has_all_migrated_columns(): """ - Test that the model has all expected columns from WeatherData. + Test that the model has all expected columns from NMA_WeatherData. """ expected_columns = [ "location_id", @@ -180,13 +182,13 @@ def test_weather_data_has_all_migrated_columns(): for column in expected_columns: assert hasattr( - WeatherData, column - ), f"Expected column '{column}' not found in WeatherData model" + NMA_WeatherData, column + ), f"Expected column '{column}' not found in NMA_WeatherData model" def test_weather_data_table_name(): """Test that the table name follows convention.""" - assert WeatherData.__tablename__ == "NMA_WeatherData" + assert NMA_WeatherData.__tablename__ == "NMA_WeatherData" # ============= EOF ============================================= diff --git a/tests/test_weather_photos_legacy.py b/tests/test_weather_photos_legacy.py index c470aa76..f808dd87 100644 --- a/tests/test_weather_photos_legacy.py +++ b/tests/test_weather_photos_legacy.py @@ -14,9 +14,9 @@ # limitations under the License. # ============================================================================== """ -Unit tests for WeatherPhotos legacy model. +Unit tests for NMA_WeatherPhotos legacy model. -These tests verify the migration of columns from the legacy WeatherPhotos table. +These tests verify the migration of columns from the legacy NMA_WeatherPhotos table. Migrated columns: - WeatherID -> weather_id - PointID -> point_id @@ -28,13 +28,13 @@ from uuid import uuid4 from db.engine import session_ctx -from db.nma_legacy import WeatherPhotos +from db.nma_legacy import NMA_WeatherPhotos def test_create_weather_photos_all_fields(): """Test creating a weather photos record with all fields.""" with session_ctx() as session: - record = WeatherPhotos( + record = NMA_WeatherPhotos( weather_id=uuid4(), point_id="WP-0001", ole_path="weather.jpg", @@ -58,7 +58,7 @@ def test_create_weather_photos_all_fields(): def test_create_weather_photos_minimal(): """Test creating a weather photos record with required fields only.""" with session_ctx() as session: - record = WeatherPhotos( + record = NMA_WeatherPhotos( point_id="WP-0002", global_id=uuid4(), ) diff --git a/transfers/associated_data.py b/transfers/associated_data.py index 56d6d836..be29a2c7 100644 --- a/transfers/associated_data.py +++ b/transfers/associated_data.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import AssociatedData, Thing +from db import NMA_AssociatedData, Thing from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -60,7 +60,7 @@ def _transfer_hook(self, session: Session) -> None: logger.info("No AssociatedData rows to transfer") return - insert_stmt = insert(AssociatedData) + insert_stmt = insert(NMA_AssociatedData) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/chemistry_sampleinfo.py b/transfers/chemistry_sampleinfo.py index 9020f553..3c4fd444 100644 --- a/transfers/chemistry_sampleinfo.py +++ b/transfers/chemistry_sampleinfo.py @@ -24,7 +24,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import ChemistrySampleInfo, Thing +from db import NMA_Chemistry_SampleInfo, Thing from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -205,7 +205,7 @@ def _transfer_hook(self, session: Session) -> None: rows = self._dedupe_rows(row_dicts, key="OBJECTID") - insert_stmt = insert(ChemistrySampleInfo) + insert_stmt = insert(NMA_Chemistry_SampleInfo) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/field_parameters_transfer.py b/transfers/field_parameters_transfer.py index 2e4547f8..b9a4fe6c 100644 --- a/transfers/field_parameters_transfer.py +++ b/transfers/field_parameters_transfer.py @@ -28,7 +28,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import ChemistrySampleInfo, FieldParameters +from db import NMA_Chemistry_SampleInfo, NMA_FieldParameters from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -54,7 +54,7 @@ def __init__(self, *args, batch_size: int = 1000, **kwargs): def _build_sample_pt_id_cache(self) -> None: """Build cache of ChemistrySampleInfo.SamplePtID values.""" with session_ctx() as session: - sample_infos = session.query(ChemistrySampleInfo.sample_pt_id).all() + sample_infos = session.query(NMA_Chemistry_SampleInfo.sample_pt_id).all() self._sample_pt_ids = {sample_pt_id for (sample_pt_id,) in sample_infos} logger.info( f"Built ChemistrySampleInfo cache with {len(self._sample_pt_ids)} entries" @@ -112,7 +112,7 @@ def _transfer_hook(self, session: Session) -> None: rows = self._dedupe_rows(row_dicts) logger.info(f"Upserting {len(rows)} FieldParameters records") - insert_stmt = insert(FieldParameters) + insert_stmt = insert(NMA_FieldParameters) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/hydraulicsdata.py b/transfers/hydraulicsdata.py index 75e8d6ba..a1e1b7f4 100644 --- a/transfers/hydraulicsdata.py +++ b/transfers/hydraulicsdata.py @@ -16,14 +16,14 @@ from __future__ import annotations -from typing import Any, Optional import uuid +from typing import Any, Optional import pandas as pd from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import NMAHydraulicsData, Thing +from db import NMA_HydraulicsData, Thing from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -90,7 +90,7 @@ def _transfer_hook(self, session: Session) -> None: rows = self._dedupe_rows(row_dicts, key="GlobalID") - insert_stmt = insert(NMAHydraulicsData) + insert_stmt = insert(NMA_HydraulicsData) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/major_chemistry.py b/transfers/major_chemistry.py index 320132db..d222fb0c 100644 --- a/transfers/major_chemistry.py +++ b/transfers/major_chemistry.py @@ -24,7 +24,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import ChemistrySampleInfo, NMAMajorChemistry +from db import NMA_Chemistry_SampleInfo, NMA_MajorChemistry from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -46,7 +46,7 @@ def __init__(self, *args, batch_size: int = 1000, **kwargs): def _build_sample_pt_id_cache(self) -> None: with session_ctx() as session: - sample_infos = session.query(ChemistrySampleInfo.sample_pt_id).all() + sample_infos = session.query(NMA_Chemistry_SampleInfo.sample_pt_id).all() self._sample_pt_ids = {sample_pt_id for (sample_pt_id,) in sample_infos} logger.info( f"Built ChemistrySampleInfo cache with {len(self._sample_pt_ids)} entries" @@ -98,7 +98,7 @@ def _transfer_hook(self, session: Session) -> None: ) rows = self._dedupe_rows(row_dicts, key="GlobalID") - insert_stmt = insert(NMAMajorChemistry) + insert_stmt = insert(NMA_MajorChemistry) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/metrics.py b/transfers/metrics.py index e2083beb..456e9b48 100644 --- a/transfers/metrics.py +++ b/transfers/metrics.py @@ -36,21 +36,23 @@ Asset, PermissionHistory, ThingGeologicFormationAssociation, - ChemistrySampleInfo, - NMAHydraulicsData, - NMARadionuclides, - NMAMajorChemistry, - SurfaceWaterData, - SurfaceWaterPhotos, - NMAWaterLevelsContinuousPressureDaily, - SoilRockResults, - ViewNGWMNWellConstruction, - ViewNGWMNWaterLevels, - ViewNGWMNLithology, - WeatherData, - WeatherPhotos, - NMAMinorTraceChemistry, - AssociatedData, + NMA_Stratigraphy, + NMA_FieldParameters, + NMA_Chemistry_SampleInfo, + NMA_HydraulicsData, + NMA_Radionuclides, + NMA_MajorChemistry, + NMA_SurfaceWaterData, + NMA_SurfaceWaterPhotos, + NMA_WaterLevelsContinuous_Pressure_Daily, + NMA_Soil_Rock_Results, + NMA_view_NGWMN_WellConstruction, + NMA_view_NGWMN_WaterLevels, + NMA_view_NGWMN_Lithology, + NMA_WeatherData, + NMA_WeatherPhotos, + NMA_MinorTraceChemistry, + NMA_AssociatedData, ) from db.engine import session_ctx from services.gcs_helper import get_storage_bucket @@ -113,54 +115,60 @@ def group_metrics(self, *args, **kw) -> None: self._handle_metrics(Group, *args, **kw) def surface_water_data_metrics(self, *args, **kw) -> None: - self._handle_metrics(SurfaceWaterData, *args, **kw) + self._handle_metrics(NMA_SurfaceWaterData, *args, **kw) def surface_water_photos_metrics(self, *args, **kw) -> None: - self._handle_metrics(SurfaceWaterPhotos, name="SurfaceWaterPhotos", *args, **kw) + self._handle_metrics( + NMA_SurfaceWaterPhotos, name="SurfaceWaterPhotos", *args, **kw + ) def soil_rock_results_metrics(self, *args, **kw) -> None: - self._handle_metrics(SoilRockResults, name="Soil_Rock_Results", *args, **kw) + self._handle_metrics( + NMA_Soil_Rock_Results, name="Soil_Rock_Results", *args, **kw + ) def hydraulics_data_metrics(self, *args, **kw) -> None: - self._handle_metrics(NMAHydraulicsData, name="HydraulicsData", *args, **kw) + self._handle_metrics(NMA_HydraulicsData, name="HydraulicsData", *args, **kw) def chemistry_sampleinfo_metrics(self, *args, **kw) -> None: self._handle_metrics( - ChemistrySampleInfo, name="Chemistry_SampleInfo", *args, **kw + NMA_Chemistry_SampleInfo, name="Chemistry_SampleInfo", *args, **kw ) def radionuclides_metrics(self, *args, **kw) -> None: - self._handle_metrics(NMARadionuclides, name="Radionuclides", *args, **kw) + self._handle_metrics(NMA_Radionuclides, name="Radionuclides", *args, **kw) def major_chemistry_metrics(self, *args, **kw) -> None: - self._handle_metrics(NMAMajorChemistry, name="MajorChemistry", *args, **kw) + self._handle_metrics(NMA_MajorChemistry, name="MajorChemistry", *args, **kw) def ngwmn_well_construction_metrics(self, *args, **kw) -> None: self._handle_metrics( - ViewNGWMNWellConstruction, name="NGWMN WellConstruction", *args, **kw + NMA_view_NGWMN_WellConstruction, name="NGWMN WellConstruction", *args, **kw ) def ngwmn_water_levels_metrics(self, *args, **kw) -> None: self._handle_metrics( - ViewNGWMNWaterLevels, name="NGWMN WaterLevels", *args, **kw + NMA_view_NGWMN_WaterLevels, name="NGWMN WaterLevels", *args, **kw ) def ngwmn_lithology_metrics(self, *args, **kw) -> None: - self._handle_metrics(ViewNGWMNLithology, name="NGWMN Lithology", *args, **kw) + self._handle_metrics( + NMA_view_NGWMN_Lithology, name="NGWMN Lithology", *args, **kw + ) def weather_photos_metrics(self, *args, **kw) -> None: - self._handle_metrics(WeatherPhotos, name="WeatherPhotos", *args, **kw) + self._handle_metrics(NMA_WeatherPhotos, name="WeatherPhotos", *args, **kw) def waterlevels_pressure_daily_metrics(self, *args, **kw) -> None: self._handle_metrics( - NMAWaterLevelsContinuousPressureDaily, + NMA_WaterLevelsContinuous_Pressure_Daily, name="WaterLevelsContinuous_Pressure_Daily", *args, **kw, ) def weather_data_metrics(self, *args, **kw) -> None: - self._handle_metrics(WeatherData, name="WeatherData", *args, **kw) + self._handle_metrics(NMA_WeatherData, name="WeatherData", *args, **kw) def permissions_metrics(self, *args, **kw) -> None: self._handle_metrics(PermissionHistory, *args, **kw) @@ -168,12 +176,18 @@ def permissions_metrics(self, *args, **kw) -> None: def stratigraphy_metrics(self, *args, **kw) -> None: self._handle_metrics(ThingGeologicFormationAssociation, *args, **kw) + def nma_stratigraphy_metrics(self, *args, **kw) -> None: + self._handle_metrics(NMA_Stratigraphy, name="NMA_Stratigraphy", *args, **kw) + + def field_parameters_metrics(self, *args, **kw) -> None: + self._handle_metrics(NMA_FieldParameters, name="FieldParameters", *args, **kw) + def associated_data_metrics(self, *args, **kw) -> None: - self._handle_metrics(AssociatedData, name="AssociatedData", *args, **kw) + self._handle_metrics(NMA_AssociatedData, name="AssociatedData", *args, **kw) def minor_trace_chemistry_metrics(self, *args, **kw) -> None: self._handle_metrics( - NMAMinorTraceChemistry, name="MinorTraceChemistry", *args, **kw + NMA_MinorTraceChemistry, name="MinorTraceChemistry", *args, **kw ) def contact_metrics(self, input_df, cleaned_df, errors) -> None: diff --git a/transfers/minor_trace_chemistry_transfer.py b/transfers/minor_trace_chemistry_transfer.py index b23d3bf5..ee9c314e 100644 --- a/transfers/minor_trace_chemistry_transfer.py +++ b/transfers/minor_trace_chemistry_transfer.py @@ -14,7 +14,7 @@ # limitations under the License. # =============================================================================== """ -Transfer MinorandTraceChemistry data from NM_Aquifer to NMAMinorTraceChemistry. +Transfer MinorandTraceChemistry data from NM_Aquifer to NMA_MinorTraceChemistry. This transfer requires ChemistrySampleInfo to be backfilled first (which links to Thing via thing_id). Each MinorTraceChemistry record links to a ChemistrySampleInfo @@ -31,7 +31,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import ChemistrySampleInfo, NMAMinorTraceChemistry +from db import NMA_Chemistry_SampleInfo, NMA_MinorTraceChemistry from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -40,10 +40,10 @@ class MinorTraceChemistryTransferer(Transferer): """ - Transfer MinorandTraceChemistry records to NMAMinorTraceChemistry. + Transfer MinorandTraceChemistry records to NMA_MinorTraceChemistry. Looks up ChemistrySampleInfo by SamplePtID and creates linked - NMAMinorTraceChemistry records. Uses upsert for idempotent transfers. + NMA_MinorTraceChemistry records. Uses upsert for idempotent transfers. """ source_table = "MinorandTraceChemistry" @@ -58,7 +58,7 @@ def __init__(self, *args, batch_size: int = 1000, **kwargs): def _build_sample_pt_id_cache(self): """Build cache of ChemistrySampleInfo.SamplePtID values.""" with session_ctx() as session: - sample_infos = session.query(ChemistrySampleInfo.sample_pt_id).all() + sample_infos = session.query(NMA_Chemistry_SampleInfo.sample_pt_id).all() self._sample_pt_ids = {sample_pt_id for (sample_pt_id,) in sample_infos} logger.info( f"Built ChemistrySampleInfo cache with {len(self._sample_pt_ids)} entries" @@ -120,7 +120,7 @@ def _transfer_hook(self, session: Session) -> None: rows = self._dedupe_rows(row_dicts) logger.info(f"Upserting {len(rows)} MinorTraceChemistry records") - insert_stmt = insert(NMAMinorTraceChemistry) + insert_stmt = insert(NMA_MinorTraceChemistry) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/ngwmn_views.py b/transfers/ngwmn_views.py index 8bdb819a..7470f602 100644 --- a/transfers/ngwmn_views.py +++ b/transfers/ngwmn_views.py @@ -23,9 +23,9 @@ from sqlalchemy.orm import Session from db import ( - ViewNGWMNLithology, - ViewNGWMNWaterLevels, - ViewNGWMNWellConstruction, + NMA_view_NGWMN_Lithology, + NMA_view_NGWMN_WaterLevels, + NMA_view_NGWMN_WellConstruction, ) from transfers.logger import logger from transfers.transferer import Transferer @@ -125,7 +125,7 @@ def _dedupe_rows(self, rows: list[dict[str, Any]]) -> list[dict[str, Any]]: class NGWMNWellConstructionTransferer(_BaseNGWMNTransferer): source_table = "view_NGWMN_WellConstruction" - model = ViewNGWMNWellConstruction + model = NMA_view_NGWMN_WellConstruction def _row_dict(self, row: dict[str, Any]) -> dict[str, Any]: val = self._val @@ -159,7 +159,7 @@ def _upsert_set_clause(self) -> dict[str, Any]: class NGWMNWaterLevelsTransferer(_BaseNGWMNTransferer): source_table = "view_NGWMN_WaterLevels" - model = ViewNGWMNWaterLevels + model = NMA_view_NGWMN_WaterLevels parse_dates = ["DateMeasured"] def _row_dict(self, row: dict[str, Any]) -> dict[str, Any]: @@ -194,7 +194,7 @@ def _upsert_set_clause(self) -> dict[str, Any]: class NGWMNLithologyTransferer(_BaseNGWMNTransferer): source_table = "view_NGWMN_Lithology" - model = ViewNGWMNLithology + model = NMA_view_NGWMN_Lithology def _row_dict(self, row: dict[str, Any]) -> dict[str, Any]: val = self._val diff --git a/transfers/radionuclides.py b/transfers/radionuclides.py index 73fc4333..70575e03 100644 --- a/transfers/radionuclides.py +++ b/transfers/radionuclides.py @@ -24,7 +24,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import ChemistrySampleInfo, NMARadionuclides +from db import NMA_Chemistry_SampleInfo, NMA_Radionuclides from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -48,7 +48,7 @@ def __init__(self, *args, batch_size: int = 1000, **kwargs): def _build_sample_info_cache(self) -> None: with session_ctx() as session: sample_infos = session.query( - ChemistrySampleInfo.sample_pt_id, ChemistrySampleInfo.thing_id + NMA_Chemistry_SampleInfo.sample_pt_id, NMA_Chemistry_SampleInfo.thing_id ).all() self._sample_pt_ids = {sample_pt_id for sample_pt_id, _ in sample_infos} self._thing_id_by_sample_pt_id = { @@ -117,7 +117,7 @@ def _transfer_hook(self, session: Session) -> None: ) rows = self._dedupe_rows(row_dicts, key="GlobalID") - insert_stmt = insert(NMARadionuclides) + insert_stmt = insert(NMA_Radionuclides) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/soil_rock_results.py b/transfers/soil_rock_results.py index c2202282..35fa4866 100644 --- a/transfers/soil_rock_results.py +++ b/transfers/soil_rock_results.py @@ -21,7 +21,7 @@ import pandas as pd from sqlalchemy.orm import Session -from db import SoilRockResults, Thing +from db import NMA_Soil_Rock_Results, Thing from db.engine import session_ctx from transfers.logger import logger from transfers.transferer import Transferer @@ -65,7 +65,7 @@ def _transfer_hook(self, session: Session) -> None: i + len(chunk) - 1, len(chunk), ) - session.bulk_insert_mappings(SoilRockResults, chunk) + session.bulk_insert_mappings(NMA_Soil_Rock_Results, chunk) session.commit() def _row_dict(self, row: dict[str, Any]) -> dict[str, Any]: diff --git a/transfers/stratigraphy_legacy.py b/transfers/stratigraphy_legacy.py index 26e65fc6..326f6434 100644 --- a/transfers/stratigraphy_legacy.py +++ b/transfers/stratigraphy_legacy.py @@ -9,7 +9,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import Stratigraphy, Thing +from db import NMA_Stratigraphy, Thing from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import ( @@ -52,7 +52,7 @@ def _transfer_hook(self, session: Session) -> None: # type: ignore[override] logger.warning("All Stratigraphy rows were skipped during processing") return - insert_stmt = insert(Stratigraphy) + insert_stmt = insert(NMA_Stratigraphy) excluded = insert_stmt.excluded for start in range(0, len(rows), self.batch_size): diff --git a/transfers/surface_water_data.py b/transfers/surface_water_data.py index 38e8a182..ed8053c1 100644 --- a/transfers/surface_water_data.py +++ b/transfers/surface_water_data.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import SurfaceWaterData +from db import NMA_SurfaceWaterData from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import read_csv @@ -50,7 +50,7 @@ def _transfer_hook(self, session: Session) -> None: key="OBJECTID", ) - insert_stmt = insert(SurfaceWaterData) + insert_stmt = insert(NMA_SurfaceWaterData) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/surface_water_photos.py b/transfers/surface_water_photos.py index 1aecd0bb..43f11581 100644 --- a/transfers/surface_water_photos.py +++ b/transfers/surface_water_photos.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import SurfaceWaterPhotos +from db import NMA_SurfaceWaterPhotos from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import replace_nans @@ -51,7 +51,7 @@ def _transfer_hook(self, session: Session) -> None: logger.info("No SurfaceWaterPhotos rows to transfer") return - insert_stmt = insert(SurfaceWaterPhotos) + insert_stmt = insert(NMA_SurfaceWaterPhotos) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/transfer.py b/transfers/transfer.py index 86604a55..fec97cf5 100644 --- a/transfers/transfer.py +++ b/transfers/transfer.py @@ -66,6 +66,7 @@ from transfers.asset_transfer import AssetTransferer from transfers.chemistry_sampleinfo import ChemistrySampleInfoTransferer +from transfers.field_parameters_transfer import FieldParametersTransferer from transfers.hydraulicsdata import HydraulicsDataTransferer from transfers.radionuclides import RadionuclidesTransferer from transfers.major_chemistry import MajorChemistryTransferer @@ -81,7 +82,7 @@ from transfers.util import timeit from transfers.waterlevelscontinuous_pressure_daily import ( - NMAWaterLevelsContinuousPressureDailyTransferer, + NMA_WaterLevelsContinuous_Pressure_DailyTransferer, ) from transfers.weather_data import WeatherDataTransferer from transfers.weather_photos import WeatherPhotosTransferer @@ -104,6 +105,7 @@ class TransferOptions: transfer_surface_water_data: bool transfer_hydraulics_data: bool transfer_chemistry_sampleinfo: bool + transfer_field_parameters: bool transfer_major_chemistry: bool transfer_radionuclides: bool transfer_ngwmn_views: bool @@ -137,6 +139,7 @@ def load_transfer_options() -> TransferOptions: transfer_chemistry_sampleinfo=get_bool_env( "TRANSFER_CHEMISTRY_SAMPLEINFO", True ), + transfer_field_parameters=get_bool_env("TRANSFER_FIELD_PARAMETERS", True), transfer_major_chemistry=get_bool_env("TRANSFER_MAJOR_CHEMISTRY", True), transfer_radionuclides=get_bool_env("TRANSFER_RADIONUCLIDES", True), transfer_ngwmn_views=get_bool_env("TRANSFER_NGWMN_VIEWS", True), @@ -395,7 +398,7 @@ def _transfer_parallel( parallel_tasks_1.append( ( "WaterLevelsPressureDaily", - NMAWaterLevelsContinuousPressureDailyTransferer, + NMA_WaterLevelsContinuous_Pressure_DailyTransferer, flags, ) ) @@ -420,7 +423,7 @@ def _transfer_parallel( if opts.transfer_nma_stratigraphy: future = executor.submit( _execute_transfer_with_timing, - "Stratigraphy", + "StratigraphyLegacy", StratigraphyLegacyTransferer, flags, ) @@ -510,6 +513,11 @@ def _transfer_parallel( results = _execute_transfer(MinorTraceChemistryTransferer, flags=flags) metrics.minor_trace_chemistry_metrics(*results) + if opts.transfer_field_parameters: + message("TRANSFERRING FIELD PARAMETERS") + results = _execute_transfer(FieldParametersTransferer, flags=flags) + metrics.field_parameters_metrics(*results) + # ========================================================================= # PHASE 3: Sensors (Sequential - required before continuous water levels) # ========================================================================= @@ -662,6 +670,11 @@ def _transfer_sequential( results = _execute_transfer(ChemistrySampleInfoTransferer, flags=flags) metrics.chemistry_sampleinfo_metrics(*results) + if opts.transfer_field_parameters: + message("TRANSFERRING FIELD PARAMETERS") + results = _execute_transfer(FieldParametersTransferer, flags=flags) + metrics.field_parameters_metrics(*results) + if opts.transfer_major_chemistry: message("TRANSFERRING MAJOR CHEMISTRY") results = _execute_transfer(MajorChemistryTransferer, flags=flags) @@ -686,7 +699,7 @@ def _transfer_sequential( if opts.transfer_pressure_daily: message("TRANSFERRING WATER LEVELS PRESSURE DAILY") results = _execute_transfer( - NMAWaterLevelsContinuousPressureDailyTransferer, flags=flags + NMA_WaterLevelsContinuous_Pressure_DailyTransferer, flags=flags ) metrics.waterlevels_pressure_daily_metrics(*results) diff --git a/transfers/waterlevelscontinuous_pressure_daily.py b/transfers/waterlevelscontinuous_pressure_daily.py index bb8902d1..c41423f7 100644 --- a/transfers/waterlevelscontinuous_pressure_daily.py +++ b/transfers/waterlevelscontinuous_pressure_daily.py @@ -22,13 +22,13 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import NMAWaterLevelsContinuousPressureDaily +from db import NMA_WaterLevelsContinuous_Pressure_Daily from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import read_csv -class NMAWaterLevelsContinuousPressureDailyTransferer(Transferer): +class NMA_WaterLevelsContinuous_Pressure_DailyTransferer(Transferer): """ Transfer for the legacy WaterLevelsContinuous_Pressure_Daily table. @@ -57,7 +57,7 @@ def _transfer_hook(self, session: Session) -> None: key="GlobalID", ) - insert_stmt = insert(NMAWaterLevelsContinuousPressureDaily) + insert_stmt = insert(NMA_WaterLevelsContinuous_Pressure_Daily) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): @@ -139,7 +139,9 @@ def _dedupe_rows( def run(batch_size: int = 1000) -> None: """Entrypoint to execute the transfer.""" - transferer = NMAWaterLevelsContinuousPressureDailyTransferer(batch_size=batch_size) + transferer = NMA_WaterLevelsContinuous_Pressure_DailyTransferer( + batch_size=batch_size + ) transferer.transfer() diff --git a/transfers/weather_data.py b/transfers/weather_data.py index f3e27264..4d75d1b4 100644 --- a/transfers/weather_data.py +++ b/transfers/weather_data.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import WeatherData +from db import NMA_WeatherData from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import read_csv @@ -50,7 +50,7 @@ def _transfer_hook(self, session: Session) -> None: key="OBJECTID", ) - insert_stmt = insert(WeatherData) + insert_stmt = insert(NMA_WeatherData) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size): diff --git a/transfers/weather_photos.py b/transfers/weather_photos.py index 82e5bc25..a223c42a 100644 --- a/transfers/weather_photos.py +++ b/transfers/weather_photos.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from db import WeatherPhotos +from db import NMA_WeatherPhotos from transfers.logger import logger from transfers.transferer import Transferer from transfers.util import replace_nans @@ -51,7 +51,7 @@ def _transfer_hook(self, session: Session) -> None: logger.info("No WeatherPhotos rows to transfer") return - insert_stmt = insert(WeatherPhotos) + insert_stmt = insert(NMA_WeatherPhotos) excluded = insert_stmt.excluded for i in range(0, len(rows), self.batch_size):