Skip to content

Commit

Permalink
Merge branch 'fix/number-inputs' into release/0.10.0
Browse files Browse the repository at this point in the history
* fix/number-inputs:
  fix: Improve validation for Number questions Change NumberWidget input to type text
  • Loading branch information
MiquelAdell committed Feb 4, 2025
2 parents 00f99e0 + c369e39 commit ed5e3b0
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/domain/entities/Questionnaire/QuestionnaireQuestion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ export type UpdateQuestionOptions = {
export class QuestionnaireQuestion {
static isValidNumberValue(s: string, numberType: NumberQuestion["numberType"]): boolean {
if (!s) return true;
if (!isNumber(s)) return false;

switch (numberType) {
case "INTEGER":
Expand Down Expand Up @@ -399,3 +400,7 @@ export class QuestionnaireQuestion {
function isInteger(s: string): boolean {
return Boolean(s.match(/^-?\d*$/));
}

export function isNumber(s: string): boolean {
return Boolean(s.match(/^-?(0|[1-9]\d*)(\.\d+)?$/));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { describe, assert, it } from "vitest";
import { NumberQuestion, QuestionnaireQuestion } from "../QuestionnaireQuestion";

const baseValidNumbers = [""];

const baseInvalidNumbers = [
"01", // Leading zeroes causes errors in dhis2
"1.",
"1.1.1",
"-1.",
"-1.1.1",
"1-1",
"1-1.1",
"1-1-1",
"1e2", // Exponential notation causes errors in dhis2
"1,2", // only . as decimal separator is allowed
"00",
"+10",
"1a1",
"b",
"--1",
];

function runExpectations(
expectedValid: string[],
expectedInvalid: string[],
numberType: NumberQuestion["numberType"]
) {
expectedValid.forEach(number => {
assert(
QuestionnaireQuestion.isValidNumberValue(number, numberType) === true,
`"${number}" should be valid`
);
});
expectedInvalid.forEach(number => {
assert(
QuestionnaireQuestion.isValidNumberValue(number, numberType) === false,
`"${number}" should NOT be valid`
);
});
}

describe("QuestionnaireQuestion", () => {
describe("isValidNumberValue", () => {
it("should validate correctly NumberType=NUMBER", () => {
const validNumbers = [
...baseValidNumbers,
"1.1",
"-1",
"-1.1",
"1243453",
"-0.12543",
"0.1234",
"0",
];
const invalidNumbers = [...baseInvalidNumbers];
runExpectations(validNumbers, invalidNumbers, "NUMBER");
});
it("should validate correctly NumberType=INTEGER", () => {
const validNumbers = [...baseValidNumbers, "2", "1000234432", "-100345"];
const invalidNumbers = [...baseInvalidNumbers, "1.1", "0.2"];
runExpectations(validNumbers, invalidNumbers, "INTEGER");
});
it("should validate correctly NumberType=INTEGER_NEGATIVE", () => {
const validNumbers = [...baseValidNumbers, "-2", "-1000234432", "-100345"];
const invalidNumbers = [...baseInvalidNumbers, "1.1", "0.2", "1", "0"];
runExpectations(validNumbers, invalidNumbers, "INTEGER_NEGATIVE");
});
it("should validate correctly NumberType=INTEGER_POSITIVE", () => {
const validNumbers = [...baseValidNumbers, "2", "1000234432", "100345"];
const invalidNumbers = [...baseInvalidNumbers, "1.1", "-0.2", "-123423", "0"];
runExpectations(validNumbers, invalidNumbers, "INTEGER_POSITIVE");
});
it("should validate correctly NumberType=INTEGER_ZERO_OR_POSITIVE", () => {
const validNumbers = [...baseValidNumbers, "2", "1000234432", "100345", "0"];
const invalidNumbers = [...baseInvalidNumbers, "1.1", "-0.2", "-123423"];
runExpectations(validNumbers, invalidNumbers, "INTEGER_ZERO_OR_POSITIVE");
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ const NumberWidget: React.FC<NumberWidgetProps> = props => {
return (
<>
<Input
type="number"
onBlur={notifyChange}
onChange={updateState}
value={stateValue || ""}
Expand Down

0 comments on commit ed5e3b0

Please sign in to comment.