Skip to content

Commit 7161eb2

Browse files
authored
Merge pull request #224 from FullStackWithLawrence/next
refactor unit tests. add a teardown function
2 parents 83de1d0 + b85368c commit 7161eb2

File tree

5 files changed

+76
-36
lines changed

5 files changed

+76
-36
lines changed

.github/actions/tests/python/action.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,22 @@ inputs:
1111
description: "The version of Python to use, such as 3.11.0"
1212
required: true
1313
type: string
14-
openai-api-organization:
15-
description: "The OpenAI API organization"
16-
required: true
17-
type: string
18-
openai-api-key:
19-
description: "The OpenAI API key"
20-
required: true
21-
type: string
22-
pinecone-api-key:
23-
description: "The Pinecone API key"
24-
required: true
25-
type: string
26-
pinecone-environment:
27-
description: "The Pinecone environment"
28-
required: true
29-
type: string
14+
openai-api-organization:
15+
description: "The OpenAI API organization"
16+
required: true
17+
type: string
18+
openai-api-key:
19+
description: "The OpenAI API key"
20+
required: true
21+
type: string
22+
pinecone-api-key:
23+
description: "The Pinecone API key"
24+
required: true
25+
type: string
26+
pinecone-environment:
27+
description: "The Pinecone environment"
28+
required: true
29+
type: string
3030

3131
runs:
3232
using: "composite"

.github/workflows/runTests.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ jobs:
2424
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
2525
aws-region: ${{ secrets.AWS_REGION }}
2626

27+
- name: Get IAM user info
28+
run: |
29+
aws sts get-caller-identity
30+
2731
- name: Run Python tests
2832
uses: ./.github/actions/tests/python
2933
with:

.github/workflows/testsPython.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
paths:
77
- "**.py"
88
push:
9+
branches:
10+
- main
11+
- next
912
paths:
1013
- "**.py"
1114

@@ -27,6 +30,10 @@ jobs:
2730
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
2831
aws-region: ${{ secrets.AWS_REGION }}
2932

33+
- name: Get IAM user info
34+
run: |
35+
aws sts get-caller-identity
36+
3037
- name: Run Python tests
3138
uses: ./.github/actions/tests/python
3239
with:

api/terraform/python/openai_api/common/conf.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ class Settings(BaseSettings):
216216
_dump: dict = None
217217
_initialized: bool = False
218218

219-
# pylint: disable=too-many-branches
219+
# pylint: disable=too-many-branches,too-many-statements
220220
def __init__(self, **data: Any):
221221
super().__init__(**data)
222222
if not Services.enabled(Services.AWS_CLI):
@@ -225,27 +225,45 @@ def __init__(self, **data: Any):
225225

226226
if bool(os.environ.get("AWS_DEPLOYED", False)):
227227
# If we're running inside AWS Lambda, then we don't need to set the AWS credentials.
228+
logger.info("running inside AWS Lambda")
228229
self._aws_access_key_id_source: str = "overridden by IAM role-based security"
229230
self._aws_secret_access_key_source: str = "overridden by IAM role-based security"
230231
self._aws_session = boto3.Session()
231232
self._initialized = True
232233

