mirror of
https://github.com/hanzoai/firebase-js-sdk.git
synced 2026-09-24 16:59:10 +00:00
318 lines
8.8 KiB
TypeScript
318 lines
8.8 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2017 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
import { assert } from 'chai';
|
|
import * as sinon from 'sinon';
|
|
import { makeRequest } from '../../src/implementation/request';
|
|
import { RequestInfo } from '../../src/implementation/requestinfo';
|
|
import { Connection } from '../../src/implementation/connection';
|
|
import { TestingConnection, newTestConnection } from './connection';
|
|
|
|
const TEST_VERSION = '1.2.3';
|
|
|
|
describe('Firebase Storage > Request', () => {
|
|
const versionHeaderName = 'X-Firebase-Storage-Version';
|
|
const versionHeaderValue = 'webjs/' + TEST_VERSION;
|
|
const timeout = 60 * 1000;
|
|
|
|
it('Simple success request works', () => {
|
|
const url = 'http://my-url.com/';
|
|
const method = 'GET';
|
|
|
|
const status = 234;
|
|
const responseHeader = 'ResponseHeader1';
|
|
const responseValue = 'ResponseValue1';
|
|
const response = 'I am the server response!!!!';
|
|
|
|
function newSend(connection: TestingConnection): void {
|
|
const responseHeaders: { [key: string]: string } = {};
|
|
responseHeaders[responseHeader] = responseValue;
|
|
connection.simulateResponse(status, response, responseHeaders);
|
|
}
|
|
const spiedSend = sinon.spy(newSend);
|
|
|
|
function handler(connection: Connection<string>, text: string): string {
|
|
assert.equal(text, response);
|
|
assert.equal(connection.getResponseHeader(responseHeader), responseValue);
|
|
assert.equal(connection.getStatus(), status);
|
|
return text;
|
|
}
|
|
|
|
const requestHeader = 'RequestHeader1';
|
|
const requestValue = 'RequestValue1';
|
|
const requestInfo = new RequestInfo(url, method, handler, timeout);
|
|
requestInfo.headers = {};
|
|
requestInfo.headers[requestHeader] = requestValue;
|
|
requestInfo.successCodes = [200, 234];
|
|
|
|
return makeRequest(
|
|
requestInfo,
|
|
null,
|
|
null,
|
|
null,
|
|
() => newTestConnection(spiedSend),
|
|
TEST_VERSION
|
|
)
|
|
.getPromise()
|
|
.then(
|
|
result => {
|
|
assert.equal(result, response);
|
|
assert.isTrue(spiedSend.calledOnce);
|
|
|
|
const args: unknown[] = spiedSend.getCall(0).args;
|
|
assert.equal(args[1], url);
|
|
assert.equal(args[2], method);
|
|
const expectedHeaders: { [key: string]: string } = {};
|
|
expectedHeaders[requestHeader] = requestValue;
|
|
expectedHeaders[versionHeaderName] = versionHeaderValue;
|
|
assert.deepEqual(args[4], expectedHeaders);
|
|
},
|
|
() => {
|
|
assert.fail('Errored in successful call...');
|
|
}
|
|
);
|
|
});
|
|
|
|
it('URL parameters get encoded correctly', () => {
|
|
function newSend(connection: TestingConnection): void {
|
|
connection.simulateResponse(200, '', {});
|
|
}
|
|
const spiedSend = sinon.spy(newSend);
|
|
|
|
function handler(connection: Connection<string>, text: string): string {
|
|
return text;
|
|
}
|
|
|
|
const url = 'http://my-url.com/';
|
|
const method = 'DELETE';
|
|
const requestInfo = new RequestInfo(url, method, handler, timeout);
|
|
const p1 = 'param1';
|
|
const v1 = 'val1';
|
|
const p2 = 'par?am2';
|
|
const v2 = 'v#al?2';
|
|
requestInfo.urlParams = {};
|
|
requestInfo.urlParams[p1] = v1;
|
|
requestInfo.urlParams[p2] = v2;
|
|
requestInfo.body = 'thisistherequestbody';
|
|
return makeRequest(requestInfo, null, null, null, () =>
|
|
newTestConnection(spiedSend)
|
|
)
|
|
.getPromise()
|
|
.then(
|
|
() => {
|
|
assert.isTrue(spiedSend.calledOnce);
|
|
|
|
const fullUrl =
|
|
url +
|
|
'?' +
|
|
encodeURIComponent(p1) +
|
|
'=' +
|
|
encodeURIComponent(v1) +
|
|
'&' +
|
|
encodeURIComponent(p2) +
|
|
'=' +
|
|
encodeURIComponent(v2);
|
|
const args: unknown[] = spiedSend.getCall(0).args;
|
|
assert.equal(args[1], fullUrl);
|
|
assert.equal(args[2], method);
|
|
assert.equal(args[3], requestInfo.body);
|
|
},
|
|
() => {
|
|
assert.fail('Request failed unexpectedly');
|
|
}
|
|
);
|
|
});
|
|
|
|
it('Propagates errors acceptably', () => {
|
|
function newSend(connection: TestingConnection): void {
|
|
connection.simulateResponse(200, '', {});
|
|
}
|
|
|
|
const errorMessage = 'Catch me if you can';
|
|
function handler(): string {
|
|
throw new Error(errorMessage);
|
|
}
|
|
const requestInfo = new RequestInfo(
|
|
'http://my-url.com/',
|
|
'GET',
|
|
handler,
|
|
timeout
|
|
);
|
|
|
|
return makeRequest(requestInfo, null, null, null, () =>
|
|
newTestConnection(newSend)
|
|
)
|
|
.getPromise()
|
|
.then(
|
|
() => {
|
|
assert.fail('Succeeded when handler gave error');
|
|
},
|
|
error => {
|
|
assert.equal(error.message, errorMessage);
|
|
}
|
|
);
|
|
});
|
|
|
|
it('Cancels properly', () => {
|
|
function handler(): boolean {
|
|
return true;
|
|
}
|
|
const requestInfo = new RequestInfo(
|
|
'http://my-url.com/',
|
|
'GET',
|
|
handler,
|
|
timeout
|
|
);
|
|
const request = makeRequest(
|
|
requestInfo,
|
|
null,
|
|
null,
|
|
null,
|
|
newTestConnection
|
|
);
|
|
const promise = request.getPromise().then(
|
|
() => {
|
|
assert.fail('Succeeded when handler gave error');
|
|
},
|
|
() => true
|
|
);
|
|
request.cancel();
|
|
return promise;
|
|
});
|
|
|
|
it('Sends auth tokens along properly', () => {
|
|
function newSend(connection: TestingConnection): void {
|
|
connection.simulateResponse(200, '', {});
|
|
}
|
|
const spiedSend = sinon.spy(newSend);
|
|
|
|
const authToken = 'totallyLegitAuthToken';
|
|
function handler(): boolean {
|
|
return true;
|
|
}
|
|
const requestInfo = new RequestInfo(
|
|
'http://my-url.com/',
|
|
'GET',
|
|
handler,
|
|
timeout
|
|
);
|
|
const request = makeRequest(
|
|
requestInfo,
|
|
/* appId= */ null,
|
|
authToken,
|
|
null,
|
|
() => newTestConnection(spiedSend),
|
|
TEST_VERSION
|
|
);
|
|
return request.getPromise().then(
|
|
() => {
|
|
assert.isTrue(spiedSend.calledOnce);
|
|
const args: unknown[] = spiedSend.getCall(0).args;
|
|
const expectedHeaders: { [key: string]: string } = {
|
|
Authorization: 'Firebase ' + authToken
|
|
};
|
|
expectedHeaders[versionHeaderName] = versionHeaderValue;
|
|
assert.deepEqual(args[4], expectedHeaders);
|
|
},
|
|
() => {
|
|
assert.fail('Request failed unexpectedly');
|
|
}
|
|
);
|
|
});
|
|
|
|
it('Sends APP ID along properly', () => {
|
|
const appId = 'myFirebaseApp';
|
|
|
|
function newSend(connection: TestingConnection): void {
|
|
connection.simulateResponse(200, '', {});
|
|
}
|
|
const spiedSend = sinon.spy(newSend);
|
|
|
|
function handler(): boolean {
|
|
return true;
|
|
}
|
|
const requestInfo = new RequestInfo(
|
|
'http://my-url.com/',
|
|
'GET',
|
|
handler,
|
|
timeout
|
|
);
|
|
const request = makeRequest(
|
|
requestInfo,
|
|
appId,
|
|
null,
|
|
null,
|
|
() => newTestConnection(spiedSend),
|
|
TEST_VERSION
|
|
);
|
|
return request.getPromise().then(
|
|
() => {
|
|
assert.isTrue(spiedSend.calledOnce);
|
|
const args: unknown[] = spiedSend.getCall(0).args;
|
|
const expectedHeaders: { [key: string]: string } = {
|
|
'X-Firebase-GMPID': appId
|
|
};
|
|
expectedHeaders[versionHeaderName] = versionHeaderValue;
|
|
assert.deepEqual(args[4], expectedHeaders);
|
|
},
|
|
() => {
|
|
assert.fail('Request failed unexpectedly');
|
|
}
|
|
);
|
|
});
|
|
|
|
it('sends appcheck token along properly', () => {
|
|
const appCheckToken = 'totallyshaddytoken';
|
|
|
|
function newSend(connection: TestingConnection): void {
|
|
connection.simulateResponse(200, '', {});
|
|
}
|
|
const spiedSend = sinon.spy(newSend);
|
|
|
|
function handler(): boolean {
|
|
return true;
|
|
}
|
|
const requestInfo = new RequestInfo(
|
|
'http://my-url.com/',
|
|
'GET',
|
|
handler,
|
|
timeout
|
|
);
|
|
const request = makeRequest(
|
|
requestInfo,
|
|
null,
|
|
null,
|
|
appCheckToken,
|
|
() => newTestConnection(spiedSend),
|
|
TEST_VERSION
|
|
);
|
|
return request.getPromise().then(
|
|
() => {
|
|
assert.isTrue(spiedSend.calledOnce);
|
|
const args: unknown[] = spiedSend.getCall(0).args;
|
|
const expectedHeaders: { [key: string]: string } = {
|
|
'X-Firebase-AppCheck': appCheckToken
|
|
};
|
|
expectedHeaders[versionHeaderName] = versionHeaderValue;
|
|
assert.deepEqual(args[4], expectedHeaders);
|
|
},
|
|
() => {
|
|
assert.fail('Request failed unexpectedly');
|
|
}
|
|
);
|
|
});
|
|
});
|