import React from "react";
import { fireEvent, render, waitFor } from "@testing-library/react-native";
import { InputCurrency } from "./InputCurrency";
import type { AtlantisContextProps } from "../AtlantisContext";
import {
AtlantisContext,
atlantisContextDefaultValues,
} from "../AtlantisContext";
const mockCurrencySymbol = "£";
const atlantisContext: AtlantisContextProps = {
...atlantisContextDefaultValues,
currencySymbol: mockCurrencySymbol,
timeFormat: "p",
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
isOnline: true,
onLogError: err => {
return err;
},
floatSeparators: { group: ",", decimal: "." },
};
const placeHolder = "Price";
describe.each([{ includeATLContext: true }, { includeATLContext: false }])(
"Has AtlantisContext: $includeATLContext",
({ includeATLContext }) => {
function setup({
showCurrencySymbol,
name,
}: {
showCurrencySymbol?: boolean;
name: string;
}) {
if (includeATLContext) {
return render(
,
);
} else {
return render(
,
);
}
}
it("renders with currency symbol when the value is input", () => {
const { getByText, getByLabelText } = setup({
name: "sample",
});
const value = 123.459119;
const expectedCurrencySymbol = includeATLContext
? mockCurrencySymbol
: "$";
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
expect(getByText(expectedCurrencySymbol)).toBeDefined();
});
it("renders without currency symbol", () => {
const { queryByText, getByLabelText } = setup({
name: "sample",
showCurrencySymbol: false,
});
const value = 123.459119;
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
expect(queryByText(mockCurrencySymbol)).toBeNull();
});
it("displays a maximum 5 decimal places", async () => {
const value = 123.459119;
const { getByLabelText, getByDisplayValue } = setup({
name: "sample",
});
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue("123.45912")).toBeDefined();
});
});
it("displays a minimum of 2 decimal places", async () => {
const value = 123.11;
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue("123.11")).toBeDefined();
});
});
it("displays a negative value", async () => {
const value = -509.543;
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue(`${value}`)).toBeDefined();
});
});
it("internationalizes the display Value in the input", async () => {
const value = 5098.543;
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue("5,098.543")).toBeDefined();
});
});
it("limits the whole number integer to 10 whole integers by default", async () => {
const value = 12345678998;
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue("1,234,567,899")).toBeDefined();
});
});
it("rounds the decimal point if there are more decimal numbers than the maxDecimalCount", async () => {
const value = 123456.789988;
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent.changeText(getByLabelText(placeHolder), `${value}`);
await waitFor(() => {
expect(getByDisplayValue("123,456.78999")).toBeDefined();
});
});
it("displays 0 on blur if there is no inputted value or the field.value is undefined", async () => {
const { getByLabelText, getByDisplayValue } = setup({ name: "sample" });
fireEvent(getByLabelText("Price"), "blur");
await waitFor(() => {
expect(getByDisplayValue("0")).toBeDefined();
});
});
},
);