Skip to content

Commit 6a102ea

Browse files
author
Lauren Long
committed
Merge branch 'master' of github.com:firebase/firebase-functions
2 parents cd2c12f + 3533644 commit 6a102ea

File tree

2 files changed

+93
-15
lines changed

2 files changed

+93
-15
lines changed

spec/providers/database.spec.ts

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,24 +62,86 @@ describe('DatabaseBuilder', () => {
6262
resource: 'projects/_/instances/subdomains/refs/users',
6363
} as any);
6464
});
65+
});
6566

66-
it('should interpolate params until the server does it', () => {
67-
let handler = database.ref('/users/{id}').onWrite(event => {
68-
expect(event.resource).to.equal('projects/_/instances/subdomain/refs/users/aUserId');
67+
describe('#onCreate()', () => {
68+
it('should return "ref.create" as the event type', () => {
69+
let eventType = database.ref('foo').onCreate(() => null).__trigger.eventTrigger.eventType;
70+
expect(eventType).to.eq('providers/google.firebase.database/eventTypes/ref.create');
71+
});
72+
73+
it('should construct a proper resource path', () => {
74+
let resource = database.ref('foo').onCreate(() => null).__trigger.eventTrigger.resource;
75+
expect(resource).to.eq('projects/_/instances/subdomain/refs/foo');
76+
});
77+
78+
it('should return a handler that emits events with a proper DeltaSnapshot', () => {
79+
let handler = database.ref('/users/{id}').onCreate(event => {
80+
expect(event.data.val()).to.deep.equal({ foo: 'bar' });
6981
});
7082

7183
return handler({
7284
data: {
7385
data: null,
74-
delta: 'hello',
86+
delta: { foo: 'bar' },
7587
},
76-
resource: 'projects/_/instances/subdomain/refs/users/{id}',
77-
params: {
78-
id: 'aUserId',
88+
resource: 'projects/_/instances/subdomains/refs/users',
89+
} as any);
90+
});
91+
});
92+
93+
describe('#onUpdate()', () => {
94+
it('should return "ref.update" as the event type', () => {
95+
let eventType = database.ref('foo').onUpdate(() => null).__trigger.eventTrigger.eventType;
96+
expect(eventType).to.eq('providers/google.firebase.database/eventTypes/ref.update');
97+
});
98+
99+
it('should construct a proper resource path', () => {
100+
let resource = database.ref('foo').onUpdate(() => null).__trigger.eventTrigger.resource;
101+
expect(resource).to.eq('projects/_/instances/subdomain/refs/foo');
102+
});
103+
104+
it('should return a handler that emits events with a proper DeltaSnapshot', () => {
105+
let handler = database.ref('/users/{id}').onUpdate(event => {
106+
expect(event.data.val()).to.deep.equal({ foo: 'bar' });
107+
});
108+
109+
return handler({
110+
data: {
111+
data: null,
112+
delta: { foo: 'bar' },
79113
},
114+
resource: 'projects/_/instances/subdomains/refs/users',
115+
} as any);
116+
});
117+
});
118+
119+
describe('#onDelete()', () => {
120+
it('should return "ref.delete" as the event type', () => {
121+
let eventType = database.ref('foo').onDelete(() => null).__trigger.eventTrigger.eventType;
122+
expect(eventType).to.eq('providers/google.firebase.database/eventTypes/ref.delete');
123+
});
124+
125+
it('should construct a proper resource path', () => {
126+
let resource = database.ref('foo').onDelete(() => null).__trigger.eventTrigger.resource;
127+
expect(resource).to.eq('projects/_/instances/subdomain/refs/foo');
128+
});
129+
130+
it('should return a handler that emits events with a proper DeltaSnapshot', () => {
131+
let handler = database.ref('/users/{id}').onDelete(event => {
132+
expect(event.data.val()).to.deep.equal({ foo: 'bar' });
80133
});
134+
135+
return handler({
136+
data: {
137+
data: null,
138+
delta: { foo: 'bar' },
139+
},
140+
resource: 'projects/_/instances/subdomains/refs/users',
141+
} as any);
81142
});
82143
});
144+
83145
});
84146

85147
describe('DeltaSnapshot', () => {

src/providers/database.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ export class RefBuilder {
7979

8080
/** Respond to any write that affects a ref. */
8181
onWrite(handler: (event: Event<DeltaSnapshot>) => PromiseLike<any> | any): CloudFunction<DeltaSnapshot> {
82+
return this.onOperation(handler, 'ref.write');
83+
}
84+
85+
/** Respond to new data on a ref. */
86+
onCreate(handler: (event: Event<DeltaSnapshot>) => PromiseLike<any> | any): CloudFunction<DeltaSnapshot> {
87+
return this.onOperation(handler, 'ref.create');
88+
}
89+
90+
/** Respond to update on a ref. */
91+
onUpdate(handler: (event: Event<DeltaSnapshot>) => PromiseLike<any> | any): CloudFunction<DeltaSnapshot> {
92+
return this.onOperation(handler, 'ref.update');
93+
}
94+
95+
/** Respond to all data being deleted from a ref. */
96+
onDelete(handler: (event: Event<DeltaSnapshot>) => PromiseLike<any> | any): CloudFunction<DeltaSnapshot> {
97+
return this.onOperation(handler, 'ref.delete');
98+
}
99+
100+
private onOperation(
101+
handler: (event: Event<DeltaSnapshot>) => PromiseLike<any> | any,
102+
eventType: string): CloudFunction<DeltaSnapshot> {
103+
82104
const dataConstructor = (raw: Event<any>) => {
83105
if (raw.data instanceof DeltaSnapshot) {
84106
return raw.data;
@@ -93,16 +115,10 @@ export class RefBuilder {
93115
};
94116
return makeCloudFunction({
95117
provider, handler,
96-
eventType: 'ref.write',
118+
eventType: eventType,
97119
resource: this.resource,
98120
dataConstructor,
99-
before: (event) => {
100-
// BUG(36000428) Remove when no longer necessary
101-
_.forEach(event.params, (val, key) => {
102-
event.resource = _.replace(event.resource, `{${key}}`, val);
103-
});
104-
this.apps.retain(event);
105-
},
121+
before: (event) => this.apps.retain(event),
106122
after: (event) => this.apps.release(event),
107123
});
108124
}

0 commit comments

Comments
 (0)