teamdigitale/italia-app

View on GitHub
ts/features/barcode/components/__tests__/BarcodeScanBaseScreenComponent.test.tsx

Summary

Maintainability
F
3 days
Test Coverage
import { fireEvent } from "@testing-library/react-native";
import React from "react";
import { View } from "react-native";
import configureMockStore from "redux-mock-store";
import I18n from "../../../../i18n";
import { applicationChangeState } from "../../../../store/actions/application";
import { appReducer } from "../../../../store/reducers";
import { GlobalState } from "../../../../store/reducers/types";

jest.mock("../../hooks/useIOBarcodeCameraScanner", () => ({
  useIOBarcodeCameraScanner: jest.fn()
}));

import ROUTES from "../../../../navigation/routes";
import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWrapper";
import {
  IOBarcodeCameraScanner,
  useIOBarcodeCameraScanner
} from "../../hooks/useIOBarcodeCameraScanner";
import { BarcodeScanBaseScreenComponent } from "../BarcodeScanBaseScreenComponent";

const mockCameraComponent = <View testID="cameraComponentTestID" />;

(useIOBarcodeCameraScanner as jest.Mock).mockImplementation(
  (): IOBarcodeCameraScanner => ({
    cameraComponent: mockCameraComponent,
    cameraPermissionStatus: "authorized",
    requestCameraPermission: jest.fn(),
    openCameraSettings: jest.fn(),
    hasTorch: false,
    isTorchOn: false,
    toggleTorch: () => null
  })
);

describe("Test BarcodeScanBaseScreenComponent", () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it("should make a correct first render", () => {
    const { component } = renderComponent();

    expect(component).toBeTruthy();
  });

  it("should display the camera component", () => {
    const { component } = renderComponent();

    expect(component.queryByTestId("cameraComponentTestID")).toBeTruthy();
  });

  it("should display the undefined camera permissions view and let user grant permissions", () => {
    const mockRequestCameraPermission = jest.fn();
    const mockOpenCameraSettings = jest.fn();

    (useIOBarcodeCameraScanner as jest.Mock).mockImplementationOnce(
      (): IOBarcodeCameraScanner => ({
        cameraComponent: <View testID="cameraComponentTestID" />,
        cameraPermissionStatus: "not-determined",
        requestCameraPermission: mockRequestCameraPermission,
        openCameraSettings: mockOpenCameraSettings,
        hasTorch: false,
        isTorchOn: false,
        toggleTorch: () => null
      })
    );

    const { component } = renderComponent();

    expect(component.queryByTestId("cameraComponentTestID")).toBeFalsy();

    expect(
      component.queryByText(I18n.t("barcodeScan.permissions.undefined.title"))
    ).toBeTruthy();

    expect(
      component.queryByText(I18n.t("barcodeScan.permissions.undefined.label"))
    ).toBeTruthy();

    const buttonComponent = component.getByText(
      I18n.t("barcodeScan.permissions.undefined.action")
    );

    expect(buttonComponent).toBeTruthy();

    fireEvent(buttonComponent, "onPress");

    expect(mockRequestCameraPermission).toHaveBeenCalledTimes(1);
    expect(mockOpenCameraSettings).toHaveBeenCalledTimes(0);
  });

  it("should display the denied camera permissions view and let user grant permissions", () => {
    const mockRequestCameraPermission = jest.fn();
    const mockOpenCameraSettings = jest.fn();

    (useIOBarcodeCameraScanner as jest.Mock).mockImplementationOnce(
      (): IOBarcodeCameraScanner => ({
        cameraComponent: <View testID="cameraComponentTestID" />,
        cameraPermissionStatus: "restricted",
        requestCameraPermission: mockRequestCameraPermission,
        openCameraSettings: mockOpenCameraSettings,
        hasTorch: false,
        isTorchOn: false,
        toggleTorch: () => null
      })
    );

    const { component } = renderComponent();

    expect(component.queryByTestId("cameraComponentTestID")).toBeFalsy();

    expect(
      component.queryByText(I18n.t("barcodeScan.permissions.denied.title"))
    ).toBeTruthy();

    expect(
      component.queryByText(I18n.t("barcodeScan.permissions.denied.label"))
    ).toBeTruthy();

    const buttonComponent = component.getByText(
      I18n.t("barcodeScan.permissions.denied.action")
    );

    expect(buttonComponent).toBeTruthy();

    fireEvent(buttonComponent, "onPress");

    expect(mockRequestCameraPermission).toHaveBeenCalledTimes(0);
    expect(mockOpenCameraSettings).toHaveBeenCalledTimes(1);
  });
});

const renderComponent = () => {
  const globalState = appReducer(undefined, applicationChangeState("active"));

  const mockStore = configureMockStore<GlobalState>();
  const store: ReturnType<typeof mockStore> = mockStore({
    ...globalState
  } as GlobalState);

  return {
    component: renderScreenWithNavigationStoreContext<GlobalState>(
      () => (
        <BarcodeScanBaseScreenComponent
          onBarcodeSuccess={() => null}
          onBarcodeError={() => null}
          onFileInputPressed={() => null}
          onManualInputPressed={() => null}
          barcodeAnalyticsFlow="home"
        />
      ),
      ROUTES.MAIN,
      {},
      store
    ),
    store
  };
};