Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 83 additions & 6 deletions spec/common/providers/https.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ interface CallTest {
// The function to execute with the request.
callableFunction: (data: any, context: https.CallableContext) => any;

callableFunction2: (request: https.CallableRequest<any>) => any;

// The expected shape of the http response returned to the callable SDK.
expectedHttpResponse: RunHandlerResult;
}
Expand Down Expand Up @@ -92,16 +94,27 @@ function runHandler(
// Runs a CallTest test.
async function runTest(test: CallTest): Promise<any> {
const opts = { origin: true, methods: 'POST' };
const callableFunction = https.onCallHandler(opts, (data, context) => {
const callableFunctionV1 = https.onCallHandler(opts, (data, context) => {
expect(data).to.deep.equal(test.expectedData);
return test.callableFunction(data, context);
});

const response = await runHandler(callableFunction, test.httpRequest);
const responseV1 = await runHandler(callableFunctionV1, test.httpRequest);

expect(responseV1.body).to.deep.equal(test.expectedHttpResponse.body);
expect(responseV1.headers).to.deep.equal(test.expectedHttpResponse.headers);
expect(responseV1.status).to.equal(test.expectedHttpResponse.status);

const callableFunctionV2 = https.onCallHandler(opts, (request) => {
expect(request.data).to.deep.equal(test.expectedData);
return test.callableFunction2(request);
});

const responseV2 = await runHandler(callableFunctionV2, test.httpRequest);

expect(response.body).to.deep.equal(test.expectedHttpResponse.body);
expect(response.headers).to.deep.equal(test.expectedHttpResponse.headers);
expect(response.status).to.equal(test.expectedHttpResponse.status);
expect(responseV2.body).to.deep.equal(test.expectedHttpResponse.body);
expect(responseV2.headers).to.deep.equal(test.expectedHttpResponse.headers);
expect(responseV2.status).to.equal(test.expectedHttpResponse.status);
}

describe('onCallHandler', () => {
Expand Down Expand Up @@ -138,6 +151,7 @@ describe('onCallHandler', () => {
httpRequest: mockRequest({ foo: 'bar' }),
expectedData: { foo: 'bar' },
callableFunction: (data, context) => ({ baz: 'qux' }),
callableFunction2: (request) => ({ baz: 'qux' }),
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -151,6 +165,7 @@ describe('onCallHandler', () => {
httpRequest: mockRequest(null),
expectedData: null,
callableFunction: (data, context) => null,
callableFunction2: (request) => null,
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -166,6 +181,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -183,6 +201,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 400,
headers: expectedResponseHeaders,
Expand All @@ -200,6 +221,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -215,6 +239,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 400,
headers: expectedResponseHeaders,
Expand All @@ -234,6 +261,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 400,
headers: expectedResponseHeaders,
Expand All @@ -251,6 +281,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
throw new Error(`ceci n'est pas une error`);
},
callableFunction2: (request) => {
throw new Error(`cece n'est pas une error`);
},
expectedHttpResponse: {
status: 500,
headers: expectedResponseHeaders,
Expand All @@ -266,6 +299,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
throw new https.HttpsError('THIS_IS_NOT_VALID' as any, 'nope');
},
callableFunction2: (request) => {
throw new https.HttpsError('THIS_IS_NOT_VALID' as any, 'nope');
},
expectedHttpResponse: {
status: 500,
headers: expectedResponseHeaders,
Expand All @@ -281,6 +317,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
throw new https.HttpsError('not-found', 'i am error');
},
callableFunction2: (request) => {
throw new https.HttpsError('not-found', 'i am error');
},
expectedHttpResponse: {
status: 404,
headers: expectedResponseHeaders,
Expand Down Expand Up @@ -308,6 +347,16 @@ describe('onCallHandler', () => {
expect(context.instanceIdToken).to.be.undefined;
return null;
},
callableFunction2: (request) => {
expect(request.auth).to.not.be.undefined;
expect(request.auth).to.not.be.null;
expect(request.auth.uid).to.equal(mocks.user_id);
expect(request.auth.token.uid).to.equal(mocks.user_id);
expect(request.auth.token.sub).to.equal(mocks.user_id);
expect(request.auth.token.aud).to.equal(projectId);
expect(request.instanceIdToken).to.be.undefined;
return null;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -326,6 +375,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 401,
headers: expectedResponseHeaders,
Expand Down Expand Up @@ -360,6 +412,19 @@ describe('onCallHandler', () => {
expect(context.instanceIdToken).to.be.undefined;
return null;
},
callableFunction2: (request) => {
expect(request.app).to.not.be.undefined;
expect(request.app).to.not.be.null;
expect(request.app.appId).to.equal(appId);
expect(request.app.token.app_id).to.be.equal(appId);
expect(request.app.token.sub).to.be.equal(appId);
expect(request.app.token.aud).to.be.deep.equal([
`projects/${projectId}`,
]);
expect(request.auth).to.be.undefined;
expect(request.instanceIdToken).to.be.undefined;
return null;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -378,6 +443,9 @@ describe('onCallHandler', () => {
callableFunction: (data, context) => {
return;
},
callableFunction2: (request) => {
return;
},
expectedHttpResponse: {
status: 401,
headers: expectedResponseHeaders,
Expand All @@ -402,6 +470,11 @@ describe('onCallHandler', () => {
expect(context.instanceIdToken).to.equal('iid-token');
return null;
},
callableFunction2: (request) => {
expect(request.auth).to.be.undefined;
expect(request.instanceIdToken).to.equal('iid-token');
return null;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand All @@ -420,6 +493,11 @@ describe('onCallHandler', () => {
expect(context.rawRequest).to.equal(mockReq);
return null;
},
callableFunction2: (request) => {
expect(request.rawRequest).to.not.be.undefined;
expect(request.rawRequest).to.equal(mockReq);
return null;
},
expectedHttpResponse: {
status: 200,
headers: expectedResponseHeaders,
Expand Down Expand Up @@ -477,7 +555,6 @@ describe('encoding/decoding', () => {
it('encodes double', () => {
expect(https.encode(1.2)).to.equal(1.2);
});

it('decodes double', () => {
expect(https.decode(1.2)).to.equal(1.2);
});
Expand Down
22 changes: 11 additions & 11 deletions spec/v2/providers/https.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ describe('onCall', () => {
});

it('should return a minimal trigger with appropriate values', () => {
const result = https.onCall((data, context) => 42);
const result = https.onCall((request) => 42);
expect(result.__trigger).to.deep.equal({
apiVersion: 2,
platform: 'gcfv2',
Expand All @@ -208,7 +208,7 @@ describe('onCall', () => {
});

it('should create a complex trigger with appropriate values', () => {
const result = https.onCall(FULL_OPTIONS, (data, context) => 42);
const result = https.onCall(FULL_OPTIONS, (request) => 42);
expect(result.__trigger).to.deep.equal({
...FULL_TRIGGER,
httpsTrigger: {
Expand All @@ -233,7 +233,7 @@ describe('onCall', () => {
region: ['us-west1', 'us-central1'],
minInstances: 3,
},
(data, context) => 42
(request) => 42
);

expect(result.__trigger).to.deep.equal({
Expand All @@ -252,23 +252,23 @@ describe('onCall', () => {
});

it('has a .run method', () => {
const cf = https.onCall((d, c) => {
return { data: d, context: c };
const cf = https.onCall((request) => {
return request;
});

const data = 'data';
const context: any = {
const request: any = {
data: 'data',
instanceIdToken: 'token',
auth: {
uid: 'abc',
token: 'token',
},
};
expect(cf.run(data, context)).to.deep.equal({ data, context });
expect(cf.run(request)).to.deep.equal(request);
});

it('should be an express handler', async () => {
const func = https.onCall((data, context) => 42);
const func = https.onCall((request) => 42);

const req = new MockRequest(
{
Expand All @@ -286,7 +286,7 @@ describe('onCall', () => {
});

it('should enforce CORS options', async () => {
const func = https.onCall({ cors: 'example.com' }, (req, res) => {
const func = https.onCall({ cors: 'example.com' }, (request) => {
throw new Error('Should not reach here for OPTIONS preflight');
});

Expand Down Expand Up @@ -314,7 +314,7 @@ describe('onCall', () => {
});

it('adds CORS headers', async () => {
const func = https.onCall((data, context) => 42);
const func = https.onCall((request) => 42);
const req = new MockRequest(
{
data: {},
Expand Down
Loading