2121// SOFTWARE.
2222
2323import { expect } from "chai" ;
24+ import * as sinon from "sinon" ;
2425import { PathPattern } from "../../../src/common/utilities/path-pattern" ;
2526import * as database from "../../../src/v2/providers/database" ;
2627import { expectType } from "../../common/metaprogramming" ;
2728import { MINIMAL_V2_ENDPOINT } from "../../fixtures" ;
2829import { CloudEvent , onInit } from "../../../src/v2/core" ;
2930import * as params from "../../../src/params" ;
31+ import * as logger from "../../../src/logger" ;
32+ import { stackToWire } from "../../../src/runtime/manifest" ;
3033
3134const RAW_RTDB_EVENT : database . RawRTDBCloudEvent = {
3235 data : {
@@ -51,6 +54,13 @@ const TEST_RTDB_INSTANCE_ENV_VAR = "TEST_RTDB_INSTANCE_FOR_GETOPTS";
5154const RESOLVED_RTDB_INSTANCE = "resolved-instance" ;
5255
5356describe ( "database" , ( ) => {
57+ afterEach ( ( ) => {
58+ params . clearParams ( ) ;
59+ sinon . restore ( ) ;
60+ delete process . env . FUNCTIONS_CONTROL_API ;
61+ delete process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] ;
62+ } ) ;
63+
5464 describe ( "makeParams" , ( ) => {
5565 it ( "should make params with basic path" , ( ) => {
5666 const event : database . RawRTDBCloudEvent = {
@@ -151,19 +161,13 @@ describe("database", () => {
151161 } ) ;
152162 } ) ;
153163
154- it ( "should resolve instance Expression to runtime string" , ( ) => {
155- const prev = process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] ;
156- process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] = RESOLVED_RTDB_INSTANCE ;
157- try {
158- const p = params . defineString ( TEST_RTDB_INSTANCE_ENV_VAR ) ;
159- expect ( database . getOpts ( { ref : "/foo" , instance : p } ) ) . to . deep . include ( {
160- path : "foo" ,
161- instance : RESOLVED_RTDB_INSTANCE ,
162- } ) ;
163- } finally {
164- if ( prev === undefined ) delete process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] ;
165- else process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] = prev ;
166- }
164+ it ( "should preserve instance Expression" , ( ) => {
165+ const p = params . defineString ( TEST_RTDB_INSTANCE_ENV_VAR ) ;
166+
167+ expect ( database . getOpts ( { ref : "/foo" , instance : p } ) ) . to . deep . include ( {
168+ path : "foo" ,
169+ instance : p ,
170+ } ) ;
167171 } ) ;
168172 } ) ;
169173
@@ -228,6 +232,37 @@ describe("database", () => {
228232 } ,
229233 } ) ;
230234 } ) ;
235+
236+ it ( "should create an endpoint with an instance Expression as a path pattern" , ( ) => {
237+ const instance = params . defineString ( TEST_RTDB_INSTANCE_ENV_VAR ) ;
238+ const ep = database . makeEndpoint (
239+ database . writtenEventType ,
240+ {
241+ region : "us-central1" ,
242+ labels : { 1 : "2" } ,
243+ } ,
244+ new PathPattern ( "foo/bar" ) ,
245+ instance
246+ ) ;
247+
248+ expect ( ep ) . to . deep . equal ( {
249+ ...MINIMAL_V2_ENDPOINT ,
250+ platform : "gcfv2" ,
251+ labels : {
252+ 1 : "2" ,
253+ } ,
254+ region : [ "us-central1" ] ,
255+ eventTrigger : {
256+ eventType : database . writtenEventType ,
257+ eventFilters : { } ,
258+ eventFilterPathPatterns : {
259+ ref : "foo/bar" ,
260+ instance,
261+ } ,
262+ retry : false ,
263+ } ,
264+ } ) ;
265+ } ) ;
231266 } ) ;
232267
233268 describe ( "onChangedOperation" , ( ) => {
@@ -562,6 +597,66 @@ describe("database", () => {
562597 } ,
563598 } ) ;
564599 } ) ;
600+
601+ it ( "should create a function with instance Expression without deployment warning" , ( ) => {
602+ process . env . FUNCTIONS_CONTROL_API = "true" ;
603+ const warnSpy = sinon . spy ( logger , "warn" ) ;
604+ const instance = params . defineString ( TEST_RTDB_INSTANCE_ENV_VAR ) ;
605+
606+ const func = database . onValueCreated (
607+ {
608+ ref : "/foo/{bar}/" ,
609+ instance,
610+ } ,
611+ ( ) => 2
612+ ) ;
613+
614+ expect ( warnSpy . callCount ) . to . equal ( 0 ) ;
615+ expect ( func . __endpoint . eventTrigger . eventFilters ) . to . deep . equal ( { } ) ;
616+ expect ( func . __endpoint . eventTrigger . eventFilterPathPatterns ) . to . deep . equal ( {
617+ ref : "foo/{bar}" ,
618+ instance,
619+ } ) ;
620+
621+ const wire = stackToWire ( {
622+ specVersion : "v1alpha1" ,
623+ requiredAPIs : [ ] ,
624+ endpoints : {
625+ exprInstance : func . __endpoint ,
626+ } ,
627+ } ) as any ;
628+
629+ expect ( wire . endpoints . exprInstance . eventTrigger . eventFilterPathPatterns . instance ) . to . equal (
630+ `{{ params.${ TEST_RTDB_INSTANCE_ENV_VAR } }}`
631+ ) ;
632+ expect ( warnSpy . callCount ) . to . equal ( 0 ) ;
633+ } ) ;
634+
635+ it ( "should resolve instance Expression at runtime" , async ( ) => {
636+ process . env [ TEST_RTDB_INSTANCE_ENV_VAR ] = RESOLVED_RTDB_INSTANCE ;
637+ const instance = params . defineString ( TEST_RTDB_INSTANCE_ENV_VAR ) ;
638+ const valueSpy = sinon . spy ( instance , "value" ) ;
639+ let capturedEvent : database . DatabaseEvent < any , { bar : string } > ;
640+
641+ const func = database . onValueCreated (
642+ {
643+ ref : "/foo/{bar}/" ,
644+ instance,
645+ } ,
646+ ( event ) => {
647+ capturedEvent = event ;
648+ }
649+ ) ;
650+
651+ await func ( {
652+ ...RAW_RTDB_EVENT ,
653+ instance : RESOLVED_RTDB_INSTANCE ,
654+ ref : "foo/bar-value" ,
655+ } as any ) ;
656+
657+ expect ( valueSpy . callCount ) . to . equal ( 1 ) ;
658+ expect ( capturedEvent . params ) . to . deep . equal ( { bar : "bar-value" } ) ;
659+ } ) ;
565660 } ) ;
566661
567662 describe ( "onValueUpdated" , ( ) => {
0 commit comments