import React from "react";
import { View } from "react-native";
import { render } from "@testing-library/react-native";
import { NullFeedResolver } from "../resolvers/NullFeedResolver";
import { ReloadDataFunction } from "@applicaster/zapp-react-native-utils/reactHooks/feed/useFeedLoader";

type MockChildrenArgs = {
  zappPipesData?: {
    loading: boolean;
    data?: any;
    error?: Error | null;
  };
  reloadData?: ReloadDataFunction;
  loadNextData?: () => void;
};

describe("NullFeedResolver", () => {
  it("should render children with correct default props", () => {
    const mockChildren = jest.fn((_args: MockChildrenArgs) => (
      <View testID="mock-children" />
    ));

    render(<NullFeedResolver>{mockChildren}</NullFeedResolver>);

    expect(mockChildren).toHaveBeenCalledWith(
      expect.objectContaining({
        zappPipesData: {
          url: "",
          loading: false,
          data: null,
          error: null,
        },
        reloadData: expect.any(Function),
        loadNextData: undefined,
      })
    );
  });

  it("should render children component", () => {
    const { getByTestId } = render(
      <NullFeedResolver>{() => <View testID="test-child" />}</NullFeedResolver>
    );

    expect(getByTestId("test-child")).toBeTruthy();
  });

  it("should create a memoized data object that doesn't change on re-renders", () => {
    const mockChildren = jest.fn(() => <View testID="mock-children" />);

    const { rerender } = render(
      <NullFeedResolver>{mockChildren}</NullFeedResolver>
    );

    expect(mockChildren).toHaveBeenCalled();
    // @ts-ignore
    const firstCallDataProps = mockChildren.mock.calls[0][0];

    rerender(<NullFeedResolver>{mockChildren}</NullFeedResolver>);

    // @ts-ignore
    const secondCallDataProps = mockChildren.mock.calls[1][0];

    expect(firstCallDataProps).toBe(secondCallDataProps);
  });

  it("should have reloadData function that returns null", () => {
    const mockChildren = jest.fn(() => <View testID="mock-children" />);

    render(<NullFeedResolver>{mockChildren}</NullFeedResolver>);

    expect(mockChildren).toHaveBeenCalled();

    // @ts-ignore
    const { reloadData } = mockChildren.mock.calls[0][0];

    expect(reloadData()).toBeNull();
  });
});
