| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 { |
| REFRESH_TIMING_BUFFER_MS, |
| getGuestTokenRefreshTiming, |
| MIN_REFRESH_WAIT_MS, |
| DEFAULT_TOKEN_EXP_MS, |
| } from "./guestTokenRefresh"; |
| |
| describe("guest token refresh", () => { |
| beforeAll(() => { |
| jest.useFakeTimers(); |
| jest.setSystemTime(new Date("2022-03-03 01:00")); |
| jest.spyOn(global, "setTimeout"); |
| }); |
| |
| afterAll(() => { |
| jest.useRealTimers(); |
| }); |
| |
| function makeFakeJWT(claims: any) { |
| // not a valid jwt, but close enough for this code |
| const tokenifiedClaims = Buffer.from(JSON.stringify(claims)).toString( |
| "base64" |
| ); |
| return `abc.${tokenifiedClaims}.xyz`; |
| } |
| |
| it("schedules refresh with an epoch exp", () => { |
| // exp is in seconds |
| const ttl = 1300; |
| const exp = Date.now() / 1000 + ttl; |
| const fakeToken = makeFakeJWT({ exp }); |
| |
| const timing = getGuestTokenRefreshTiming(fakeToken); |
| |
| expect(timing).toBeGreaterThan(MIN_REFRESH_WAIT_MS); |
| expect(timing).toBe(ttl * 1000 - REFRESH_TIMING_BUFFER_MS); |
| }); |
| |
| it("schedules refresh with an epoch exp containing a decimal", () => { |
| const ttl = 1300.123; |
| const exp = Date.now() / 1000 + ttl; |
| const fakeToken = makeFakeJWT({ exp }); |
| |
| const timing = getGuestTokenRefreshTiming(fakeToken); |
| |
| expect(timing).toBeGreaterThan(MIN_REFRESH_WAIT_MS); |
| expect(timing).toBe(ttl * 1000 - REFRESH_TIMING_BUFFER_MS); |
| }); |
| |
| it("schedules refresh with iso exp", () => { |
| const exp = new Date("2022-03-03 01:09").toISOString(); |
| const fakeToken = makeFakeJWT({ exp }); |
| |
| const timing = getGuestTokenRefreshTiming(fakeToken); |
| const expectedTiming = 1000 * 60 * 9 - REFRESH_TIMING_BUFFER_MS; |
| |
| expect(timing).toBeGreaterThan(MIN_REFRESH_WAIT_MS); |
| expect(timing).toBe(expectedTiming); |
| }); |
| |
| it("avoids refresh spam", () => { |
| const fakeToken = makeFakeJWT({ exp: Date.now() / 1000 }); |
| |
| const timing = getGuestTokenRefreshTiming(fakeToken); |
| |
| expect(timing).toBe(MIN_REFRESH_WAIT_MS - REFRESH_TIMING_BUFFER_MS); |
| }); |
| |
| it("uses a default when it cannot parse the date", () => { |
| const fakeToken = makeFakeJWT({ exp: "invalid date" }); |
| |
| const timing = getGuestTokenRefreshTiming(fakeToken); |
| |
| expect(timing).toBeGreaterThan(MIN_REFRESH_WAIT_MS); |
| expect(timing).toBe(DEFAULT_TOKEN_EXP_MS - REFRESH_TIMING_BUFFER_MS); |
| }); |
| }); |