Skip to content

Commit

Permalink
Some fixes and added test
Browse files Browse the repository at this point in the history
  • Loading branch information
Szymon Bogusz committed Jan 30, 2025
1 parent 95d9144 commit 92b323a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,7 @@ export const DurationEditor: ExtendedEditor<Props> = (props: Props) => {
(expression: string): Duration => {
const decodeExecResult = durationFormatter.decode(expression);

const duration =
decodeExecResult == null || typeof decodeExecResult !== "string" ? NONE_DURATION : moment.duration(decodeExecResult);
return {
days: duration.asDays() < 1 ? null : duration.asDays().toFixed(),
hours: duration.hours(),
minutes: duration.minutes(),
seconds: duration.seconds(),
};
return duration(decodeExecResult);
},
[durationFormatter],
);
Expand Down Expand Up @@ -97,3 +90,13 @@ DurationEditor.notSwitchableToHint = () =>
"editors.duration.noSwitchableToHint",
"Expression must match pattern T(java.time.Duration).parse('P(n)DT(n)H(n)M') to switch to basic mode",
);

export function duration(decodeExecResult) {
const duration = decodeExecResult == null || typeof decodeExecResult !== "string" ? NONE_DURATION : moment.duration(decodeExecResult);
return {
days: Math.floor(duration.asDays()),
hours: duration.hours(),
minutes: duration.minutes(),
seconds: duration.seconds(),
};
}
27 changes: 25 additions & 2 deletions designer/client/test/Editors/DurationEditor-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import * as React from "react";

import { render, screen } from "@testing-library/react";
import { DualEditorMode, EditorType } from "../../src/components/graph/node-modal/editors/expression/Editor";
import { DurationEditor } from "../../src/components/graph/node-modal/editors/expression/Duration/DurationEditor";
import { DurationEditor, duration } from "../../src/components/graph/node-modal/editors/expression/Duration/DurationEditor";
import { TimeRange } from "../../src/components/graph/node-modal/editors/expression/Duration/TimeRangeComponent";
import { mockFormatter, mockFieldErrors, mockValueChange } from "./helpers";
import { NuThemeProvider } from "../../src/containers/theme/nuThemeProvider";
import { nodeInputWithError } from "../../src/components/graph/node-modal/NodeDetailsContent/NodeTableStyled";
import { FormatterType, typeFormatters } from "../../src/components/graph/node-modal/editors/expression/Formatter";
import type { Duration } from "../../src/components/graph/node-modal/editors/expression/Duration/DurationEditor";

describe(DurationEditor.name, () => {
it("should display validation error when the field is required", () => {
Expand All @@ -32,3 +33,25 @@ describe(DurationEditor.name, () => {
expect(screen.getByText("validation error")).toBeInTheDocument();
});
});

describe(`${duration.name} function`, () => {
it("should parse duration without loosing days if more than 31", () => {
const emptyDuration: Duration = { days: 0, hours: 0, minutes: 0, seconds: 0 };
const formatter = typeFormatters[FormatterType.Duration];
const oneMinute = "PT1M";
const oneHour = "PT1H";
const oneDay = "P1D";
const fortyDays = "P40D";
const mix = "P1DT1H1M";

const times = [oneMinute, oneHour, oneDay, fortyDays, mix];
const results = [
{ ...emptyDuration, minutes: 1 },
{ ...emptyDuration, hours: 1 },
{ ...emptyDuration, days: 1 },
{ ...emptyDuration, days: 40 },
{ days: 1, hours: 1, minutes: 1, seconds: 0 },
];
expect(times.map(formatter.decode).map(duration)).toStrictEqual(results);
});
});

0 comments on commit 92b323a

Please sign in to comment.