103 lines
2.7 KiB
TypeScript
103 lines
2.7 KiB
TypeScript
import { TRPCError } from "@trpc/server";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import {
|
|
assertCountryCodeAvailable,
|
|
assertMetroCityDeletable,
|
|
buildCountryCreateData,
|
|
buildCountryListWhere,
|
|
buildCountryUpdateData,
|
|
buildMetroCityCreateData,
|
|
buildMetroCityUpdateData,
|
|
findCountryByIdentifier,
|
|
jsonOrNull,
|
|
} from "../router/country-support.js";
|
|
|
|
describe("country support", () => {
|
|
it("builds list filters", () => {
|
|
expect(buildCountryListWhere({ isActive: true })).toEqual({
|
|
isActive: true,
|
|
});
|
|
});
|
|
|
|
it("resolves countries by code before fuzzy name fallback", async () => {
|
|
const db = {
|
|
country: {
|
|
findUnique: vi.fn().mockResolvedValue(null),
|
|
findFirst: vi.fn()
|
|
.mockResolvedValueOnce({ id: "country_de", code: "DE" }),
|
|
},
|
|
} as never;
|
|
|
|
const result = await findCountryByIdentifier<{ id: string; code: string }>(
|
|
db,
|
|
" de ",
|
|
{ select: { id: true, code: true } },
|
|
);
|
|
|
|
expect(result).toEqual({ id: "country_de", code: "DE" });
|
|
expect(db.country.findFirst).toHaveBeenNthCalledWith(1, {
|
|
where: { code: { equals: "DE", mode: "insensitive" } },
|
|
select: { id: true, code: true },
|
|
});
|
|
});
|
|
|
|
it("rejects duplicate country codes outside the ignored id", async () => {
|
|
const db = {
|
|
country: {
|
|
findUnique: vi.fn().mockResolvedValue({ id: "country_existing", code: "DE" }),
|
|
},
|
|
} as never;
|
|
|
|
await expect(assertCountryCodeAvailable(db, "DE")).rejects.toBeInstanceOf(TRPCError);
|
|
});
|
|
|
|
it("builds create and sparse update payloads", () => {
|
|
expect(buildCountryCreateData({
|
|
code: "DE",
|
|
name: "Germany",
|
|
dailyWorkingHours: 8,
|
|
scheduleRules: [{ weekday: 1 }],
|
|
})).toEqual({
|
|
code: "DE",
|
|
name: "Germany",
|
|
dailyWorkingHours: 8,
|
|
scheduleRules: [{ weekday: 1 }],
|
|
});
|
|
|
|
expect(buildCountryUpdateData({
|
|
dailyWorkingHours: 7.5,
|
|
scheduleRules: null,
|
|
isActive: false,
|
|
})).toEqual({
|
|
dailyWorkingHours: 7.5,
|
|
scheduleRules: expect.anything(),
|
|
isActive: false,
|
|
});
|
|
|
|
expect(buildMetroCityCreateData({
|
|
name: "Berlin",
|
|
countryId: "country_de",
|
|
})).toEqual({
|
|
name: "Berlin",
|
|
countryId: "country_de",
|
|
});
|
|
|
|
expect(buildMetroCityUpdateData({
|
|
name: "Munich",
|
|
})).toEqual({
|
|
name: "Munich",
|
|
});
|
|
});
|
|
|
|
it("maps nullish schedule rules to Prisma.JsonNull", () => {
|
|
expect(jsonOrNull(null)).toBeTypeOf("object");
|
|
expect(jsonOrNull(undefined)).toBeTypeOf("object");
|
|
});
|
|
|
|
it("rejects metro-city deletion while resources are assigned", () => {
|
|
expect(() => assertMetroCityDeletable({
|
|
_count: { resources: 1 },
|
|
})).toThrow(TRPCError);
|
|
});
|
|
});
|