import EventEmitter from "events";
import { renderHook, act } from "@testing-library/react-hooks";
import { useAppState } from "../useAppState";

const emitter = new EventEmitter();
const initialState = "active";

jest.doMock("react-native/Libraries/AppState/AppState", () => ({
  currentState: initialState,
  addEventListener: (x, y) => emitter.addListener(x, y),
  removeEventListener: emitter.removeListener,
}));

describe("useAppState", () => {
  afterAll(() => {
    emitter.removeAllListeners();
  });

  describe("returnIsActive param set to undefined", () => {
    it("should return initial app state when called", function () {
      const { result } = renderHook(() => useAppState());

      expect(result.current).toBe(initialState);
    });

    it("should update return value on appState change event", function () {
      const { result } = renderHook(() => useAppState());

      expect(result.current).toBe(initialState);

      act(() => {
        emitter.emit("change", "background");
      });

      expect(result.current).toBe("background");
    });
  });

  describe("returnIsActive param set to true", () => {
    it('should return true for "active" state', function () {
      const { result } = renderHook(() => useAppState(true));

      act(() => {
        emitter.emit("change", "active");
      });

      expect(result.current).toBe(true);
    });

    it('should return true for "background" and "inactive" states', function () {
      const { result } = renderHook(() => useAppState(true));

      act(() => {
        emitter.emit("change", "background");
      });

      expect(result.current).toBe(false);

      act(() => {
        emitter.emit("change", "inactive");
      });

      expect(result.current).toBe(false);
    });
  });
});
