feat: 用自定义侧边栏替换聊天室 Conversations 组件,提取公共 SidebarGroup 和 date-group
This commit is contained in:
104
tests/web/utils/date-group.test.ts
Normal file
104
tests/web/utils/date-group.test.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import { getDateGroup, groupByDate } from "../../../src/web/shared/utils/date-group";
|
||||
|
||||
function makeDate(daysAgo: number): string {
|
||||
const d = new Date();
|
||||
d.setDate(d.getDate() - daysAgo);
|
||||
return d.toISOString();
|
||||
}
|
||||
|
||||
describe("getDateGroup", () => {
|
||||
test("今天的日期返回 today", () => {
|
||||
const now = new Date();
|
||||
const result = getDateGroup(now.toISOString(), now);
|
||||
expect(result).toBe("today");
|
||||
});
|
||||
|
||||
test("昨天的日期返回 yesterday", () => {
|
||||
const now = new Date();
|
||||
const yesterday = new Date(now);
|
||||
yesterday.setDate(yesterday.getDate() - 1);
|
||||
const result = getDateGroup(yesterday.toISOString(), now);
|
||||
expect(result).toBe("yesterday");
|
||||
});
|
||||
|
||||
test("本周内的日期返回 thisWeek", () => {
|
||||
const now = new Date();
|
||||
const dayOfWeek = now.getDay();
|
||||
const mondayOffset = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
||||
const wednesday = new Date(now);
|
||||
wednesday.setDate(now.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1) + 2);
|
||||
if (wednesday > now) {
|
||||
const tuesday = new Date(now);
|
||||
tuesday.setDate(now.getDate() - mondayOffset + 1);
|
||||
if (tuesday < now && tuesday.getDate() !== now.getDate() - 1) {
|
||||
const result = getDateGroup(tuesday.toISOString(), now);
|
||||
expect(result).toBe("thisWeek");
|
||||
return;
|
||||
}
|
||||
}
|
||||
const tuesday = new Date(now);
|
||||
tuesday.setDate(now.getDate() - mondayOffset + 1);
|
||||
if (tuesday.toDateString() !== now.toDateString()) {
|
||||
const yesterday = new Date(now);
|
||||
yesterday.setDate(yesterday.getDate() - 1);
|
||||
if (tuesday.toDateString() !== yesterday.toDateString()) {
|
||||
const result = getDateGroup(tuesday.toISOString(), now);
|
||||
expect(result).toBe("thisWeek");
|
||||
return;
|
||||
}
|
||||
}
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("本月内的日期返回 thisMonth", () => {
|
||||
const now = new Date(2026, 5, 15);
|
||||
const earlier = new Date(2026, 5, 3);
|
||||
const result = getDateGroup(earlier.toISOString(), now);
|
||||
expect(result).toBe("thisMonth");
|
||||
});
|
||||
|
||||
test("更早的日期返回 earlier", () => {
|
||||
const now = new Date(2026, 5, 15);
|
||||
const earlier = new Date(2026, 3, 1);
|
||||
const result = getDateGroup(earlier.toISOString(), now);
|
||||
expect(result).toBe("earlier");
|
||||
});
|
||||
});
|
||||
|
||||
describe("groupByDate", () => {
|
||||
test("按 dateField 分组并返回有序结果", () => {
|
||||
const now = new Date();
|
||||
const items = [
|
||||
{ id: "1", title: "今天", updatedAt: now.toISOString() },
|
||||
{ id: "2", title: "昨天", updatedAt: makeDate(1) },
|
||||
{ id: "3", title: "更早", updatedAt: makeDate(60) },
|
||||
];
|
||||
|
||||
const groups = groupByDate(items, "updatedAt");
|
||||
|
||||
const todayGroup = groups.find((g) => g.key === "today")!;
|
||||
expect(todayGroup.items.length).toBe(1);
|
||||
expect(todayGroup.items[0]!.id).toBe("1");
|
||||
|
||||
const yesterdayGroup = groups.find((g) => g.key === "yesterday")!;
|
||||
expect(yesterdayGroup.items.length).toBe(1);
|
||||
|
||||
const earlierGroup = groups.find((g) => g.key === "earlier")!;
|
||||
expect(earlierGroup.items.length).toBe(1);
|
||||
|
||||
const emptyGroups = groups.filter((g) => g.key === "thisWeek" || g.key === "thisMonth");
|
||||
emptyGroups.forEach((g) => {
|
||||
expect(g.items.length).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
test("空数组返回所有空分组", () => {
|
||||
const groups = groupByDate([] as Array<{ updatedAt: string }>, "updatedAt");
|
||||
expect(groups.length).toBe(5);
|
||||
groups.forEach((g) => {
|
||||
expect(g.items.length).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user