Skip to content

Commit 2219b29

Browse files
committed
refactor(integration_tests): simplify templating and add storage tests
1 parent 6503939 commit 2219b29

File tree

7 files changed

+85
-26
lines changed

7 files changed

+85
-26
lines changed

integration_test/cloudbuild.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ steps:
130130
131131
node scripts/run-tests.js \
132132
--sequential \
133-
v2_firestore v2_database \
133+
v2_firestore v2_database v2_storage \
134134
--use-published-sdk=file:$$WHEEL_FILE
135135
136136
# Artifacts to store

integration_test/config/suites.schema.json

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,18 @@
211211
"description": "Trigger type for the function",
212212
"minLength": 1
213213
},
214+
"decorator": {
215+
"type": "string",
216+
"description": "Python decorator name (e.g., on_document_created, on_value_deleted)",
217+
"pattern": "^[a-z_]+$",
218+
"examples": ["on_document_created", "on_value_created", "on_object_archived"]
219+
},
220+
"eventType": {
221+
"type": "string",
222+
"description": "Event type suffix for CloudEvent type field (e.g., created, deleted, metadataUpdated)",
223+
"minLength": 1,
224+
"examples": ["created", "deleted", "updated", "written", "metadataUpdated", "archived", "finalized"]
225+
},
214226
"type": {
215227
"type": "string",
216228
"description": "Type field for identity platform functions",
@@ -254,10 +266,6 @@
254266
"type": "string",
255267
"description": "Type of alert for alert triggers"
256268
},
257-
"eventType": {
258-
"type": "string",
259-
"description": "Event type for EventArc triggers"
260-
},
261269
"database": {
262270
"type": "string",
263271
"description": "Realtime Database instance URL"

integration_test/config/suites.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,26 @@ suites:
2323
functions:
2424
- name: firestoreOnDocumentCreated
2525
trigger: onDocumentCreated
26+
decorator: on_document_created
27+
eventType: created
2628
document: "tests/{testId}"
2729
collection: firestoreOnDocumentCreatedTests
2830
- name: firestoreOnDocumentDeleted
2931
trigger: onDocumentDeleted
32+
decorator: on_document_deleted
33+
eventType: deleted
3034
document: "tests/{testId}"
3135
collection: firestoreOnDocumentDeletedTests
3236
- name: firestoreOnDocumentUpdated
3337
trigger: onDocumentUpdated
38+
decorator: on_document_updated
39+
eventType: updated
3440
document: "tests/{testId}"
3541
collection: firestoreOnDocumentUpdatedTests
3642
- name: firestoreOnDocumentWritten
3743
trigger: onDocumentWritten
44+
decorator: on_document_written
45+
eventType: written
3846
document: "tests/{testId}"
3947
collection: firestoreOnDocumentWrittenTests
4048

@@ -46,18 +54,26 @@ suites:
4654
functions:
4755
- name: databaseOnValueCreated
4856
trigger: onValueCreated
57+
decorator: on_value_created
58+
eventType: created
4959
path: "databaseCreatedTests/{testId}/start"
5060
collection: databaseCreatedTests
5161
- name: databaseOnValueDeleted
5262
trigger: onValueDeleted
63+
decorator: on_value_deleted
64+
eventType: deleted
5365
path: "databaseDeletedTests/{testId}/start"
5466
collection: databaseDeletedTests
5567
- name: databaseOnValueUpdated
5668
trigger: onValueUpdated
69+
decorator: on_value_updated
70+
eventType: updated
5771
path: "databaseUpdatedTests/{testId}/start"
5872
collection: databaseUpdatedTests
5973
- name: databaseOnValueWritten
6074
trigger: onValueWritten
75+
decorator: on_value_written
76+
eventType: written
6177
path: "databaseWrittenTests/{testId}/start"
6278
collection: databaseWrittenTests
6379

@@ -79,16 +95,28 @@ suites:
7995
functions:
8096
- name: storageOnObjectArchived
8197
trigger: onObjectArchived
98+
decorator: on_object_archived
99+
eventType: archived
82100
bucket: "{{projectId}}.appspot.com"
101+
collection: storageOnObjectArchivedTests
83102
- name: storageOnObjectDeleted
84103
trigger: onObjectDeleted
104+
decorator: on_object_deleted
105+
eventType: deleted
85106
bucket: "{{projectId}}.appspot.com"
107+
collection: storageOnObjectDeletedTests
86108
- name: storageOnObjectFinalized
87109
trigger: onObjectFinalized
110+
decorator: on_object_finalized
111+
eventType: finalized
88112
bucket: "{{projectId}}.appspot.com"
113+
collection: storageOnObjectFinalizedTests
89114
- name: storageOnObjectMetadataUpdated
90115
trigger: onObjectMetadataUpdated
116+
decorator: on_object_metadata_updated
117+
eventType: metadataUpdated
91118
bucket: "{{projectId}}.appspot.com"
119+
collection: storageOnObjectMetadataUpdatedTests
92120

93121
# V2 Scheduler triggers
94122
- name: v2_scheduler

integration_test/scripts/generate.js

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,6 @@ Handlebars.registerHelper("unless", function (conditional, options) {
2525
return options.inverse(this);
2626
});
2727

28-
// Python-specific trigger name mapping
29-
// Converts trigger names like "onDocumentCreated" or "onCreate" to "created"
30-
Handlebars.registerHelper("pythonTrigger", function(trigger) {
31-
// Extract the action verb (last camelCase component after "on")
32-
// Examples:
33-
// onDocumentCreated -> Created -> created
34-
// onValueDeleted -> Deleted -> deleted
35-
// onObjectFinalized -> Finalized -> finalized
36-
// beforeUserCreated -> Created -> created
37-
const match = trigger.match(/(?:on|before)[A-Z][a-z]*([A-Z][a-z]+(?:ed|n))$/);
38-
if (match) {
39-
return match[1].toLowerCase();
40-
}
41-
// Fallback: just remove "on" and lowercase
42-
return trigger.replace(/^on/, "").toLowerCase();
43-
});
44-
4528
/**
4629
* Generate Python Firebase Functions from templates
4730
* @param {string[]} suitePatterns - Array of suite names or patterns

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ from typing import Any
1212
REGION = "{{region}}"
1313

1414
{{#each functions}}
15-
@db_fn.on_value_{{pythonTrigger trigger}}(
15+
@db_fn.{{decorator}}(
1616
reference="{{path}}",
1717
region=REGION,
1818
timeout_sec={{timeout}}
@@ -36,7 +36,7 @@ def {{name}}_{{../testRunId}}(event: {{#if (or (eq trigger "onValueUpdated") (eq
3636
context_data = {
3737
"id": event.id,
3838
"time": event.time,
39-
"type": f"google.firebase.database.ref.v1.{{pythonTrigger trigger}}",
39+
"type": f"google.firebase.database.ref.v1.{{eventType}}",
4040
"source": event.source,
4141
"resource": {
4242
"name": event.reference

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ from utils import sanitize_data
1010
REGION = "{{region}}"
1111

1212
{{#each functions}}
13-
@firestore_fn.on_document_{{pythonTrigger trigger}}(
13+
@firestore_fn.{{decorator}}(
1414
document="{{document}}",
1515
region=REGION,
1616
timeout_sec={{timeout}}
@@ -27,7 +27,7 @@ def {{name}}_{{../testRunId}}(event: {{#if (or (eq trigger "onDocumentUpdated")
2727
context_data = {
2828
"id": event.id,
2929
"time": event.time,
30-
"type": f"google.cloud.firestore.document.v1.{{pythonTrigger trigger}}",
30+
"type": f"google.cloud.firestore.document.v1.{{eventType}}",
3131
"source": event.source,
3232
"resource": {
3333
"name": f"projects/{event.project}/databases/{event.database}/documents/{event.document}"
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Storage trigger tests for v2
3+
Test Run ID: {{testRunId}}
4+
"""
5+
6+
from firebase_admin import firestore
7+
from firebase_functions import storage_fn
8+
9+
REGION = "{{region}}"
10+
11+
{{#each functions}}
12+
@storage_fn.{{decorator}}(
13+
bucket="{{../projectId}}.appspot.com",
14+
region=REGION,
15+
timeout_sec={{timeout}}
16+
)
17+
def {{name}}_{{../testRunId}}(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]) -> None:
18+
"""
19+
Test function: {{name}}
20+
Trigger: {{trigger}}
21+
Bucket: {{bucket}}
22+
"""
23+
# Extract test_id from filename (assumes format: testId.txt)
24+
filename = event.data.name
25+
test_id = filename.replace('.txt', '') if filename.endswith('.txt') else filename
26+
27+
# Prepare context data for storage
28+
context_data = {
29+
"id": event.id,
30+
"time": event.time,
31+
"type": f"google.cloud.storage.object.v1.{{eventType}}",
32+
"source": event.source,
33+
}
34+
35+
# Store context in Firestore for verification
36+
db = firestore.client()
37+
collection_name = "{{#if collection}}{{collection}}{{else}}{{name}}{{/if}}"
38+
db.collection(collection_name).document(test_id).set(context_data)
39+
40+
{{/each}}

0 commit comments

Comments
 (0)