Skip to content

Commit 027a90e

Browse files
authored
test_codebuild_cross_account
test_codebuild_cross_account Signed-off-by: Laxma Dendi <[email protected]>
1 parent aaaabd4 commit 027a90e

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
"""Simple tests for cross-account CodeBuild functionality."""
2+
3+
from unittest.mock import Mock, patch
4+
import pytest
5+
6+
from bedrock_agentcore_starter_toolkit.services.codebuild import CodeBuildService
7+
8+
9+
class TestCodeBuildCrossAccount:
10+
"""Test cross-account CodeBuild functionality."""
11+
12+
def test_init_same_account(self):
13+
"""Test initialization for same-account scenario."""
14+
mock_session = Mock()
15+
mock_session.region_name = "us-west-2"
16+
17+
mock_sts = Mock()
18+
mock_sts.get_caller_identity.return_value = {"Account": "123456789012"}
19+
mock_session.client.return_value = mock_sts
20+
21+
service = CodeBuildService(mock_session)
22+
23+
assert service.deployment_account == "123456789012"
24+
assert service.build_account is None
25+
assert service.is_cross_account_codebuild is False
26+
27+
def test_init_cross_account(self):
28+
"""Test initialization for cross-account scenario."""
29+
mock_session = Mock()
30+
mock_session.region_name = "us-west-2"
31+
32+
mock_sts = Mock()
33+
mock_sts.get_caller_identity.return_value = {"Account": "123456789012"}
34+
35+
mock_build_session = Mock()
36+
mock_build_session.region_name = "us-west-2"
37+
38+
def client_factory(service_name):
39+
if service_name == "sts":
40+
return mock_sts
41+
return Mock()
42+
43+
mock_session.client = client_factory
44+
45+
with patch.object(CodeBuildService, '_create_build_session', return_value=mock_build_session):
46+
service = CodeBuildService(mock_session, "arn:aws:iam::987654321098:role/BuildRole")
47+
48+
assert service.deployment_account == "123456789012"
49+
assert service.build_account == "987654321098"
50+
assert service.is_cross_account_codebuild is True
51+
52+
def test_extract_build_account(self):
53+
"""Test build account extraction from role ARN."""
54+
mock_session = Mock()
55+
mock_session.region_name = "us-west-2"
56+
57+
mock_sts = Mock()
58+
mock_sts.get_caller_identity.return_value = {"Account": "123456789012"}
59+
mock_session.client.return_value = mock_sts
60+
61+
# Test valid ARN
62+
with patch.object(CodeBuildService, '_create_build_session'):
63+
service = CodeBuildService(mock_session, "arn:aws:iam::987654321098:role/BuildRole")
64+
assert service._extract_build_account() == "987654321098"
65+
66+
# Test invalid ARN
67+
with patch.object(CodeBuildService, '_create_build_session'):
68+
service = CodeBuildService(mock_session, "invalid-arn")
69+
assert service._extract_build_account() is None
70+
71+
# Test no ARN
72+
service = CodeBuildService(mock_session)
73+
assert service._extract_build_account() is None
74+
75+
def test_upload_source_account_selection(self):
76+
"""Test that upload_source uses correct account."""
77+
mock_session = Mock()
78+
mock_session.region_name = "us-west-2"
79+
80+
mock_sts = Mock()
81+
mock_sts.get_caller_identity.return_value = {"Account": "123456789012"}
82+
83+
mock_s3 = Mock()
84+
mock_s3.head_bucket.return_value = {}
85+
86+
def client_factory(service_name):
87+
if service_name == "sts":
88+
return mock_sts
89+
elif service_name == "s3":
90+
return mock_s3
91+
return Mock()
92+
93+
mock_session.client = client_factory
94+
95+
# Same account scenario
96+
service = CodeBuildService(mock_session)
97+
98+
with patch('os.walk', return_value=[(".", [], ["test.py"])]), \
99+
patch('zipfile.ZipFile'), \
100+
patch('tempfile.NamedTemporaryFile'), \
101+
patch('os.unlink'):
102+
103+
service.upload_source("test-agent")
104+
105+
# Should use deployment account
106+
expected_bucket = "bedrock-agentcore-codebuild-sources-123456789012-us-west-2"
107+
mock_s3.head_bucket.assert_called_with(
108+
Bucket=expected_bucket,
109+
ExpectedBucketOwner="123456789012"
110+
)

0 commit comments

Comments
 (0)