import { describe, expect, it } from "vitest"; import { selectActiveIpsByMode, type LbIpRow, type LbTargetConfig, } from "../src/services/service-config-service.js"; function row( ip: string, opts: Partial> = {}, ): LbIpRow { return { ip, weight: opts.weight ?? 1, priority: opts.priority ?? 1, health: opts.health ?? "up", }; } describe("selectActiveIpsByMode", () => { it("round_robin returns all healthy ips, falls back to all if none healthy", () => { const config: LbTargetConfig = { lb_mode: "round_robin", health_check_enabled: true, }; const rows = [ row("1.1.1.1", { health: "up" }), row("2.2.2.2", { health: "down" }), row("3.3.3.3", { health: "up" }), ]; expect(selectActiveIpsByMode(config, rows).sort()).toEqual([ "1.1.1.1", "3.3.3.3", ]); }); it("round_robin returns all ips when none checked (unknown)", () => { const config: LbTargetConfig = { lb_mode: "round_robin", health_check_enabled: true, }; const rows = [row("1.1.1.1", { health: "unknown" }), row("2.2.2.2")]; expect(selectActiveIpsByMode(config, rows).sort()).toEqual([ "1.1.1.1", "2.2.2.2", ]); }); it("failover returns only min-priority healthy ips", () => { const config: LbTargetConfig = { lb_mode: "failover", health_check_enabled: true, }; const rows = [ row("1.1.1.1", { priority: 1, health: "up" }), row("2.2.2.2", { priority: 2, health: "up" }), row("3.3.3.3", { priority: 1, health: "down" }), ]; expect(selectActiveIpsByMode(config, rows)).toEqual(["1.1.1.1"]); }); it("failover falls back to min-priority ip among all when none healthy", () => { const config: LbTargetConfig = { lb_mode: "failover", health_check_enabled: true, }; const rows = [ row("1.1.1.1", { priority: 3, health: "down" }), row("2.2.2.2", { priority: 1, health: "down" }), row("3.3.3.3", { priority: 2, health: "down" }), ]; expect(selectActiveIpsByMode(config, rows)).toEqual(["2.2.2.2"]); }); it("weighted returns all healthy ips (one A per ip; weights stored for display)", () => { const config: LbTargetConfig = { lb_mode: "weighted", health_check_enabled: true, }; const rows = [ row("1.1.1.1", { weight: 3, health: "up" }), row("2.2.2.2", { weight: 1, health: "up" }), row("3.3.3.3", { weight: 2, health: "down" }), ]; expect(selectActiveIpsByMode(config, rows).sort()).toEqual([ "1.1.1.1", "2.2.2.2", ]); }); it("returns empty array for no rows", () => { const config: LbTargetConfig = { lb_mode: "round_robin", health_check_enabled: true, }; expect(selectActiveIpsByMode(config, [])).toEqual([]); }); });