From ea8589f0610d24c0ed174c9622de093a19540be3 Mon Sep 17 00:00:00 2001 From: BradyMitch Date: Thu, 21 May 2026 10:41:10 -0700 Subject: [PATCH 1/2] location counter relation --- src/app/protected/settings/locations/page.tsx | 4 +- src/app/protected/settings/users/page.tsx | 3 ++ .../LocationCounterSwitch.tsx | 2 + src/components/common/select/MultiSelect.tsx | 8 ++-- .../settings/locations/LocationForm.tsx | 2 + .../EditStaffUserModal/EditStaffUserModal.tsx | 18 ++++++--- .../sections/PermissionsSection.tsx | 6 +-- .../sections/RoleAndAssignmentSection.tsx | 38 ++++++++++++++++--- .../users/StaffUserTable/StaffUserTable.tsx | 17 ++++++--- .../settings/users/StaffUserTable/columns.tsx | 4 +- .../useLocationForm/useLocationForm.ts | 11 +++++- .../useEditStaffUserModal.ts | 15 ++++---- .../useStaffUserTable/useStaffUserTable.ts | 13 ++++--- src/lib/prisma/location/insertLocation.ts | 9 +++-- src/lib/prisma/location/updateLocation.ts | 20 ++++++++++ 15 files changed, 125 insertions(+), 45 deletions(-) diff --git a/src/app/protected/settings/locations/page.tsx b/src/app/protected/settings/locations/page.tsx index 279d0c3..9f14f78 100644 --- a/src/app/protected/settings/locations/page.tsx +++ b/src/app/protected/settings/locations/page.tsx @@ -1,7 +1,7 @@ import { revalidatePath } from "next/cache" import { headers } from "next/headers" import { LocationTable } from "@/components/settings/locations/LocationTable" -import type { Counter } from "@/generated/prisma/client" +import { getAllCounters } from "@/lib/prisma/counter/getAllCounters" import { doesLocationCodeExist } from "@/lib/prisma/location/doesLocationCodeExist" import { getAllLocations } from "@/lib/prisma/location/getAllLocations" import { insertLocation } from "@/lib/prisma/location/insertLocation" @@ -22,7 +22,7 @@ export default async function Page() { const currentUser = await getStaffUserBySub(user?.sub ?? "") const locations = await getAllLocations() const services = await getAllServices() - const counters = [] as Counter[] + const counters = await getAllCounters() const staffUsers = await getAllStaffUsers() const revalidateTable = async () => { diff --git a/src/app/protected/settings/users/page.tsx b/src/app/protected/settings/users/page.tsx index 71a2faf..81f25a3 100644 --- a/src/app/protected/settings/users/page.tsx +++ b/src/app/protected/settings/users/page.tsx @@ -1,6 +1,7 @@ import { revalidatePath } from "next/cache" import { headers } from "next/headers" import { StaffUserTable } from "@/components/settings/users/StaffUserTable" +import { getAllCounters } from "@/lib/prisma/counter/getAllCounters" import { getAllLocations } from "@/lib/prisma/location/getAllLocations" import { getAllStaffUsers } from "@/lib/prisma/staff_user/getAllStaffUsers" import { getStaffUserBySub } from "@/lib/prisma/staff_user/getStaffUserBySub" @@ -23,6 +24,7 @@ export default async function Page() { const currentUser = await getStaffUserBySub(user?.sub ?? "") const users = await getAllStaffUsers() const locations = await getAllLocations() + const counters = await getAllCounters() return (
@@ -31,6 +33,7 @@ export default async function Page() { currentUser={currentUser} users={users} locations={locations} + counters={counters} updateStaffUser={updateStaffUser} revalidateTable={revalidateTable} /> diff --git a/src/components/common/header/locationCounterSwitch/LocationCounterSwitch.tsx b/src/components/common/header/locationCounterSwitch/LocationCounterSwitch.tsx index a589254..2b4219b 100644 --- a/src/components/common/header/locationCounterSwitch/LocationCounterSwitch.tsx +++ b/src/components/common/header/locationCounterSwitch/LocationCounterSwitch.tsx @@ -118,6 +118,8 @@ export const LocationCounterSwitch = ({ const handleLocationChange = (locationCode: string) => { const loc = locations?.find((l) => l?.code === locationCode) || null setSelectedLocation(loc) + const defaultCounter = loc?.counters?.find((c) => c?.name === "Counter") || null + setSelectedCounter(defaultCounter) } const handleCounterChange = (counterId: string) => { diff --git a/src/components/common/select/MultiSelect.tsx b/src/components/common/select/MultiSelect.tsx index 32ada00..b2c0c5c 100644 --- a/src/components/common/select/MultiSelect.tsx +++ b/src/components/common/select/MultiSelect.tsx @@ -16,6 +16,7 @@ type MultiSelectProps = { onChange: (selected: string[]) => void placeholder?: string disabled?: boolean + locked?: string[] } export const MultiSelect = ({ @@ -26,6 +27,7 @@ export const MultiSelect = ({ onChange, placeholder = "Search...", disabled = false, + locked = [], }: MultiSelectProps) => { const [query, setQuery] = useState("") const [focusedWithin, setFocusedWithin] = useState(false) @@ -47,14 +49,14 @@ export const MultiSelect = ({ const isSelected = (key: string) => selected.includes(key) const toggle = (key: string) => { - if (disabled) return + if (disabled || locked.includes(key)) return if (isSelected(key)) onChange(selected.filter((s) => s !== key)) else onChange([...selected, key]) } const remove = (e: React.MouseEvent, key: string) => { e.stopPropagation() - if (disabled) return + if (disabled || locked.includes(key)) return onChange(selected.filter((s) => s !== key)) } @@ -251,7 +253,7 @@ export const MultiSelect = ({ > {o.label} - {!disabled && ( + {!disabled && !locked.includes(o.key) && (
diff --git a/src/components/settings/users/EditStaffUserModal/EditStaffUserModal.tsx b/src/components/settings/users/EditStaffUserModal/EditStaffUserModal.tsx index 22d3040..ec0200a 100644 --- a/src/components/settings/users/EditStaffUserModal/EditStaffUserModal.tsx +++ b/src/components/settings/users/EditStaffUserModal/EditStaffUserModal.tsx @@ -8,8 +8,11 @@ import { DialogTitle, Modal, } from "@/components/common/dialog" -import type { Location, Role, StaffUser } from "@/generated/prisma/client" +import type { Role } from "@/generated/prisma/client" import { useEditStaffUserModal } from "@/hooks/settings/users/useEditStaffUserModal" +import type { CounterWithRelations } from "@/lib/prisma/counter/types" +import type { LocationWithRelations } from "@/lib/prisma/location/types" +import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" import { PermissionsSection } from "./sections/PermissionsSection" import { RoleAndAssignmentSection } from "./sections/RoleAndAssignmentSection" import { UserInformationSection } from "./sections/UserInformationSection" @@ -17,17 +20,18 @@ import { UserInformationSection } from "./sections/UserInformationSection" type EditStaffUserModalProps = { open: boolean onClose: () => void - user: StaffUser | null + user: StaffUserWithRelations | null canEdit: boolean canArchive: boolean canEditLocation: boolean availableRoles: Role[] - locations: Location[] + locations: LocationWithRelations[] + counters: CounterWithRelations[] updateStaffUser: ( - user: Partial, - prevUser: Partial, + user: Partial, + prevUser: Partial, availableRoles: Role[] - ) => Promise + ) => Promise revalidateTable: () => Promise openConfirmArchiveUserModal: () => void } @@ -40,6 +44,7 @@ export const EditStaffUserModal = ({ canArchive, canEditLocation, locations, + counters, availableRoles, updateStaffUser, revalidateTable, @@ -105,6 +110,7 @@ export const EditStaffUserModal = ({ > + user: StaffUserWithRelations + setFormData: Dispatch> disabled?: boolean } diff --git a/src/components/settings/users/EditStaffUserModal/sections/RoleAndAssignmentSection.tsx b/src/components/settings/users/EditStaffUserModal/sections/RoleAndAssignmentSection.tsx index 43a1ddb..43a5877 100644 --- a/src/components/settings/users/EditStaffUserModal/sections/RoleAndAssignmentSection.tsx +++ b/src/components/settings/users/EditStaffUserModal/sections/RoleAndAssignmentSection.tsx @@ -1,12 +1,16 @@ import type { Dispatch, SetStateAction } from "react" import { SelectInput } from "@/components/common/select" -import type { Location, Role, StaffUser } from "@/generated/prisma/client" +import type { Role } from "@/generated/prisma/client" +import type { CounterWithRelations } from "@/lib/prisma/counter/types" +import type { LocationWithRelations } from "@/lib/prisma/location/types" +import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" import { Section } from "./Section" type RoleAndAssignmentSectionProps = { - user: StaffUser - locations: Location[] - setFormData: Dispatch> + user: StaffUserWithRelations + locations: LocationWithRelations[] + counters: CounterWithRelations[] + setFormData: Dispatch> availableRoles: Role[] canEditLocation: boolean disabled?: boolean @@ -15,13 +19,26 @@ type RoleAndAssignmentSectionProps = { export const RoleAndAssignmentSection = ({ user, locations, + counters, setFormData, availableRoles, canEditLocation, disabled = false, }: RoleAndAssignmentSectionProps) => { + const locationCounters = counters.filter((c) => + c.locations.some((l) => l.code === user.locationCode) + ) + + const defaultCounter = counters.find((c) => c.name === "Counter") ?? null + + const handleLocationChange = (value: string) => { + setFormData( + (prev) => prev && { ...prev, locationCode: value, counterId: defaultCounter?.id ?? null } + ) + } + return ( -
+
setFormData((prev) => prev && { ...prev, locationCode: value })} + onChange={handleLocationChange} disabled={!canEditLocation || disabled} options={locations .filter((location) => location.deletedAt === null) @@ -44,6 +61,15 @@ export const RoleAndAssignmentSection = ({ label: `${location.name} (${location.code})`, }))} /> + + setFormData((prev) => prev && { ...prev, counterId: value })} + disabled={disabled || !user.locationCode || locationCounters.length === 0} + options={locationCounters.map((counter) => ({ value: counter.id, label: counter.name }))} + />
) } diff --git a/src/components/settings/users/StaffUserTable/StaffUserTable.tsx b/src/components/settings/users/StaffUserTable/StaffUserTable.tsx index 432e5cf..370dc10 100644 --- a/src/components/settings/users/StaffUserTable/StaffUserTable.tsx +++ b/src/components/settings/users/StaffUserTable/StaffUserTable.tsx @@ -2,8 +2,10 @@ import { DataTable } from "@/components/common/datatable" import { Switch } from "@/components/common/switch" -import type { Location, Role, StaffUser } from "@/generated/prisma/client" +import type { Role } from "@/generated/prisma/client" import { useStaffUserTable } from "@/hooks/settings/users/useStaffUserTable" +import type { CounterWithRelations } from "@/lib/prisma/counter/types" +import type { LocationWithRelations } from "@/lib/prisma/location/types" import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" import { ConfirmArchiveUserModal } from "../ConfirmArchiveUserModal" import { EditStaffUserModal } from "../EditStaffUserModal" @@ -11,13 +13,14 @@ import { columns } from "./columns" export type UserTableProps = { currentUser: StaffUserWithRelations | null - users: StaffUser[] - locations: Location[] + users: StaffUserWithRelations[] + locations: LocationWithRelations[] + counters: CounterWithRelations[] updateStaffUser: ( - user: Partial, - prevUser: Partial, + user: Partial, + prevUser: Partial, availableRoles?: Role[] - ) => Promise + ) => Promise revalidateTable: () => Promise } @@ -25,6 +28,7 @@ export const StaffUserTable = ({ currentUser, users, locations, + counters, updateStaffUser, revalidateTable, }: UserTableProps) => { @@ -75,6 +79,7 @@ export const StaffUserTable = ({ canEditLocation={canEditLocationSelectedUser} availableRoles={availableRolesForSelectedUser} locations={locations} + counters={counters} updateStaffUser={updateStaffUser} revalidateTable={revalidateTable} openConfirmArchiveUserModal={openConfirmArchiveUserModal} diff --git a/src/components/settings/users/StaffUserTable/columns.tsx b/src/components/settings/users/StaffUserTable/columns.tsx index 4bb96c4..0c87504 100644 --- a/src/components/settings/users/StaffUserTable/columns.tsx +++ b/src/components/settings/users/StaffUserTable/columns.tsx @@ -1,7 +1,7 @@ import type { ColumnConfig } from "@/components/common/datatable" -import type { StaffUser } from "@/generated/prisma/client" +import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" -export const columns: ColumnConfig[] = [ +export const columns: ColumnConfig[] = [ { key: "displayName", label: "Name", diff --git a/src/hooks/settings/locations/useLocationForm/useLocationForm.ts b/src/hooks/settings/locations/useLocationForm/useLocationForm.ts index d3d4d3e..14a6c12 100644 --- a/src/hooks/settings/locations/useLocationForm/useLocationForm.ts +++ b/src/hooks/settings/locations/useLocationForm/useLocationForm.ts @@ -65,6 +65,12 @@ export const useLocationForm = ({ [staffUsers] ) + // IDs of counters named "Counter" that are currently assigned to this location + const lockedCounterIds = useMemo( + () => (location.counters ?? []).filter((c) => c.name === "Counter").map((c) => c.id), + [location.counters] + ) + // biome-ignore lint/correctness/useExhaustiveDependencies: <> useEffect(() => { // when the location changes (new location loaded) reset initial code and state @@ -153,11 +159,13 @@ export const useLocationForm = ({ } const handleCountersChange = (selected: string[]) => { + // Ensure locked counters (named "Counter") are never removed + const withLocked = Array.from(new Set([...lockedCounterIds, ...selected])) setFormData((s) => s ? { ...s, - counters: selected.map((id) => counters.find((c) => c.id === id) as Counter), + counters: withLocked.map((id) => counters.find((c) => c.id === id) as Counter), } : s ) @@ -181,6 +189,7 @@ export const useLocationForm = ({ selectedStaffUserIds, serviceOptions, counterOptions, + lockedCounterIds, staffUserOptions, handleCodeChange, handleNameChange, diff --git a/src/hooks/settings/users/useEditStaffUserModal/useEditStaffUserModal.ts b/src/hooks/settings/users/useEditStaffUserModal/useEditStaffUserModal.ts index c4fbf7c..04d4c43 100644 --- a/src/hooks/settings/users/useEditStaffUserModal/useEditStaffUserModal.ts +++ b/src/hooks/settings/users/useEditStaffUserModal/useEditStaffUserModal.ts @@ -1,18 +1,19 @@ import { useRouter } from "next/navigation" import { useEffect, useState } from "react" -import type { Role, StaffUser } from "@/generated/prisma/client" +import type { Role } from "@/generated/prisma/client" +import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" type UseEditStaffUserModalProps = { open: boolean onClose: () => void - user: StaffUser | null + user: StaffUserWithRelations | null canEdit: boolean canArchive: boolean updateStaffUser: ( - user: Partial, - prevUser: Partial, + user: Partial, + prevUser: Partial, availableRoles: Role[] - ) => Promise + ) => Promise availableRoles: Role[] revalidateTable: () => Promise openConfirmArchiveUserModal: () => void @@ -46,8 +47,8 @@ export const useEditStaffUserModal = ({ const router = useRouter() const [isSaving, setIsSaving] = useState(false) const [error, setError] = useState(null) - const [formData, setFormData] = useState(null) - const [previousUser, setPreviousUser] = useState(null) + const [formData, setFormData] = useState(null) + const [previousUser, setPreviousUser] = useState(null) useEffect(() => { if (open && user) { diff --git a/src/hooks/settings/users/useStaffUserTable/useStaffUserTable.ts b/src/hooks/settings/users/useStaffUserTable/useStaffUserTable.ts index 8535927..41186a3 100644 --- a/src/hooks/settings/users/useStaffUserTable/useStaffUserTable.ts +++ b/src/hooks/settings/users/useStaffUserTable/useStaffUserTable.ts @@ -1,15 +1,16 @@ import { useEffect, useMemo, useState } from "react" -import type { Location, Role, StaffUser } from "@/generated/prisma/client" +import type { Role } from "@/generated/prisma/client" import { useAuth } from "@/hooks/useAuth" import { useDialog } from "@/hooks/useDialog" +import type { LocationWithRelations } from "@/lib/prisma/location/types" import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types" import { resolvePolicy } from "@/utils/policies/resolvePolicy" import type { UserContext } from "@/utils/policies/types" type UseStaffUserTableProps = { currentUser: StaffUserWithRelations | null - users: StaffUser[] - locations: Location[] + users: StaffUserWithRelations[] + locations: LocationWithRelations[] revalidateTable: () => Promise } @@ -46,7 +47,7 @@ export const useStaffUserTable = ({ currentUser, users }: UseStaffUserTableProps [idir_user_guid, role, currentUser?.locationCode] ) - const [selectedUser, setSelectedUser] = useState(null) + const [selectedUser, setSelectedUser] = useState(null) const [canEditSelectedUser, setCanEditSelectedUser] = useState(false) const [canArchiveSelectedUser, setCanArchiveSelectedUser] = useState(false) const [canEditLocationSelectedUser, setCanEditLocationSelectedUser] = useState(false) @@ -75,12 +76,12 @@ export const useStaffUserTable = ({ currentUser, users }: UseStaffUserTableProps } }, [selectedUser, userContext]) - const handleRowClick = (user: StaffUser) => { + const handleRowClick = (user: StaffUserWithRelations) => { setSelectedUser(user) openEditUserModal() } - const usersToShow = users.filter((user) => { + const usersToShow = users.filter((user: StaffUserWithRelations) => { if (!showArchived && user.deletedAt !== null) return false const actions = resolvePolicy("staff_user", userContext, user) return actions.includes("view") diff --git a/src/lib/prisma/location/insertLocation.ts b/src/lib/prisma/location/insertLocation.ts index 642bf37..ff3017d 100644 --- a/src/lib/prisma/location/insertLocation.ts +++ b/src/lib/prisma/location/insertLocation.ts @@ -18,15 +18,18 @@ export const insertLocation = async ( const { services, counters, staffUsers, ...rest } = location + // Always link the default "Counter" counter to the new location + const defaultCounter = await prisma.counter.findUniqueOrThrow({ where: { name: "Counter" } }) + + const counterIds = new Set([defaultCounter.id, ...(counters ?? []).map((c) => c.id)]) + // map services to Prisma connect shape when provided const data: Prisma.LocationCreateInput = { ...(rest as Prisma.LocationCreateInput), ...(services && services.length > 0 ? { services: { connect: services.map((s) => ({ code: s.code })) } } : {}), - ...(counters && counters.length > 0 - ? { counters: { connect: counters.map((c) => ({ id: c.id })) } } - : {}), + counters: { connect: Array.from(counterIds).map((id) => ({ id })) }, ...(staffUsers && staffUsers.length > 0 ? { staffUsers: { connect: staffUsers.map((u) => ({ guid: u.guid })) } } : {}), diff --git a/src/lib/prisma/location/updateLocation.ts b/src/lib/prisma/location/updateLocation.ts index b83a2e1..608af76 100644 --- a/src/lib/prisma/location/updateLocation.ts +++ b/src/lib/prisma/location/updateLocation.ts @@ -58,5 +58,25 @@ export const updateLocation = async ( include: { services: true, counters: true, staffUsers: true }, }) + // Reset counter to default for users whose location membership changed + if (staffUsers) { + const defaultCounter = await prisma.counter.findUniqueOrThrow({ where: { name: "Counter" } }) + + const prevGuids = new Set((prevLocation.staffUsers ?? []).map((u) => u.guid)) + const newGuids = new Set(staffUsers.map((u) => u.guid)) + + const changedGuids = [ + ...Array.from(prevGuids).filter((g) => !newGuids.has(g)), // removed + ...Array.from(newGuids).filter((g) => !prevGuids.has(g)), // added + ] + + if (changedGuids.length > 0) { + await prisma.staffUser.updateMany({ + where: { guid: { in: changedGuids } }, + data: { counterId: defaultCounter.id }, + }) + } + } + return newLocation } From c01353a02e5ed34c3549690b48613170d92c7b39 Mon Sep 17 00:00:00 2001 From: BradyMitch Date: Thu, 21 May 2026 10:47:46 -0700 Subject: [PATCH 2/2] update tests --- .../prisma/location/insertLocation.test.ts | 20 ++++++++++++++++--- .../prisma/location/updateLocation.test.ts | 16 +++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/lib/prisma/location/insertLocation.test.ts b/src/lib/prisma/location/insertLocation.test.ts index 781262a..cb7e635 100644 --- a/src/lib/prisma/location/insertLocation.test.ts +++ b/src/lib/prisma/location/insertLocation.test.ts @@ -3,8 +3,13 @@ import { prisma } from "@/utils/db/prisma" import { insertLocation } from "./insertLocation" import type { LocationWithRelations } from "./types" +const mockDefaultCounter = { id: "default-counter-id", name: "Counter" } + vi.mock("@/utils/db/prisma", () => ({ prisma: { + counter: { + findUniqueOrThrow: vi.fn(), + }, location: { create: vi.fn(), }, @@ -14,6 +19,7 @@ vi.mock("@/utils/db/prisma", () => ({ describe("insertLocation", () => { beforeEach(() => { vi.clearAllMocks() + vi.mocked(prisma.counter.findUniqueOrThrow).mockResolvedValue(mockDefaultCounter as never) }) it("inserts and returns the created location when name is provided with relations", async () => { @@ -35,18 +41,21 @@ describe("insertLocation", () => { staffUsers: [{ guid: "u1" }], } - vi.mocked(prisma.location.create).mockResolvedValueOnce(mockLocation as LocationWithRelations) + vi.mocked(prisma.location.create).mockResolvedValueOnce( + mockLocation as unknown as LocationWithRelations + ) const result = await insertLocation(input as Partial) expect(result).toEqual(mockLocation) + expect(prisma.counter.findUniqueOrThrow).toHaveBeenCalledWith({ where: { name: "Counter" } }) expect(prisma.location.create).toHaveBeenCalledWith({ data: { name: "New Office", timezone: "UTC", streetAddress: "456 Main St", services: { connect: [{ code: "SVC1" }] }, - counters: { connect: [{ id: "c1" }] }, + counters: { connect: [{ id: "default-counter-id" }, { id: "c1" }] }, staffUsers: { connect: [{ guid: "u1" }] }, }, include: { services: true, counters: true, staffUsers: true }, @@ -70,8 +79,12 @@ describe("insertLocation", () => { const result = await insertLocation(input as Partial) expect(result).toEqual(mockLocation) + expect(prisma.counter.findUniqueOrThrow).toHaveBeenCalledWith({ where: { name: "Counter" } }) expect(prisma.location.create).toHaveBeenCalledWith({ - data: { name: "Simple Office" }, + data: { + name: "Simple Office", + counters: { connect: [{ id: "default-counter-id" }] }, + }, include: { services: true, counters: true, staffUsers: true }, }) }) @@ -83,6 +96,7 @@ describe("insertLocation", () => { /Name is required to insert a location/ ) + expect(prisma.counter.findUniqueOrThrow).not.toHaveBeenCalled() expect(prisma.location.create).not.toHaveBeenCalled() }) }) diff --git a/src/lib/prisma/location/updateLocation.test.ts b/src/lib/prisma/location/updateLocation.test.ts index f971e68..64fb804 100644 --- a/src/lib/prisma/location/updateLocation.test.ts +++ b/src/lib/prisma/location/updateLocation.test.ts @@ -3,8 +3,16 @@ import { prisma } from "@/utils/db/prisma" import type { LocationWithRelations } from "./types" import { updateLocation } from "./updateLocation" +const mockDefaultCounter = { id: "default-counter-id", name: "Counter" } + vi.mock("@/utils/db/prisma", () => ({ prisma: { + counter: { + findUniqueOrThrow: vi.fn(), + }, + staffUser: { + updateMany: vi.fn(), + }, location: { update: vi.fn(), }, @@ -67,6 +75,7 @@ describe("updateLocation", () => { isPesticideDesignate: false, isFinanceDesignate: false, isIta2Designate: false, + isDeveloper: false, } const mockLocationWithRelations: LocationWithRelations = { @@ -78,6 +87,8 @@ describe("updateLocation", () => { beforeEach(() => { vi.clearAllMocks() + vi.mocked(prisma.counter.findUniqueOrThrow).mockResolvedValue(mockDefaultCounter as never) + vi.mocked(prisma.staffUser.updateMany).mockResolvedValue({ count: 0 }) }) it("returns null when neither code nor prevLocation.code is provided", async () => { @@ -248,6 +259,11 @@ describe("updateLocation", () => { }), include: { services: true, counters: true, staffUsers: true }, }) + expect(prisma.counter.findUniqueOrThrow).toHaveBeenCalledWith({ where: { name: "Counter" } }) + expect(prisma.staffUser.updateMany).toHaveBeenCalledWith({ + where: { guid: { in: ["user-guid-2"] } }, + data: { counterId: "default-counter-id" }, + }) }) it("updates multiple fields and relations together", async () => {