@@ -730,3 +730,101 @@ def test_curator_config_works_without_jwt_secret(self, monkeypatch: pytest.Monke
730730 # Should not raise
731731 config = CuratorConfig .from_env ()
732732 assert not hasattr (config , "jwt_secret_key" ) or config .jwt_secret_key is None # type: ignore[attr-defined]
733+
734+
735+ class TestConfigMissingVars :
736+ """Tests for individual missing-variable branches in ApiConfig and CuratorConfig."""
737+
738+ def test_api_config_missing_postgres_password (self , monkeypatch : pytest .MonkeyPatch ) -> None :
739+ """config.py:390 — POSTGRES_PASSWORD missing fires the append."""
740+ from common .config import ApiConfig
741+
742+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
743+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
744+ monkeypatch .delenv ("POSTGRES_PASSWORD" , raising = False )
745+ monkeypatch .setenv ("POSTGRES_DATABASE" , "db" )
746+ monkeypatch .setenv ("JWT_SECRET_KEY" , "secret" )
747+ with pytest .raises (ValueError , match = "POSTGRES_PASSWORD" ):
748+ ApiConfig .from_env ()
749+
750+ def test_api_config_missing_postgres_database (self , monkeypatch : pytest .MonkeyPatch ) -> None :
751+ """config.py:392 — POSTGRES_DATABASE missing fires the append."""
752+ from common .config import ApiConfig
753+
754+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
755+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
756+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
757+ monkeypatch .delenv ("POSTGRES_DATABASE" , raising = False )
758+ monkeypatch .setenv ("JWT_SECRET_KEY" , "secret" )
759+ with pytest .raises (ValueError , match = "POSTGRES_DATABASE" ):
760+ ApiConfig .from_env ()
761+
762+ def test_curator_config_missing_postgres_address (self , monkeypatch : pytest .MonkeyPatch ) -> None :
763+ """config.py:480 — POSTGRES_ADDRESS missing."""
764+ from common .config import CuratorConfig
765+
766+ monkeypatch .delenv ("POSTGRES_ADDRESS" , raising = False )
767+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
768+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
769+ monkeypatch .setenv ("POSTGRES_DATABASE" , "db" )
770+ monkeypatch .setenv ("NEO4J_ADDRESS" , "bolt://localhost" )
771+ monkeypatch .setenv ("NEO4J_USERNAME" , "neo4j" )
772+ monkeypatch .setenv ("NEO4J_PASSWORD" , "neo4jpass" )
773+ with pytest .raises (ValueError , match = "POSTGRES_ADDRESS" ):
774+ CuratorConfig .from_env ()
775+
776+ def test_curator_config_missing_postgres_username (self , monkeypatch : pytest .MonkeyPatch ) -> None :
777+ """config.py:482 — POSTGRES_USERNAME missing."""
778+ from common .config import CuratorConfig
779+
780+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
781+ monkeypatch .delenv ("POSTGRES_USERNAME" , raising = False )
782+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
783+ monkeypatch .setenv ("POSTGRES_DATABASE" , "db" )
784+ monkeypatch .setenv ("NEO4J_ADDRESS" , "bolt://localhost" )
785+ monkeypatch .setenv ("NEO4J_USERNAME" , "neo4j" )
786+ monkeypatch .setenv ("NEO4J_PASSWORD" , "neo4jpass" )
787+ with pytest .raises (ValueError , match = "POSTGRES_USERNAME" ):
788+ CuratorConfig .from_env ()
789+
790+ def test_curator_config_missing_postgres_database (self , monkeypatch : pytest .MonkeyPatch ) -> None :
791+ """config.py:486 — POSTGRES_DATABASE missing."""
792+ from common .config import CuratorConfig
793+
794+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
795+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
796+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
797+ monkeypatch .delenv ("POSTGRES_DATABASE" , raising = False )
798+ monkeypatch .setenv ("NEO4J_ADDRESS" , "bolt://localhost" )
799+ monkeypatch .setenv ("NEO4J_USERNAME" , "neo4j" )
800+ monkeypatch .setenv ("NEO4J_PASSWORD" , "neo4jpass" )
801+ with pytest .raises (ValueError , match = "POSTGRES_DATABASE" ):
802+ CuratorConfig .from_env ()
803+
804+ def test_curator_config_missing_neo4j_username (self , monkeypatch : pytest .MonkeyPatch ) -> None :
805+ """config.py:490 — NEO4J_USERNAME missing."""
806+ from common .config import CuratorConfig
807+
808+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
809+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
810+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
811+ monkeypatch .setenv ("POSTGRES_DATABASE" , "db" )
812+ monkeypatch .setenv ("NEO4J_ADDRESS" , "bolt://localhost" )
813+ monkeypatch .delenv ("NEO4J_USERNAME" , raising = False )
814+ monkeypatch .setenv ("NEO4J_PASSWORD" , "neo4jpass" )
815+ with pytest .raises (ValueError , match = "NEO4J_USERNAME" ):
816+ CuratorConfig .from_env ()
817+
818+ def test_curator_config_missing_neo4j_password (self , monkeypatch : pytest .MonkeyPatch ) -> None :
819+ """config.py:492 — NEO4J_PASSWORD missing."""
820+ from common .config import CuratorConfig
821+
822+ monkeypatch .setenv ("POSTGRES_ADDRESS" , "localhost" )
823+ monkeypatch .setenv ("POSTGRES_USERNAME" , "user" )
824+ monkeypatch .setenv ("POSTGRES_PASSWORD" , "pass" )
825+ monkeypatch .setenv ("POSTGRES_DATABASE" , "db" )
826+ monkeypatch .setenv ("NEO4J_ADDRESS" , "bolt://localhost" )
827+ monkeypatch .setenv ("NEO4J_USERNAME" , "neo4j" )
828+ monkeypatch .delenv ("NEO4J_PASSWORD" , raising = False )
829+ with pytest .raises (ValueError , match = "NEO4J_PASSWORD" ):
830+ CuratorConfig .from_env ()
0 commit comments