From e464b3ee71ea5de0c2f69f7e08067cf6138685a7 Mon Sep 17 00:00:00 2001 From: David J Pugh <6003255+djpugh@users.noreply.github.com> Date: Sun, 25 Feb 2024 18:18:54 +0000 Subject: [PATCH] Adding tests for issue introduced in pydantic-settings 2.2.0 (#39) --- .../test_configuration/test_base_config.py | 71 ++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_common/test_configuration/test_base_config.py b/tests/unit/test_common/test_configuration/test_base_config.py index 05ea5e0..da48358 100644 --- a/tests/unit/test_common/test_configuration/test_base_config.py +++ b/tests/unit/test_common/test_configuration/test_base_config.py @@ -1,8 +1,8 @@ import unittest -from pydantic import ConfigDict +from pydantic import ConfigDict, ValidationError -from nskit.common.configuration import BaseConfiguration +from nskit.common.configuration import BaseConfiguration, SettingsConfigDict from nskit.common.contextmanagers import ChDir from nskit.common.io import json, toml, yaml @@ -153,3 +153,70 @@ class TestModel(BaseConfiguration): t = TestModel(a=ASettings(), b=2) + def test_dotenv_extra_ignore(self): + + class ASettings(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='AX_', env_file='.env', dotenv_extra='ignore') + c: str = 'a' + d: int = 1 + + @property + def a(self): + return True + class TestModel(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='TM_', env_file='.env', dotenv_extra='ignore') + a: ASettings + b: int + + with ChDir(): + with open('.env', 'w') as f: + f.write('AX_D=3\nTM_B=4\nAX_R=123\nTM_EE=44') + t = TestModel(a=ASettings()) + self.assertEqual(t.b, 4) + self.assertEqual(t.a.d, 3) + self.assertEqual(t.a.c, 'a') + + def test_dotenv_extra_forbid_error(self): + + class ASettings(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='AX_', env_file='.env', dotenv_extra='forbid') + c: str = 'a' + d: int = 1 + + @property + def a(self): + return True + class TestModel(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='TM_', env_file='.env', dotenv_extra='forbid') + a: ASettings + b: int + + with ChDir(): + with open('.env', 'w') as f: + f.write('AX_D=3\nTM_B=4\nAX_R=123\nTM_EE=44') + with self.assertRaises(ValidationError): + TestModel(a=ASettings()) + + def test_dotenv_extra_forbid_ok(self): + + class ASettings(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='AX_', dotenv_extra='forbid') + c: str = 'a' + d: int = 1 + + @property + def a(self): + return True + class TestModel(BaseConfiguration): + model_config = SettingsConfigDict(env_prefix='TM_', env_file='.env', dotenv_extra='forbid') + a: ASettings + b: int + + with ChDir(): + with open('.env', 'w') as f: + f.write('TM_B=4\n') + t = TestModel(a=ASettings()) + self.assertEqual(t.b, 4) + self.assertEqual(t.a.d, 1) + self.assertEqual(t.a.c, 'a') +