fix test failures
Build & Push / Build & Push Docker Image (push) Successful in 5m17s
Test / Type Check (all packages) (push) Successful in 1m4s
Test / API Unit Tests (push) Successful in 49s
Test / Homepage Unit Tests (push) Has been cancelled
Test / Carplace Unit Tests (push) Has been cancelled
Test / Admin Unit Tests (push) Has been cancelled
Test / Dashboard Unit Tests (push) Has been cancelled
Test / API Integration Tests (push) Has been cancelled

This commit is contained in:
root
2026-07-20 21:26:13 -04:00
parent abb5d105cf
commit be49ac5e69
17 changed files with 62 additions and 17 deletions
@@ -11,6 +11,7 @@ vi.mock('../../lib/prisma', () => ({
}))
import { prisma } from '../../lib/prisma'
import { hashPublicAccessToken } from '../../security/publicAccessTokens'
import * as repo from './admin.repo'
describe('admin.repo edge queries', () => {
@@ -62,7 +63,10 @@ describe('admin.repo edge queries', () => {
expect(prisma.adminUser.findFirst).toHaveBeenCalledWith({
where: {
passwordResetToken: 'reset-token',
OR: [
{ passwordResetToken: hashPublicAccessToken('reset-token') },
{ passwordResetToken: 'reset-token' },
],
passwordResetExpiresAt: { gt: new Date('2026-06-01T00:00:00.000Z') },
},
})
@@ -10,6 +10,7 @@ const prismaMock = vi.hoisted(() => ({
vi.mock('../../lib/prisma', () => ({ prisma: prismaMock }))
import { hashPublicAccessToken } from '../../security/publicAccessTokens'
import * as repo from './auth.employee.repo'
describe('auth.employee.repo query boundaries', () => {
@@ -50,7 +51,10 @@ describe('auth.employee.repo query boundaries', () => {
expect(prismaMock.employee.findFirst).toHaveBeenCalledWith({
where: {
passwordResetToken: 'reset_123',
OR: [
{ passwordResetToken: hashPublicAccessToken('reset_123') },
{ passwordResetToken: 'reset_123' },
],
passwordResetExpiresAt: { gt: new Date('2026-06-09T12:00:00.000Z') },
},
})
@@ -52,6 +52,7 @@ describe('carplace.repo public query and write boundaries', () => {
where: {
id: 'vehicle_1',
isPublished: true,
status: 'AVAILABLE',
company: {
OR: [{ slug: 'atlas' }, { brand: { subdomain: 'atlas' } }],
status: { in: ['ACTIVE', 'TRIALING'] },
@@ -27,6 +27,7 @@ vi.mock('./payment.repo', () => ({
incrementReservationPaid: vi.fn(),
createPayment: vi.fn(),
updatePaypalCapture: vi.fn(),
updatePendingPaypalCapture: vi.fn(),
setReservationPaidAmount: vi.fn(),
setReservationRefunded: vi.fn(),
setPaymentRefunded: vi.fn(),
@@ -199,8 +200,8 @@ describe('payment.service', () => {
vi.mocked(repo.findByPaypal).mockResolvedValue({ id: 'payment_2', reservationId: 'reservation_2', amount: 500, type: 'CHARGE' } as never)
await handleAmanpayWebhook({ transaction_id: 'aman_txn_1', status: 'paid' })
await handlePaypalWebhook({ event_type: 'PAYMENT.CAPTURE.COMPLETED', resource: { id: 'paypal_capture_1' } })
await handlePaypalWebhook({ event_type: 'PAYMENT.CAPTURE.DENIED', resource: { id: 'paypal_capture_2' } })
await handlePaypalWebhook({ id: 'paypal_event_1', event_type: 'PAYMENT.CAPTURE.COMPLETED', resource: { id: 'paypal_capture_1' } })
await handlePaypalWebhook({ id: 'paypal_event_2', event_type: 'PAYMENT.CAPTURE.DENIED', resource: { id: 'paypal_capture_2' } })
expect(repo.markPaymentSucceeded).toHaveBeenCalledWith('payment_1')
expect(repo.incrementReservationPaid).toHaveBeenCalledWith('reservation_1', 450)
@@ -210,14 +211,20 @@ describe('payment.service', () => {
})
it('captures PayPal orders, stores the capture id, and increments the original reservation payment', async () => {
vi.mocked(repo.findByPaypalForCompany).mockResolvedValue({ id: 'payment_1', reservationId: 'reservation_1', amount: 800, type: 'CHARGE' } as never)
vi.mocked(paypal.captureOrder).mockResolvedValue({ purchase_units: [{ payments: { captures: [{ id: 'capture_123' }] } }] } as never)
vi.mocked(repo.updatePaypalCapture).mockResolvedValue({ id: 'payment_1', status: 'SUCCEEDED', paypalCaptureId: 'capture_123' } as never)
vi.mocked(repo.findByPaypalForCompany).mockResolvedValue({ id: 'payment_1', reservationId: 'reservation_1', amount: 800, currency: 'MAD', status: 'PENDING', type: 'CHARGE' } as never)
vi.mocked(paypal.captureOrder).mockResolvedValue({
status: 'COMPLETED',
purchase_units: [{
reference_id: 'reservation_1-CHARGE-1780913700000',
payments: { captures: [{ id: 'capture_123', amount: { value: '8.00', currency_code: 'MAD' } }] },
}],
} as never)
vi.mocked(repo.updatePendingPaypalCapture).mockResolvedValue({ id: 'payment_1', status: 'SUCCEEDED', paypalCaptureId: 'capture_123' } as never)
const result = await capturePaypal('reservation_1', 'company_1', 'order_123')
expect(repo.findByPaypalForCompany).toHaveBeenCalledWith('order_123', 'company_1')
expect(repo.updatePaypalCapture).toHaveBeenCalledWith('payment_1', 'capture_123')
expect(repo.updatePendingPaypalCapture).toHaveBeenCalledWith('payment_1', 'capture_123')
expect(repo.incrementReservationPaid).toHaveBeenCalledWith('reservation_1', 800)
expect(result).toEqual({ id: 'payment_1', status: 'SUCCEEDED', paypalCaptureId: 'capture_123' })
})
@@ -22,7 +22,7 @@ describe('site.repo public booking boundaries', () => {
await repo.findCompanyBySlug('atlas-rentals')
expect(prisma.company.findFirstOrThrow).toHaveBeenCalledWith({
where: { slug: 'atlas-rentals', status: { in: ['ACTIVE', 'TRIALING', 'PAST_DUE', 'SUSPENDED'] } },
where: { slug: 'atlas-rentals', status: { in: ['ACTIVE', 'TRIALING', 'PAST_DUE'] } },
include: { brand: true, contractSettings: true },
})
})
@@ -31,7 +31,7 @@ describe('site.repo public booking boundaries', () => {
await repo.findPublishedVehicles('company_1')
expect(prisma.vehicle.findMany).toHaveBeenCalledWith({
where: { companyId: 'company_1', isPublished: true },
where: { companyId: 'company_1', isPublished: true, status: 'AVAILABLE' },
orderBy: { createdAt: 'desc' },
})
})
@@ -57,7 +57,7 @@ import * as paypal from '../../services/paypalService'
import * as repo from './site.repo'
import * as service from './site.service'
const company = { id: 'company_1', slug: 'atlas', email: 'office@example.test', contractSettings: { depositRequired: true }, brand: { publicEmail: 'hello@example.test' } }
const company = { id: 'company_1', slug: 'atlas', email: 'office@example.test', status: 'ACTIVE', contractSettings: { depositRequired: true }, brand: { publicEmail: 'hello@example.test' } }
function futureDateRange(startOffsetDays: number, durationDays: number) {
const start = new Date(Date.now() + startOffsetDays * 24 * 60 * 60 * 1000)
+1
View File
@@ -91,6 +91,7 @@ function futureDateRange(startOffsetDays: number, durationDays: number) {
function makeCompany(overrides: object = {}) {
return {
id: 'co-1', slug: SLUG, name: 'Test Co', phone: null, email: 'co@test.com',
status: 'ACTIVE',
brand: { publicEmail: null }, contractSettings: null,
...overrides,
}