233234
if not self.initialized and bool(os.environ.get("GITHUB_ACTIONS", False)):
235+
console_handler = logging.StreamHandler()
236+
console_handler.setLevel(logging.DEBUG)
237+
logger.addHandler(console_handler)
238+
logger.setLevel(logging.DEBUG)
239+
240+
logger.info("running inside GitHub Actions")
241+
aws_access_key_id = os.environ.get("AWS_ACCESS_KEY_ID", None)
242+
aws_secret_access_key = os.environ.get("AWS_SECRET_ACCESS_KEY", None)
243+
if not aws_access_key_id or not aws_secret_access_key:
244+
raise OpenAIAPIConfigurationError(
245+
"required environment variable(s) AWS_ACCESS_KEY_ID and/or AWS_SECRET_ACCESS_KEY not set"
246+
)
247+
self._aws_access_key_id_source = "environ"
248+
self._aws_secret_access_key_source = "environ"
249+
region_name = os.environ.get("AWS_REGION", None)
250+
if not region_name:
251+
raise OpenAIAPIConfigurationError("required environment variable AWS_REGION not set")
234252
try:
235253
self._aws_session = boto3.Session(
236-
region_name=os.environ.get("AWS_REGION", "us-east-1"),
237-
aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID", None),
238-
aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", None),
254+
region_name=region_name,
255+
aws_access_key_id=aws_access_key_id,
256+
aws_secret_access_key=aws_secret_access_key,
239257
)
258+
self._initialized = True
259+
self._aws_access_key_id_source = "environ"
260+
self._aws_secret_access_key_source = "environ"
240261
except ProfileNotFound:
241262
logger.warning("aws_profile %s not found", self.aws_profile)
242263

243-
if self.aws_profile:
264+
if self.aws_profile and self._aws_access_key_id_source == "unset":
244265
self._aws_access_key_id_source = "aws_profile"
245266
self._aws_secret_access_key_source = "aws_profile"
246-
else:
247-
self._aws_access_key_id_source = "environ"
248-
self._aws_secret_access_key_source = "environ"
249267
self._initialized = True
250268

251269
if not self.initialized:
@@ -317,6 +335,10 @@ def __init__(self, **data: Any):
317335
SettingsDefaults.AWS_APIGATEWAY_ROOT_DOMAIN,
318336
env="AWS_APIGATEWAY_ROOT_DOMAIN",
319337
)
338+
init_info: Optional[str] = Field(
339+
None,
340+
env="INIT_INFO",
341+
)
320342
langchain_memory_key: Optional[str] = Field(SettingsDefaults.LANGCHAIN_MEMORY_KEY, env="LANGCHAIN_MEMORY_KEY")
321343
openai_api_organization: Optional[str] = Field(
322344
SettingsDefaults.OPENAI_API_ORGANIZATION, env="OPENAI_API_ORGANIZATION"
@@ -367,6 +389,7 @@ def aws_auth(self) -> dict:
367389
"aws_access_key_id_source": self.aws_access_key_id_source,
368390
"aws_secret_access_key_source": self.aws_secret_access_key_source,
369391
"aws_region": self.aws_region,
392+
"init_info": self.init_info,
370393
}
371394

372395
@property

api/terraform/python/openai_api/common/tests/test_configuration.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ class TestConfiguration(unittest.TestCase):
2727
here = os.path.dirname(os.path.abspath(__file__))
2828

2929
def setUp(self):
30-
"""Set up test fixtures."""
30+
# Save current environment variables
31+
self.saved_env = dict(os.environ)
32+
33+
def tearDown(self):
34+
# Restore environment variables
35+
os.environ.clear()
36+
os.environ.update(self.saved_env)
3137

3238
def env_path(self, filename):
3339
"""Return the path to the .env file."""
@@ -36,7 +42,7 @@ def env_path(self, filename):
3642
def test_conf_defaults(self):
3743
"""Test that settings == SettingsDefaults when no .env is in use."""
3844
os.environ.clear()
39-
mock_settings = Settings()
45+
mock_settings = Settings(init_info="test_conf_defaults()")
4046

4147
self.assertEqual(mock_settings.aws_region, SettingsDefaults.AWS_REGION)
4248
self.assertEqual(mock_settings.openai_endpoint_image_n, SettingsDefaults.OPENAI_ENDPOINT_IMAGE_N)
@@ -59,7 +65,7 @@ def test_conf_defaults(self):
5965
def test_conf_defaults_secrets(self):
6066
"""Test that settings == SettingsDefaults when no .env is in use."""
6167
os.environ.clear()
62-
mock_settings = Settings()
68+
mock_settings = Settings(init_info="test_conf_defaults_secrets()")
6369

