优化手工开票表单校验提示

This commit is contained in:
andy
2026-07-17 17:02:27 +07:00
parent b24bfb5882
commit 56db5cacee
5 changed files with 458 additions and 22 deletions

View File

@@ -270,6 +270,62 @@ describe('ReservationManualInvoiceView', () => {
expect(wrapper.text()).not.toContain('例如 includingBF')
})
it('marks required fields and highlights empty inputs after submit', async () => {
const wrapper = mountView()
expect(wrapper.find('label[for="invoice-company"].field-label--required').exists()).toBe(true)
expect(wrapper.find('[data-testid="recipient-company-input"]').classes()).not.toContain('is-invalid')
await wrapper.find('[data-testid="manual-invoice-submit"]').trigger('click')
await flushPromises()
expect(service.generateManualReservationInvoice).not.toHaveBeenCalled()
expect(wrapper.find('[data-testid="recipient-company-input"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="recipient-company-input"]').attributes('aria-invalid')).toBe('true')
expect(wrapper.find('[data-testid="manual-invoice-field-error-company"]').text()).toBe(
zhCN.manualInvoice.fieldErrors.required,
)
expect(wrapper.find('[data-testid="booking-group-name"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="primary-room-count"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="charge-description-0"]').classes()).toContain('is-invalid')
await wrapper.find('[data-testid="recipient-company-input"]').setValue('Manual Company')
expect(wrapper.find('[data-testid="recipient-company-input"]').classes()).not.toContain('is-invalid')
expect(wrapper.find('[data-testid="manual-invoice-field-error-company"]').exists()).toBe(false)
})
it('shows field-level validation messages for invalid email, dates, and numbers', async () => {
const wrapper = mountView()
await wrapper.find('[data-testid="recipient-company-code"]').setValue('QBD')
await fillMinimumInvoiceForm(wrapper)
await wrapper.find('[data-testid="recipient-email"]').setValue('bad-email')
await wrapper.find('[data-testid="booking-departure-date"]').setValue('2026-07-19')
await wrapper.find('[data-testid="booking-extra-bed-rate"]').setValue('-1')
await wrapper.find('[data-testid="charge-rate-0"]').setValue('0')
await wrapper.find('[data-testid="manual-invoice-submit"]').trigger('click')
await flushPromises()
expect(service.generateManualReservationInvoice).not.toHaveBeenCalled()
expect(wrapper.find('[data-testid="recipient-email"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="manual-invoice-field-error-email"]').text()).toBe(
zhCN.manualInvoice.fieldErrors.invalidEmail,
)
expect(wrapper.find('[data-testid="booking-departure-date"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="manual-invoice-field-error-departure-date"]').text()).toBe(
zhCN.manualInvoice.fieldErrors.dateOrder,
)
expect(wrapper.find('[data-testid="booking-extra-bed-rate"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="manual-invoice-field-error-extra-bed-rate"]').text()).toBe(
zhCN.manualInvoice.fieldErrors.nonNegativeNumber,
)
expect(wrapper.find('[data-testid="charge-rate-0"]').classes()).toContain('is-invalid')
expect(wrapper.find('[data-testid="manual-invoice-field-error-charge-0-rate"]').text()).toBe(
zhCN.manualInvoice.fieldErrors.positiveNumber,
)
})
it('shows final-format date previews like the invoice prototype', async () => {
const wrapper = mountView()