Skip to content
Snippets Groups Projects
Unverified Commit 527ec553 authored by Romeo Van Snick's avatar Romeo Van Snick Committed by GitHub
Browse files

Handle non-number cases in NumberFingerprint (#46579)

* Add unit test for #46574

* Handle non-numeric values in NumberFingerprint

* Be more realistic about NumberFingerprintDisplayInfo type

* Add comment on why the types are unknown
parent 7dd9fd5f
No related branches found
No related tags found
No related merge requests found
......@@ -190,13 +190,16 @@ export type TextFingerprintDisplayInfo = {
percentUrl: number;
};
// We're setting the values here as unknown even though
// the API will return numbers most of the time, because
// sometimes it doesn't!
export type NumberFingerprintDisplayInfo = {
avg: number;
max: number;
min: number;
q1: number;
q3: number;
sd: number;
avg: unknown;
max: unknown;
min: unknown;
q1: unknown;
q3: unknown;
sd: unknown;
};
export type DateTimeFingerprintDisplayInfo = {
......
......@@ -48,10 +48,18 @@ export function NumberFingerprint({
* @param num - a number value from the type/Number fingerprint; might not be a number
* @returns - a tuple, [isFormattedNumber, formattedNumber]
*/
function roundNumber(num: number | null | undefined): [boolean, string] {
if (num == null) {
function roundNumber(num: unknown): [boolean, string] {
if (!isNumber(num)) {
return [false, ""];
}
return [true, Number.isInteger(num) ? num.toString() : num.toFixed(2)];
if (Number.isInteger(num)) {
return [true, num.toString()];
}
return [true, num.toFixed(2)];
}
function isNumber(num: unknown): num is number {
return typeof num === "number" && Number.isFinite(num) && !Number.isNaN(num);
}
import { render, screen } from "__support__/ui";
import type * as Lib from "metabase-lib";
import { NumberFingerprint } from "./NumberFingerprint";
type SetupOpts = {
fingerprintTypeInfo?: {
avg: unknown;
min: unknown;
max: unknown;
};
};
function setup({ fingerprintTypeInfo }: SetupOpts) {
render(
<NumberFingerprint
fingerprintTypeInfo={
fingerprintTypeInfo as Lib.NumberFingerprintDisplayInfo
}
/>,
);
}
describe("NumberFingerprint", () => {
it("should render valid numbers and round to two decimal places", () => {
setup({
fingerprintTypeInfo: {
avg: 123,
min: 456.789,
max: 2e4,
},
});
expect(screen.getByText("Average")).toBeInTheDocument();
expect(screen.getByText("Min")).toBeInTheDocument();
expect(screen.getByText("Max")).toBeInTheDocument();
expect(screen.getByText("123")).toBeInTheDocument();
expect(screen.getByText("456.79")).toBeInTheDocument();
expect(screen.getByText("20000")).toBeInTheDocument();
});
it("should ignore invalid number values in the info", () => {
setup({
fingerprintTypeInfo: {
avg: 123,
min: Infinity,
max: NaN,
},
});
expect(screen.getByText("Average")).toBeInTheDocument();
expect(screen.queryByText("Min")).not.toBeInTheDocument();
expect(screen.queryByText("Max")).not.toBeInTheDocument();
});
it("should ignore invalid non-number values in the info", () => {
setup({
fingerprintTypeInfo: {
avg: 123,
min: "456",
max: null,
},
});
expect(screen.getByText("Average")).toBeInTheDocument();
expect(screen.queryByText("Min")).not.toBeInTheDocument();
expect(screen.queryByText("Max")).not.toBeInTheDocument();
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment