Skip to content

Commit 3a66850

Browse files
test: add Postgres MCP tests (#1266)
Add integration tests for Postgres for Cloud SQL's Managed Connection Pooling (MCP).
1 parent de18a50 commit 3a66850

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

.ci/cloudbuild.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ steps:
3737
"POSTGRES_CUSTOMER_CAS_CONNECTION_NAME",
3838
"POSTGRES_CUSTOMER_CAS_PASS",
3939
"POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME",
40+
"POSTGRES_MCP_CONNECTION_NAME",
41+
"POSTGRES_MCP_PASS",
4042
"SQLSERVER_CONNECTION_NAME",
4143
"SQLSERVER_USER",
4244
"SQLSERVER_PASS",
@@ -83,6 +85,10 @@ availableSecrets:
8385
env: "POSTGRES_CUSTOMER_CAS_PASS"
8486
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME/versions/latest"
8587
env: "POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME"
88+
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_MCP_CONNECTION_NAME/versions/latest"
89+
env: "POSTGRES_MCP_CONNECTION_NAME"
90+
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_MCP_PASS/versions/latest"
91+
env: "POSTGRES_MCP_PASS"
8692
- versionName: "projects/$PROJECT_ID/secrets/SQLSERVER_CONNECTION_NAME/versions/latest"
8793
env: "SQLSERVER_CONNECTION_NAME"
8894
- versionName: "projects/$PROJECT_ID/secrets/SQLSERVER_USER/versions/latest"

.github/workflows/tests.yml

+4
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ jobs:
8484
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_CONNECTION_NAME
8585
POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS
8686
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME
87+
POSTGRES_MCP_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_CONNECTION_NAME
88+
POSTGRES_MCP_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_PASS
8789
SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME
8890
SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER
8991
SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS
@@ -108,6 +110,8 @@ jobs:
108110
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME }}"
109111
POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}"
110112
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME }}"
113+
POSTGRES_MCP_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_MCP_CONNECTION_NAME }}"
114+
POSTGRES_MCP_PASS: "${{ steps.secrets.outputs.POSTGRES_MCP_PASS }}"
111115
SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}"
112116
SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}"
113117
SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}"

tests/system/test_asyncpg_connection.py

+26
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ async def create_sqlalchemy_engine(
3535
ip_type: str = "public",
3636
refresh_strategy: str = "background",
3737
resolver: Union[type[DefaultResolver], type[DnsResolver]] = DefaultResolver,
38+
**kwargs: Any,
3839
) -> tuple[sqlalchemy.ext.asyncio.engine.AsyncEngine, Connector]:
3940
"""Creates a connection pool for a Cloud SQL instance and returns the pool
4041
and the connector. Callers are responsible for closing the pool and the
@@ -92,6 +93,7 @@ async def create_sqlalchemy_engine(
9293
password=password,
9394
db=db,
9495
ip_type=ip_type, # can be "public", "private" or "psc"
96+
**kwargs, # additional asyncpg connection args
9597
),
9698
execution_options={"isolation_level": "AUTOCOMMIT"},
9799
)
@@ -220,6 +222,30 @@ async def test_custom_SAN_with_dns_sqlalchemy_connection_with_asyncpg() -> None:
220222
await connector.close_async()
221223

222224

225+
async def test_MCP_sqlalchemy_connection_with_asyncpg() -> None:
226+
"""Basic test to get time from database using MCP enabled instance."""
227+
inst_conn_name = os.environ["POSTGRES_MCP_CONNECTION_NAME"]
228+
user = os.environ["POSTGRES_USER"]
229+
password = os.environ["POSTGRES_MCP_PASS"]
230+
db = os.environ["POSTGRES_DB"]
231+
ip_type = os.environ.get("IP_TYPE", "public")
232+
233+
pool, connector = await create_sqlalchemy_engine(
234+
inst_conn_name,
235+
user,
236+
password,
237+
db,
238+
ip_type,
239+
statement_cache_size=0,
240+
)
241+
242+
async with pool.connect() as conn:
243+
res = (await conn.execute(sqlalchemy.text("SELECT 1"))).fetchone()
244+
assert res[0] == 1
245+
246+
await connector.close_async()
247+
248+
223249
async def test_connection_with_asyncpg() -> None:
224250
"""Basic test to get time from database."""
225251
inst_conn_name = os.environ["POSTGRES_CONNECTION_NAME"]

tests/system/test_pg8000_connection.py

+19
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,22 @@ def test_custom_SAN_with_dns_pg8000_connection() -> None:
191191
curr_time = time[0]
192192
assert type(curr_time) is datetime
193193
connector.close()
194+
195+
196+
def test_MCP_pg8000_connection() -> None:
197+
"""Basic test to get time from database using MCP enabled instance."""
198+
inst_conn_name = os.environ["POSTGRES_MCP_CONNECTION_NAME"]
199+
user = os.environ["POSTGRES_USER"]
200+
password = os.environ["POSTGRES_MCP_PASS"]
201+
db = os.environ["POSTGRES_DB"]
202+
ip_type = os.environ.get("IP_TYPE", "public")
203+
204+
engine, connector = create_sqlalchemy_engine(
205+
inst_conn_name, user, password, db, ip_type
206+
)
207+
with engine.connect() as conn:
208+
time = conn.execute(sqlalchemy.text("SELECT NOW()")).fetchone()
209+
conn.commit()
210+
curr_time = time[0]
211+
assert type(curr_time) is datetime
212+
connector.close()

0 commit comments

Comments
 (0)