Packages
noora
0.20.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("basic formatting", () => {
it("formats fractional hours as rounded hours", () => {
expect(formatHours(0.5)).toBe("1h");
expect(formatHours(0.25)).toBe("0h");
expect(formatHours(0.75)).toBe("1h");
});
it("rounds to nearest hour", () => {
expect(formatHours(0.4)).toBe("0h");
expect(formatHours(0.6)).toBe("1h");
});
it("handles zero hours", () => {
expect(formatHours(0)).toBe("0h");
});
it("handles very small values", () => {
expect(formatHours(0.001)).toBe("0h");
expect(formatHours(0.4)).toBe("0h");
});
it("formats whole hours", () => {
expect(formatHours(1)).toBe("1h");
expect(formatHours(5)).toBe("5h");
expect(formatHours(12)).toBe("12h");
expect(formatHours(23)).toBe("23h");
});
it("rounds fractional hours to nearest whole hour", () => {
expect(formatHours(1.3)).toBe("1h");
expect(formatHours(1.5)).toBe("2h");
expect(formatHours(2.7)).toBe("3h");
expect(formatHours(12.1)).toBe("12h");
});
});
describe("large values", () => {
it("formats hours >= 24 as hours only", () => {
expect(formatHours(24)).toBe("24h");
expect(formatHours(25)).toBe("25h");
expect(formatHours(25.5)).toBe("26h");
expect(formatHours(48)).toBe("48h");
expect(formatHours(72)).toBe("72h");
});
it("rounds fractional hours to nearest whole hour", () => {
expect(formatHours(24.3)).toBe("24h");
expect(formatHours(24.6)).toBe("25h");
expect(formatHours(25.7)).toBe("26h");
});
it("handles very large values", () => {
expect(formatHours(168)).toBe("168h"); // 1 week
expect(formatHours(720)).toBe("720h"); // 30 days
expect(formatHours(8760)).toBe("8760h"); // 1 year
});
});
describe("edge cases", () => {
it("handles negative values gracefully", () => {
expect(formatHours(-1)).toBe("-1h");
expect(formatHours(-24)).toBe("-24h");
expect(formatHours(-25.5)).toBe("-25h");
});
it("handles decimal precision edge cases", () => {
expect(formatHours(1.9999)).toBe("2h");
expect(formatHours(0.99999)).toBe("1h");
expect(formatHours(23.9999)).toBe("24h");
});
});
describe("with includeMinutes option", () => {
it("formats hours with minutes when includeMinutes is true", () => {
expect(formatHours(1.5, { includeMinutes: true })).toBe("1h 30m");
expect(formatHours(2.25, { includeMinutes: true })).toBe("2h 15m");
expect(formatHours(3.75, { includeMinutes: true })).toBe("3h 45m");
});
it("formats whole hours without minutes", () => {
expect(formatHours(1, { includeMinutes: true })).toBe("1h");
expect(formatHours(5, { includeMinutes: true })).toBe("5h");
expect(formatHours(24, { includeMinutes: true })).toBe("24h");
});
it("rounds minutes correctly", () => {
expect(formatHours(1.501, { includeMinutes: true })).toBe("1h 30m");
expect(formatHours(1.499, { includeMinutes: true })).toBe("1h 30m");
expect(formatHours(1.008, { includeMinutes: true })).toBe("1h");
});
it("handles edge case where minutes round to 60", () => {
expect(formatHours(1.999, { includeMinutes: true })).toBe("2h");
expect(formatHours(23.999, { includeMinutes: true })).toBe("24h");
});
it("works with large hour values", () => {
expect(formatHours(25.5, { includeMinutes: true })).toBe("25h 30m");
expect(formatHours(168.25, { includeMinutes: true })).toBe("168h 15m");
expect(formatHours(720.75, { includeMinutes: true })).toBe("720h 45m");
});
it("handles negative values with minutes", () => {
expect(formatHours(-1.5, { includeMinutes: true })).toBe("-1h 30m");
expect(formatHours(-24.25, { includeMinutes: true })).toBe("-24h 15m");
});
it("uses default behavior when includeMinutes is false", () => {
expect(formatHours(1.5, { includeMinutes: false })).toBe("2h");
expect(formatHours(2.25, { includeMinutes: false })).toBe("2h");
});
it("uses default behavior when no options provided", () => {
expect(formatHours(1.5)).toBe("2h");
expect(formatHours(2.25)).toBe("2h");
});
});
});