6470
# pylint: disable=no-member
6571
self.assertEqual(mock_settings.openai_api_key.get_secret_value(), None)
@@ -74,7 +80,7 @@ def test_env_legal_nulls(self):
7480
loaded = load_dotenv(env_path)
7581
self.assertTrue(loaded)
7682

77-
mock_settings = Settings()
83+
mock_settings = Settings(init_info="test_env_legal_nulls()")
7884

7985
self.assertEqual(mock_settings.aws_region, SettingsDefaults.AWS_REGION)
8086
self.assertEqual(mock_settings.langchain_memory_key, SettingsDefaults.LANGCHAIN_MEMORY_KEY)
@@ -89,7 +95,7 @@ def test_env_illegal_nulls(self):
8995
self.assertTrue(loaded)
9096

9197
with self.assertRaises(PydanticValidationError):
92-
Settings()
98+
Settings(init_info="test_env_illegal_nulls()")
9399

94100
def test_env_overrides(self):
95101
"""Test that settings takes custom .env values."""
@@ -98,7 +104,7 @@ def test_env_overrides(self):
98104
loaded = load_dotenv(env_path)
99105
self.assertTrue(loaded)
100106

101-
mock_settings = Settings()
107+
mock_settings = Settings(init_info="test_env_overrides()")
102108

103109
self.assertEqual(mock_settings.aws_region, "us-west-1")
104110
self.assertEqual(mock_settings.debug_mode, True)
@@ -111,14 +117,13 @@ def test_invalid_aws_region_code(self):
111117
"""Test that Pydantic raises a validation error for environment variable with non-existent aws region code."""
112118

113119
with self.assertRaises(Exception):
114-
Settings()
120+
Settings(init_info="test_invalid_aws_region_code()")
115121

116122
def test_configure_with_class_constructor(self):
117123
"""test that we can set values with the class constructor"""
118124

119125
mock_settings = Settings(
120-
aws_region="eu-west-1",
121-
debug_mode=True,
126+
aws_region="eu-west-1", debug_mode=True, init_info="test_configure_with_class_constructor()"
122127
)
123128

124129
self.assertEqual(mock_settings.aws_region, "eu-west-1")
@@ -164,13 +169,13 @@ def test_readonly_settings(self):
164169
def test_dump(self):
165170
"""Test that dump is a dict."""
166171

167-
mock_settings = Settings()
172+
mock_settings = Settings(init_info="test_dump()")
168173
self.assertIsInstance(mock_settings.dump, dict)
169174

170175
def test_dump_keys(self):
171176
"""Test that dump contains the expected keys."""
172177

173-
mock_settings = Settings()
178+
mock_settings = Settings(init_info="test_dump_keys()")
174179
environment = mock_settings.dump["environment"]
175180
self.assertIn("DEBUG_MODE".lower(), environment)
176181
self.assertIn("os", environment)
@@ -191,7 +196,7 @@ def test_dump_keys(self):
191196
def test_cloudwatch_values(self):
192197
"""Test that dump contains the expected default values."""
193198

194-
mock_settings = Settings()
199+
mock_settings = Settings(init_info="test_cloudwatch_values()")
195200
environment = mock_settings.dump["environment"]
196201
# aws_apigateway = mock_settings.dump["aws_apigateway"]
197202
openai_api = mock_settings.dump["openai_api"]
@@ -217,6 +222,7 @@ def test_initialize_with_values(self):
217222
openai_endpoint_image_size="TEST_image_size",
218223
pinecone_api_key="TEST_pinecone_api_key",
219224
shared_resource_identifier="TEST_shared_resource_identifier",
225+
init_info="test_initialize_with_values()",
220226
)
221227
self.assertEqual(mock_settings.debug_mode, False)
222228
self.assertEqual(mock_settings.dump_defaults, False)

0 commit comments

Comments
 (0)