Openstatus
www.openstatus.dev
1import { describe, expect, it } from "bun:test";
2import { calculateDuration, formatDuration } from "./duration";
3
4describe("formatDuration", () => {
5 it("formats short durations (seconds only)", () => {
6 expect(formatDuration(30000)).toBe("30s");
7 });
8
9 it("formats medium durations (minutes and seconds)", () => {
10 expect(formatDuration(135000)).toBe("2m 15s");
11 });
12
13 it("formats long durations (hours, minutes, seconds)", () => {
14 expect(formatDuration(8130000)).toBe("2h 15m 30s");
15 });
16
17 it("formats very long durations (days and hours)", () => {
18 expect(formatDuration(90000000)).toBe("1d 1h");
19 });
20
21 it("handles 0ms", () => {
22 expect(formatDuration(0)).toBe("0s");
23 });
24
25 it("handles negative values", () => {
26 expect(formatDuration(-1000)).toBe("0s");
27 });
28
29 it("handles sub-second durations", () => {
30 expect(formatDuration(500)).toBe("0s");
31 });
32
33 it("respects maxUnits option", () => {
34 expect(formatDuration(90061000, { maxUnits: 2 })).toBe("1d 1h");
35 expect(formatDuration(90061000, { maxUnits: 1 })).toBe("1d");
36 });
37
38 it("only shows non-zero units", () => {
39 expect(formatDuration(3600000)).toBe("1h");
40 expect(formatDuration(60000)).toBe("1m");
41 expect(formatDuration(86400000)).toBe("1d");
42 });
43});
44
45describe("calculateDuration", () => {
46 it("calculates duration between two dates", () => {
47 const start = new Date("2026-01-22T10:00:00Z");
48 const end = new Date("2026-01-22T12:15:30Z");
49 expect(calculateDuration(start, end)).toBe(8130000);
50 });
51
52 it("handles same start and end", () => {
53 const date = new Date("2026-01-22T10:00:00Z");
54 expect(calculateDuration(date, date)).toBe(0);
55 });
56});