import { describe, expect, it } from "vitest"; import { readFileSync } from "node:fs"; import { resolve } from "node:path"; const readSource = () => readFileSync(resolve(__dirname, "./PermissionIpLocations.vue"), "utf8"); const readMapSource = () => readFileSync(resolve(__dirname, "./chinaProvinceMap.ts"), "utf8"); describe("PermissionIpLocations", () => { it("renders IP location visualization without duplicate region detail table", () => { const source = readSource(); expect(source).toContain("fetchIpLocations"); expect(source).toContain("unique_ip_count"); expect(source).not.toContain("来源地域明细"); expect(source).not.toContain("table-card"); expect(source).not.toContain(" { const source = readSource(); expect(source).toContain("VChart"); expect(source).toContain("chinaMapOption"); expect(source).toContain("用户分布图"); expect(source).toContain("访问次数"); expect(source).toContain("访问用户数"); expect(source).toContain("来源 IP 数"); expect(source).toContain("summary"); }); it("uses the standard geojson.cn China map data instead of generated rectangles", () => { const source = readSource(); const mapSource = readMapSource(); expect(source).toContain("../assets/china.json"); expect(mapSource).toContain("geojson.cn/api/china/1.6.3/china.json"); expect(mapSource).not.toContain("ProvinceBox"); expect(mapSource).not.toContain("provinceBoxes"); }); it("keeps the map legend and disables map zoom interactions", () => { const source = readSource(); expect(source).toContain("visualMap:"); expect(source).toContain("VisualMapComponent"); expect(source).toContain("max: maxValue.value"); expect(source).toContain("roam: false"); expect(source).not.toContain("scaleLimit"); }); it("uses narrow metric cards without helper subtitles", () => { const source = readSource(); expect(source).toContain("min-height: 64px"); expect(source).toContain("padding: 10px 16px"); expect(source).toContain("right: -46px"); expect(source).toContain("bottom: -52px"); expect(source).toContain("border-radius: 18px"); expect(source).not.toContain("{{ card.hint }}"); expect(source).not.toContain("hint:"); expect(source).not.toContain("权限检查总量"); }); it("removes the duplicated hero copy above the map", () => { const source = readSource(); expect(source).toContain("ip-locations-toolbar"); expect(source).not.toContain("权限监控 / IP属地"); expect(source).not.toContain("按访问日志聚合省市、用户与来源 IP"); expect(source).not.toContain("悬停省份查看访问次数、访问用户数和来源 IP 数"); expect(source).not.toContain("hero-desc"); expect(source).not.toContain("eyebrow"); }); it("places the period filter toolbar on the left", () => { const source = readSource(); expect(source).toContain(".ip-hero"); expect(source).toContain("justify-content: flex-start"); expect(source).not.toContain("justify-content: flex-end"); }); });