airbnb/caravel

View on GitHub
superset-embedded-sdk/src/guestTokenRefresh.test.ts

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * 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);
  });
});