Skip to content

Commit e7066e6

Browse files
committed
WIP: Add v2 trigger for onUserCreated and onUserDeleted
1 parent 1bd75b0 commit e7066e6

File tree

2 files changed

+418
-43
lines changed

2 files changed

+418
-43
lines changed

spec/v2/providers/identity.spec.ts

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ const BEFORE_SMS_TRIGGER = {
5757
options: {},
5858
};
5959

60+
const USER_CREATED_EVENT = "google.firebase.auth.user.v2.created";
61+
const USER_DELETED_EVENT = "google.firebase.auth.user.v2.deleted";
62+
6063
const opts: identity.BlockingOptions = {
6164
accessToken: true,
6265
refreshToken: false,
@@ -65,6 +68,14 @@ const opts: identity.BlockingOptions = {
6568
};
6669

6770
describe("identity", () => {
71+
beforeEach(() => {
72+
process.env.GCLOUD_PROJECT = "aProject";
73+
});
74+
75+
afterEach(() => {
76+
delete process.env.GCLOUD_PROJECT;
77+
});
78+
6879
describe("beforeUserCreated", () => {
6980
it("should accept a handler", () => {
7081
const fn = identity.beforeUserCreated(() => Promise.resolve());
@@ -467,4 +478,158 @@ describe("identity", () => {
467478
});
468479
});
469480
});
481+
482+
describe("onUserCreated", () => {
483+
it("should create a minimal trigger/endpoint", () => {
484+
const result = identity.onUserCreated(() => Promise.resolve());
485+
486+
487+
expect(result.__endpoint).to.deep.equal({
488+
...MINIMAL_V2_ENDPOINT,
489+
platform: "gcfv2",
490+
labels: {},
491+
eventTrigger: {
492+
eventType: USER_CREATED_EVENT,
493+
retry: false,
494+
eventFilters: {},
495+
},
496+
});
497+
});
498+
499+
it("should create a complex trigger/endpoint with tenantId", () => {
500+
const result = identity.onUserCreated(
501+
{ ...opts, tenantId: "tid", retry: true },
502+
() => Promise.resolve()
503+
);
504+
505+
expect(result.__endpoint).to.deep.equal({
506+
...MINIMAL_V2_ENDPOINT,
507+
platform: "gcfv2",
508+
minInstances: 1,
509+
region: [REGION],
510+
labels: {},
511+
eventTrigger: {
512+
eventType: USER_CREATED_EVENT,
513+
retry: true,
514+
eventFilters: {
515+
tenantId: "tid",
516+
},
517+
},
518+
});
519+
});
520+
});
521+
522+
describe("onUserDeleted", () => {
523+
it("should create a minimal trigger/endpoint", () => {
524+
const result = identity.onUserDeleted(() => Promise.resolve());
525+
526+
527+
expect(result.__endpoint).to.deep.equal({
528+
...MINIMAL_V2_ENDPOINT,
529+
platform: "gcfv2",
530+
labels: {},
531+
eventTrigger: {
532+
eventType: USER_DELETED_EVENT,
533+
retry: false,
534+
eventFilters: {},
535+
},
536+
});
537+
});
538+
539+
it("should create a complex trigger/endpoint with tenantId", () => {
540+
const result = identity.onUserDeleted(
541+
{ ...opts, tenantId: "tid", retry: true },
542+
() => Promise.resolve()
543+
);
544+
545+
expect(result.__endpoint).to.deep.equal({
546+
...MINIMAL_V2_ENDPOINT,
547+
platform: "gcfv2",
548+
minInstances: 1,
549+
region: [REGION],
550+
labels: {},
551+
eventTrigger: {
552+
eventType: USER_DELETED_EVENT,
553+
retry: true,
554+
eventFilters: {
555+
tenantId: "tid",
556+
},
557+
},
558+
});
559+
});
560+
});
561+
562+
describe("onOperation", () => {
563+
it("should unwrap data.value if present", async () => {
564+
const handler = (event: identity.AuthEvent<identity.User>) => {
565+
return event.data.uid;
566+
};
567+
const func = identity.onUserCreated(handler);
568+
569+
const event = {
570+
specversion: "1.0",
571+
id: "event-id",
572+
source: "firebase-auth",
573+
type: "google.firebase.auth.user.v2.created",
574+
time: "2023-10-31T00:00:00Z",
575+
data: {
576+
value: {
577+
uid: "test-uid",
578+
},
579+
},
580+
};
581+
582+
const result = await func(event as any);
583+
expect(result).to.equal("test-uid");
584+
});
585+
586+
it("should unwrap data.oldValue if present", async () => {
587+
const handler = (event: identity.AuthEvent<identity.User>) => {
588+
return event.data.uid;
589+
};
590+
const func = identity.onUserDeleted(handler);
591+
592+
const event = {
593+
specversion: "1.0",
594+
id: "event-id",
595+
source: "firebase-auth",
596+
type: "google.firebase.auth.user.v2.deleted",
597+
time: "2023-10-31T00:00:00Z",
598+
data: {
599+
oldValue: {
600+
uid: "deleted-uid",
601+
602+
},
603+
},
604+
};
605+
606+
const result = await func(event as any);
607+
expect(result).to.equal("deleted-uid");
608+
});
609+
610+
it("should normalize user data (e.g. createTime -> creationTime)", async () => {
611+
const handler = (event: identity.AuthEvent<identity.User>) => {
612+
return event.data.metadata.creationTime;
613+
};
614+
const func = identity.onUserCreated(handler);
615+
616+
const event = {
617+
specversion: "1.0",
618+
id: "event-id",
619+
source: "firebase-auth",
620+
type: "google.firebase.auth.user.v2.created",
621+
time: "2023-10-31T00:00:00Z",
622+
data: {
623+
uid: "test-uid",
624+
metadata: {
625+
createTime: "2023-10-31T00:00:00Z",
626+
lastSignInTime: "2023-10-31T01:00:00Z",
627+
},
628+
},
629+
};
630+
631+
const result = await func(event as any);
632+
expect(result).to.equal("Tue, 31 Oct 2023 00:00:00 GMT");
633+
});
634+
});
470635
});

0 commit comments

Comments
 (0)