Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 2x 1x 1x 1x 1x 1x 1x 1x 2x 1x 1x 1x 1x 2x 1x | /** * @license * Copyright 2019 Google Inc. * * 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 { FirebaseError } from '@firebase/util'; import { expect } from 'chai'; import { SinonStub, stub } from 'sinon'; import { AppConfig } from '../interfaces/app-config'; import { RegisteredInstallationEntry, RequestStatus } from '../interfaces/installation-entry'; import { compareHeaders } from '../testing/compare-headers'; import { getFakeAppConfig } from '../testing/get-fake-app'; import '../testing/setup'; import { INSTALLATIONS_API_URL, INTERNAL_AUTH_VERSION } from '../util/constants'; import { ErrorResponse } from './common'; import { deleteInstallation } from './delete-installation'; const FID = 'foreclosure-of-a-dream'; describe('deleteInstallation', () => { let appConfig: AppConfig; let fetchSpy: SinonStub<[RequestInfo, RequestInit?], Promise<Response>>; let registeredInstallationEntry: RegisteredInstallationEntry; beforeEach(() => { appConfig = getFakeAppConfig(); registeredInstallationEntry = { fid: FID, registrationStatus: RequestStatus.COMPLETED, refreshToken: 'refreshToken', authToken: { requestStatus: RequestStatus.NOT_STARTED } }; fetchSpy = stub(self, 'fetch'); }); describe('successful request', () => { beforeEach(() => { fetchSpy.resolves(new Response()); }); it('calls the deleteInstallation server API with correct parameters', async () => { const expectedHeaders = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json', Authorization: `${INTERNAL_AUTH_VERSION} refreshToken`, 'x-goog-api-key': 'apiKey' }); const expectedRequest: RequestInit = { method: 'DELETE', headers: expectedHeaders }; const expectedEndpoint = `${INSTALLATIONS_API_URL}/projects/projectId/installations/${FID}`; await deleteInstallation(appConfig, registeredInstallationEntry); expect(fetchSpy).to.be.calledOnceWith(expectedEndpoint, expectedRequest); const actualHeaders = fetchSpy.lastCall.lastArg.headers; compareHeaders(expectedHeaders, actualHeaders); }); }); describe('failed request', () => { it('throws a FirebaseError with the error information from the server', async () => { const errorResponse: ErrorResponse = { error: { code: 409, message: 'Requested entity already exists', status: 'ALREADY_EXISTS' } }; fetchSpy.resolves( new Response(JSON.stringify(errorResponse), { status: 409 }) ); await expect( deleteInstallation(appConfig, registeredInstallationEntry) ).to.be.rejectedWith(FirebaseError); }); it('retries once if the server returns a 5xx error', async () => { const errorResponse: ErrorResponse = { error: { code: 500, message: 'Internal server error', status: 'SERVER_ERROR' } }; fetchSpy .onCall(0) .resolves(new Response(JSON.stringify(errorResponse), { status: 500 })); fetchSpy.onCall(1).resolves(new Response()); await expect(deleteInstallation(appConfig, registeredInstallationEntry)) .to.be.fulfilled; expect(fetchSpy).to.be.calledTwice; }); }); }); |