import { localStorage as NativeLocalStorage } from "../__mocks__/android";

const { localStorage } = require("../LocalStorage");

const RN = require("react-native");

RN.NativeModules.LocalStorage = NativeLocalStorage;
RN.Platform.OS = "android";

const test_key = "test_key";
const test_value = "test_value";
const namespaced_key = "namespaced_key";
const namespaced_value = "namespaced_value";
const test_namespace = "test_namespace";
const obj_key = "obj_key";
const obj_value = { prop: "value" };

function setUpStorage() {
  NativeLocalStorage.setItem(test_key, test_value);

  NativeLocalStorage.setItem(namespaced_key, namespaced_value, test_namespace);

  NativeLocalStorage.setItem(obj_key, JSON.stringify(obj_value));
}

describe("localStorage - getAllItems", () => {
  beforeAll(setUpStorage);

  it("retrieves all values", async () => {
    const result = await localStorage.getAllItems();

    expect(result).toEqual(
      expect.objectContaining({
        [test_key]: test_value,
        [obj_key]: obj_value,
      })
    );
  });

  it("works as a bound method", async () => {
    const getAllItems = localStorage.getAllItems;
    const result = await getAllItems();

    expect(result).toEqual(
      expect.objectContaining({
        [test_key]: test_value,
        [obj_key]: obj_value,
      })
    );
  });

  it("retrieves all values in a namespace", async () => {
    const result = await localStorage.getAllItems(test_namespace);

    expect(result).toEqual(
      expect.objectContaining({ [namespaced_key]: namespaced_value })
    );
  });

  it("throws if an error happen on native side", async () => {
    expect(() =>
      localStorage.getAllItems("undefined_namespace")
    ).rejects.toThrowErrorMatchingSnapshot();
  });
});
