// Copyright 2020 Fastly, Inc.

import { Headers } from "../headers";

describe("Headers", () => {
  test("constructor", () => {
    let headers = new Headers();
    expect(headers).toBeTruthy();
  });

  test("get/set", () => {
    let headers = new Headers();
    headers.set("Name", "Value");

    expect(headers.get("Name")).toBe("Value");
  });

  test("Header Names should be case-insensitive", () => {
    let headers = new Headers();
    headers.set("Name", "Value");
    headers.set("nAMe", "Value2");

    expect(headers.get("Name")).toBe("Value2");
  });

  test("set invalid Header name, 'Invalid Name `', should error", () => {
    expect(() => {
      let headers = new Headers();
      headers.set("Invalid Name `", "Value");
    }).toThrow();
  });

  test("Header name edge cases should be valid (AAA, aaa, ZZZ, zzz)", () => {
    let headers = new Headers();
    headers.set("AAA", "AAA");
    expect(headers.get("AAA")).toBe("AAA");
    headers.set("aaa", "aaa");
    expect(headers.get("aaa")).toBe("aaa");
    headers.set("ZZZ", "ZZZ");
    expect(headers.get("ZZZ")).toBe("ZZZ");
    headers.set("zzz", "zzz");
    expect(headers.get("zzz")).toBe("zzz");
  });

  test("set invalid Header value, 'Φ', should error", () => {
    expect(() => {
      let headers = new Headers();
      headers.set("Name", "Φ");
    }).toThrow();
  });

  test("Empty header values should be valid", () => {
    let headers = new Headers();
    headers.set("Name", "");
    expect(headers.get("Name")).toBe("");
  });

  test("append", () => {
    let headers = new Headers();
    headers.set("Name", "Value");

    headers.append("Name", "Value2");

    expect(headers.get("Name")).toBe("Value, Value2");
  });

  test("has", () => {
    let headers = new Headers();
    headers.set("Name", "Value");

    expect(headers.has("Name")).toBe(true);
  });

  test("delete", () => {
    let headers = new Headers();
    headers.set("Name", "Value");

    headers.delete("Name");

    expect(headers.get("Name")).toBe(null);
  });

  test("keys", () => {
    let headers = new Headers();
    headers.set("Name", "Value");
    headers.set("Name2", "Value2");

    expect(headers.keys().toString()).toBe("name,name2");
  });

  test("values", () => {
    let headers = new Headers();
    headers.set("Name", "Value");
    headers.set("Name2", "Value2");

    expect(headers.values().toString()).toBe("Value,Value2");
  });
});
