84 lines
3.3 KiB
TypeScript
84 lines
3.3 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
vi.mock('../../lib/prisma', () => ({
|
|
prisma: {
|
|
company: { findUniqueOrThrow: vi.fn(), update: vi.fn(), findFirst: vi.fn() },
|
|
brandSettings: { findUnique: vi.fn(), upsert: vi.fn(), findFirst: vi.fn(), updateMany: vi.fn() },
|
|
contractSettings: { findUnique: vi.fn(), upsert: vi.fn() },
|
|
insurancePolicy: { findMany: vi.fn(), create: vi.fn(), updateMany: vi.fn(), findUniqueOrThrow: vi.fn(), deleteMany: vi.fn() },
|
|
pricingRule: { findMany: vi.fn(), create: vi.fn(), updateMany: vi.fn(), findUniqueOrThrow: vi.fn(), deleteMany: vi.fn() },
|
|
accountingSettings: { findUnique: vi.fn(), upsert: vi.fn() },
|
|
},
|
|
}))
|
|
|
|
import { prisma } from '../../lib/prisma'
|
|
import * as repo from './company.repo'
|
|
|
|
describe('company.repo edge queries', () => {
|
|
beforeEach(() => vi.clearAllMocks())
|
|
|
|
it('loads a company dashboard envelope with brand, subscription and counts', async () => {
|
|
await repo.findCompany('company_1')
|
|
|
|
expect(prisma.company.findUniqueOrThrow).toHaveBeenCalledWith({
|
|
where: { id: 'company_1' },
|
|
include: {
|
|
brand: true,
|
|
subscription: true,
|
|
_count: { select: { vehicles: true, customers: true, reservations: true } },
|
|
},
|
|
})
|
|
})
|
|
|
|
it('upserts brand settings with companyId only in the create branch', async () => {
|
|
await repo.upsertBrand('company_1', { logoUrl: '/new.png' }, { primaryColor: '#111111' })
|
|
|
|
expect(prisma.brandSettings.upsert).toHaveBeenCalledWith({
|
|
where: { companyId: 'company_1' },
|
|
update: { logoUrl: '/new.png' },
|
|
create: { companyId: 'company_1', primaryColor: '#111111' },
|
|
})
|
|
})
|
|
|
|
it('orders insurance policies by required status, sort order and name', async () => {
|
|
await repo.findInsurancePolicies('company_1')
|
|
|
|
expect(prisma.insurancePolicy.findMany).toHaveBeenCalledWith({
|
|
where: { companyId: 'company_1' },
|
|
orderBy: [{ isRequired: 'desc' }, { sortOrder: 'asc' }, { name: 'asc' }],
|
|
})
|
|
})
|
|
|
|
it('updates and deletes pricing rules inside the tenant boundary', async () => {
|
|
await repo.updatePricingRule('rule_1', 'company_1', { isActive: false })
|
|
await repo.deletePricingRule('rule_1', 'company_1')
|
|
|
|
expect(prisma.pricingRule.updateMany).toHaveBeenCalledWith({
|
|
where: { id: 'rule_1', companyId: 'company_1' },
|
|
data: { isActive: false },
|
|
})
|
|
expect(prisma.pricingRule.deleteMany).toHaveBeenCalledWith({ where: { id: 'rule_1', companyId: 'company_1' } })
|
|
})
|
|
|
|
it('detects duplicate public branding outside the current company', async () => {
|
|
await repo.findBrandBySubdomain('atlas', 'company_1')
|
|
await repo.findBrandByCustomDomain('cars.example.test', 'company_1')
|
|
|
|
expect(prisma.brandSettings.findFirst).toHaveBeenNthCalledWith(1, {
|
|
where: { subdomain: 'atlas', companyId: { not: 'company_1' } },
|
|
})
|
|
expect(prisma.brandSettings.findFirst).toHaveBeenNthCalledWith(2, {
|
|
where: { customDomain: 'cars.example.test', companyId: { not: 'company_1' } },
|
|
})
|
|
})
|
|
|
|
it('clears custom domain verification metadata in one tenant-scoped mutation', async () => {
|
|
await repo.clearCustomDomain('company_1')
|
|
|
|
expect(prisma.brandSettings.updateMany).toHaveBeenCalledWith({
|
|
where: { companyId: 'company_1' },
|
|
data: { customDomain: null, customDomainVerified: false, customDomainAddedAt: null },
|
|
})
|
|
})
|
|
})
|