Packages
noora
0.9.0
0.84.1
0.84.0
0.83.2
0.83.1
0.83.0
0.82.7
0.82.6
0.82.5
0.82.4
0.82.3
0.82.2
0.82.1
0.82.0
0.81.4
0.81.3
0.81.2
0.81.1
0.81.0
0.80.1
0.80.0
0.79.1
0.79.0
0.78.1
0.78.0
0.77.4
0.77.3
0.77.2
0.77.1
0.77.0
0.76.0
0.75.0
0.74.0
0.73.0
0.72.0
0.71.0
0.70.0
0.69.1
0.69.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.2
0.64.1
0.64.0
0.63.2
0.63.1
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.0
0.54.0
0.53.1
0.53.0
0.52.1
0.52.0
0.51.0
0.50.1
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.3
0.44.2
0.44.1
0.44.0
0.43.0
0.42.0
0.41.0
0.40.6
0.40.5
0.40.4
0.40.3
0.40.2
0.40.1
0.40.0
0.39.1
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.1
0.32.0
0.31.0
0.30.0
0.29.2
0.29.1
0.29.0
0.28.5
0.28.4
0.28.3
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.0
0.1.0
0.1.0-rc.2
0.1.0-rc.1
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
A component library for Phoenix LiveView applications
Current section
Files
Jump to
Current section
Files
js/formatters.test.js
import { describe, it, expect } from "vitest";
import { formatHours } from "./formatters.js";
describe("formatHours", () => {
describe("when hours is less than 1", () => {
it("formats fractional hours as minutes", () => {
expect(formatHours(0.5)).toBe("30m");
expect(formatHours(0.25)).toBe("15m");
expect(formatHours(0.75)).toBe("45m");
});
it("rounds to nearest minute", () => {
expect(formatHours(0.016667)).toBe("1m"); // 1 minute
expect(formatHours(0.033333)).toBe("2m"); // 2 minutes
});
it("handles zero hours", () => {
expect(formatHours(0)).toBe("0m");
});
it("handles very small values", () => {
expect(formatHours(0.001)).toBe("0m");
expect(formatHours(0.008333)).toBe("0m"); // Less than 0.5 minutes
});
});
describe("when hours is between 1 and 24", () => {
it("formats whole hours without minutes", () => {
expect(formatHours(1)).toBe("1h");
expect(formatHours(5)).toBe("5h");
expect(formatHours(12)).toBe("12h");
expect(formatHours(23)).toBe("23h");
});
it("formats hours with minutes", () => {
expect(formatHours(1.5)).toBe("1h 30m");
expect(formatHours(2.25)).toBe("2h 15m");
expect(formatHours(5.75)).toBe("5h 45m");
expect(formatHours(12.1)).toBe("12h 6m");
});
it("rounds minutes to nearest whole number", () => {
expect(formatHours(1.0083)).toBe("1h"); // 0.5 minutes rounds to 0
expect(formatHours(1.0167)).toBe("1h 1m"); // 1 minute
expect(formatHours(2.9917)).toBe("2h 60m"); // 59.5 minutes rounds to 60, shows as 2h 60m
});
it("handles edge case at 24 hours boundary", () => {
expect(formatHours(23.99)).toBe("23h 59m"); // Shows as 23h 59m
});
});
describe("when hours is 24 or more", () => {
it("formats exact days without hours", () => {
expect(formatHours(24)).toBe("1d");
expect(formatHours(48)).toBe("2d");
expect(formatHours(72)).toBe("3d");
});
it("formats days with remaining hours", () => {
expect(formatHours(25)).toBe("1d 1h");
expect(formatHours(30)).toBe("1d 6h");
expect(formatHours(49)).toBe("2d 1h");
expect(formatHours(75)).toBe("3d 3h");
});
it("ignores minutes when calculating days", () => {
expect(formatHours(24.5)).toBe("1d"); // 24.5 hours = 1 day (remaining hours is 0, so not shown)
expect(formatHours(25.75)).toBe("1d 1h"); // 25.75 hours = 1 day 1 hour (minutes ignored)
});
it("handles large values", () => {
expect(formatHours(168)).toBe("7d"); // 1 week
expect(formatHours(720)).toBe("30d"); // 30 days
expect(formatHours(8760)).toBe("365d"); // 1 year
});
});
describe("edge cases", () => {
it("handles negative values gracefully", () => {
// Note: The current implementation doesn't handle negative values explicitly
// This test documents current behavior - you may want to add validation
expect(formatHours(-1)).toBe("-60m");
expect(formatHours(-24)).toBe("-1440m"); // -24 * 60 = -1440 minutes
});
it("handles decimal precision edge cases", () => {
expect(formatHours(1.9999)).toBe("1h 60m"); // Shows as 1h 60m due to rounding
expect(formatHours(0.99999)).toBe("60m"); // Should round to 60m (not 1h)
});
});
});