Skip to content

Commit dbd80ef

Browse files
committed
fix(integration_tests): update firebase-admin APIs used and add alerts, fix other test issues
1 parent 6c349e2 commit dbd80ef

17 files changed

+332
-128
lines changed

integration_test/cloudbuild.yaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,16 @@ steps:
130130
131131
node scripts/run-tests.js \
132132
--sequential \
133-
v2_firestore v2_database v2_storage v2_pubsub v2_eventarc v2_tasks v2_remoteconfig v2_scheduler v2_testlab v2_identity \
133+
v2_firestore \
134+
v2_database \
135+
v2_pubsub \
136+
v2_storage \
137+
v2_scheduler \
138+
v2_tasks \
139+
v2_eventarc \
140+
v2_alerts \
141+
v2_testlab \
142+
v2_remoteconfig \
134143
--use-published-sdk=file:$$WHEEL_FILE
135144
136145
# Artifacts to store

integration_test/config/suites.yaml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,20 @@ suites:
146146
collection: tasksOnTaskDispatchedTests
147147

148148
# V2 Identity triggers
149-
- name: v2_identity
150-
description: "V2 Identity trigger tests for Python"
151-
version: v2
152-
service: identity
153-
functions:
154-
- name: identityBeforeUserCreated
155-
trigger: beforeUserCreated
156-
decorator: before_user_created
157-
collection: identityBeforeUserCreatedTests
158-
- name: identityBeforeUserSignedIn
159-
trigger: beforeUserSignedIn
160-
decorator: before_user_signed_in
161-
collection: identityBeforeUserSignedInTests
149+
# DISABLED: Identity blocking functions require manual registration in Firebase Console
150+
# - name: v2_identity
151+
# description: "V2 Identity trigger tests for Python"
152+
# version: v2
153+
# service: identity
154+
# functions:
155+
# - name: identityBeforeUserCreated
156+
# trigger: beforeUserCreated
157+
# decorator: before_user_created
158+
# collection: identityBeforeUserCreatedTests
159+
# - name: identityBeforeUserSignedIn
160+
# trigger: beforeUserSignedIn
161+
# decorator: before_user_signed_in
162+
# collection: identityBeforeUserSignedInTests
162163

163164
# V2 Eventarc triggers
164165
- name: v2_eventarc

