Initial commit

This commit is contained in:
theshy
2025-07-31 17:05:07 +08:00
parent 8fab3b19cc
commit 24f21144ab
91 changed files with 16311 additions and 159 deletions

View File

@ -0,0 +1,62 @@
import { render, screen } from "@testing-library/react";
import { ThemeProvider, useTheme } from "@/lib/contexts/theme-context";
// 测试组件
function TestComponent() {
const { theme, setTheme, isDark } = useTheme();
return (
<div>
<span data-testid="theme">{theme}</span>
<span data-testid="isDark">{isDark.toString()}</span>
<button onClick={() => setTheme("dark")}>Set Dark</button>
<button onClick={() => setTheme("light")}>Set Light</button>
</div>
);
}
describe("ThemeContext", () => {
beforeEach(() => {
// 清除 localStorage
localStorage.clear();
// 清除 document 的 class
document.documentElement.classList.remove("dark");
document.body.classList.remove("dark");
});
it("should provide default theme", () => {
render(
<ThemeProvider>
<TestComponent />
</ThemeProvider>
);
expect(screen.getByTestId("theme").textContent).toBe("light");
expect(screen.getByTestId("isDark").textContent).toBe("false");
});
it("should load theme from localStorage", () => {
localStorage.setItem("theme", "dark");
render(
<ThemeProvider>
<TestComponent />
</ThemeProvider>
);
expect(screen.getByTestId("theme").textContent).toBe("dark");
expect(screen.getByTestId("isDark").textContent).toBe("true");
});
it("should apply dark class to document", () => {
localStorage.setItem("theme", "dark");
render(
<ThemeProvider>
<TestComponent />
</ThemeProvider>
);
expect(document.documentElement.classList.contains("dark")).toBe(true);
expect(document.body.classList.contains("dark")).toBe(true);
});
});

View File

@ -0,0 +1,64 @@
import { UserSettingsService } from "@/lib/services/user-settings.service";
// Mock Prisma
jest.mock("@/lib/database", () => ({
prisma: {
userSettings: {
findUnique: jest.fn(),
create: jest.fn(),
update: jest.fn(),
delete: jest.fn(),
upsert: jest.fn(),
},
},
}));
describe("UserSettingsService", () => {
const mockPrisma = require("@/lib/database").prisma;
beforeEach(() => {
jest.clearAllMocks();
});
it("should get user settings", async () => {
const mockSettings = {
id: "settings-1",
userId: "user-1",
defaultQuality: "medium",
publicProfile: false,
allowDownload: true,
createdAt: new Date(),
updatedAt: new Date(),
};
mockPrisma.userSettings.findUnique.mockResolvedValue(mockSettings);
const result = await UserSettingsService.getUserSettings("user-1");
expect(result).toEqual(mockSettings);
expect(mockPrisma.userSettings.findUnique).toHaveBeenCalledWith({
where: { userId: "user-1" },
});
});
it("should return existing user settings when they exist", async () => {
const mockSettings = {
id: "settings-1",
userId: "user-1",
defaultQuality: "medium",
publicProfile: false,
allowDownload: true,
createdAt: new Date(),
updatedAt: new Date(),
};
mockPrisma.userSettings.findUnique.mockResolvedValue(mockSettings);
const result = await UserSettingsService.getOrCreateUserSettings("user-1");
expect(result).toEqual(mockSettings);
expect(mockPrisma.userSettings.findUnique).toHaveBeenCalledWith({
where: { userId: "user-1" },
});
});
});