integration_test/scripts/run-tests.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,9 +599,11 @@ class TestRunner {
599599
// For v2 functions, try to delete the Cloud Run service directly
600600
if (metadata.projectId === "functions-integration-tests-v2") {
601601
this.log(` Attempting Cloud Run service deletion for v2 function...`, "warn");
602+
// Cloud Run service names are lowercase
603+
const cloudRunServiceName = functionName.toLowerCase();
602604
try {
603605
await this.exec(
604-
`gcloud run services delete ${functionName} --region=${
606+
`gcloud run services delete ${cloudRunServiceName} --region=${
605607
metadata.region || DEFAULT_REGION
606608
} --project=${metadata.projectId} --quiet`,
607609
{ silent: true }
@@ -610,7 +612,7 @@ class TestRunner {
610612
// Verify deletion
611613
try {
612614
await this.exec(
613-
`gcloud run services describe ${functionName} --region=${
615+
`gcloud run services describe ${cloudRunServiceName} --region=${
614616
metadata.region || DEFAULT_REGION
615617
} --project=${metadata.projectId}`,
616618
{ silent: true }
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
"""
2+
Alerts trigger tests for v2
3+
Test Run ID: {{testRunId}}
4+
"""
5+
6+
from firebase_functions import alerts_fn
7+
8+
REGION = "{{region}}"
9+
10+
# TODO: All this does is test that the function is deployable.
11+
# Since you cannot directly trigger alerts in a CI environment, we cannot test
12+
# the internals without mocking.
13+
14+
{{#each functions}}
15+
{{#if (eq trigger "onAlertPublished")}}
16+
@alerts_fn.on_alert_published(
17+
alert_type="{{alertType}}",
18+
region=REGION,
19+
timeout_sec={{timeout}}
20+
)
21+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
22+
"""
23+
Test function: {{name}}
24+
Trigger: {{trigger}}
25+
Alert Type: {{alertType}}
26+
"""
27+
# Since we cannot trigger alerts in CI, this just tests deployability
28+
# In a real implementation, you would:
29+
# test_id = event.data.get("testId")
30+
# db = firestore.client()
31+
# db.collection("{{name}}").document(test_id).set({
32+
# "event": str(event)
33+
# })
34+
pass
35+
36+
{{/if}}
37+
{{#if (eq trigger "onInAppFeedbackPublished")}}
38+
@alerts_fn.on_in_app_feedback_published(
39+
region=REGION,
40+
timeout_sec={{timeout}}
41+
)
42+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
43+
"""
44+
Test function: {{name}}
45+
Trigger: {{trigger}}
46+
"""
47+
pass
48+
49+
{{/if}}
50+
{{#if (eq trigger "onNewTesterIosDevicePublished")}}
51+
@alerts_fn.on_new_tester_ios_device_published(
52+
region=REGION,
53+
timeout_sec={{timeout}}
54+
)
55+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
56+
"""
57+
Test function: {{name}}
58+
Trigger: {{trigger}}
59+
"""
60+
pass
61+
62+
{{/if}}
63+
{{#if (eq trigger "onPlanAutomatedUpdatePublished")}}
64+
@alerts_fn.on_plan_automated_update_published(
65+
region=REGION,
66+
timeout_sec={{timeout}}
67+
)
68+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
69+
"""
70+
Test function: {{name}}
71+
Trigger: {{trigger}}
72+
"""
73+
pass
74+
75+
{{/if}}
76+
{{#if (eq trigger "onPlanUpdatePublished")}}
77+
@alerts_fn.on_plan_update_published(
78+
region=REGION,
79+
timeout_sec={{timeout}}
80+
)
81+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
82+
"""
83+
Test function: {{name}}
84+
Trigger: {{trigger}}
85+
"""
86+
pass
87+
88+
{{/if}}
89+
{{#if (eq trigger "onNewAnrIssuePublished")}}
90+
@alerts_fn.on_new_anr_issue_published(
91+
region=REGION,
92+
timeout_sec={{timeout}}
93+
)
94+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
95+
"""
96+
Test function: {{name}}
97+
Trigger: {{trigger}}
98+
"""
99+
pass
100+
101+
{{/if}}
102+
{{#if (eq trigger "onNewFatalIssuePublished")}}
103+
@alerts_fn.on_new_fatal_issue_published(
104+
region=REGION,
105+
timeout_sec={{timeout}}
106+
)
107+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
108+
"""
109+
Test function: {{name}}
110+
Trigger: {{trigger}}
111+
"""
112+
pass
113+
114+
{{/if}}
115+
{{#if (eq trigger "onNewNonfatalIssuePublished")}}
116+
@alerts_fn.on_new_nonfatal_issue_published(
117+
region=REGION,
118+
timeout_sec={{timeout}}
119+
)
120+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
121+
"""
122+
Test function: {{name}}
123+
Trigger: {{trigger}}
124+
"""
125+
pass
126+
127+
{{/if}}
128+
{{#if (eq trigger "onRegressionAlertPublished")}}
129+
@alerts_fn.on_regression_alert_published(
130+
region=REGION,
131+
timeout_sec={{timeout}}
132+
)
133+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
134+
"""
135+
Test function: {{name}}
136+
Trigger: {{trigger}}
137+
"""
138+
pass
139+
140+
{{/if}}
141+
{{#if (eq trigger "onStabilityDigestPublished")}}
142+
@alerts_fn.on_stability_digest_published(
143+
region=REGION,
144+
timeout_sec={{timeout}}
145+
)
146+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
147+
"""
148+
Test function: {{name}}
149+
Trigger: {{trigger}}
150+
"""
151+
pass
152+
153+
{{/if}}
154+
{{#if (eq trigger "onVelocityAlertPublished")}}
155+
@alerts_fn.on_velocity_alert_published(
156+
region=REGION,
157+
timeout_sec={{timeout}}
158+
)
159+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
160+
"""
161+
Test function: {{name}}
162+
Trigger: {{trigger}}
163+
"""
164+
pass
165+
166+
{{/if}}
167+
{{#if (eq trigger "onThresholdAlertPublished")}}
168+
@alerts_fn.on_threshold_alert_published(
169+
region=REGION,
170+
timeout_sec={{timeout}}
171+
)
172+
def {{name}}{{../testRunId}}(event: alerts_fn.AlertEvent) -> None:
173+
"""
174+
Test function: {{name}}
175+
Trigger: {{trigger}}
176+
"""
177+
pass
178+
179+
{{/if}}
180+
{{/each}}

integration_test/templates/functions/src/v2/identity_tests.py.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ def {{name}}{{../testRunId}}(event: identity_fn.AuthBlockingEvent) -> None:
2626
project_id = os.environ.get('PROJECT_ID') or os.environ.get('GCLOUD_PROJECT') or "functions-integration-tests-v2"
2727

2828
# Prepare context data for storage
29+
# Note: Python SDK doesn't append sign-in method to event_type, so we do it manually
30+
full_event_type = f"{event.event_type}:{event.credential.sign_in_method}" if event.credential else event.event_type
2931
context_data = {
3032
"eventId": event.event_id,
31-
"eventType": event.event_type,
33+
"eventType": full_event_type,
3234
"timestamp": event.timestamp.isoformat() if hasattr(event.timestamp, 'isoformat') else str(event.timestamp),
3335
"resource": {
3436
"name": f"projects/{project_id}"

integration_test/tests/firebaseSetup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export function initializeFirebase(): admin.app.App {
3434
} catch (error) {
3535
console.error("Error initializing Firebase:", error);
3636
console.error("PROJECT_ID:", process.env.PROJECT_ID);
37+
throw error;
3738
}
3839
}
3940
return admin.app();

integration_test/tests/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CloudTasksClient } from "@google-cloud/tasks";
2-
import * as admin from "firebase-admin";
2+
import { getStorage } from "firebase-admin/storage";
33

44
export const timeout = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
55

@@ -162,7 +162,7 @@ async function createTestMatrix(
162162
},
163163
resultStorage: {
164164
googleCloudStorage: {
165-
gcsPath: "gs://" + admin.storage().bucket().name,
165+
gcsPath: "gs://" + getStorage().bucket().name,
166166
},
167167
},
168168
clientInfo: {

0 commit comments

Comments
 (0)