How to Test Insurance Quote and Bind Flows
Short answer
Insurance quote/bind wizards fail on rating knock-outs, stale premium display, bind without mandatory disclosures, and step regressions when product lines diverge—not on whether step 1 Next works. Seed rate tables for zip/age boundaries, probe quote_status and premium cents each step, convert manual multi-line sessions to SmartTests, and map quote_step coverage to TrueCoverage product_line slices.
Part of Testing Guides by industry.
Who this is for
Teams shipping P&C or life insurtech quote flows, comparison wizards, bind-online, or quote-to-bind handoff to agents with rating engines, knock-out questions, coverage limits, and regulatory disclosures per jurisdiction.
Why testing insurance quotes matters
Rating errors are regulatory and financial exposure:
- Wrong premium — displayed $120/mo, bound at $180; unfair trade practice claims.
- Knock-out bypass — high-risk answer should decline; policy bound; carrier loss ratio spike.
- Missing disclosures — bind without state-mandated PDF acknowledgment; DOI fines.
- Stale quote — user binds expired quote id; coverage gap or disputed terms.
- Product line drift — auto knock-out logic copied to renters untested; silent wrong declination.
Probe quote_status, premium_cents, and bound_policy_id at each step—UI premium labels alone fail when rounding differs.
Complexity map
| Scenario | Edge case | Why tests break | Approach |
|---|---|---|---|
| Knockout step 4 | High risk | Still quote | Probe quote_status=declined |
| Rate table boundary | Age 65 vs 64 | Wrong tier | Fixture pair probe |
| Zip territorial | 90210 vs 10001 | Wrong factor | Seed rate rows |
| Bind vs quote-only | Agent handoff | Wrong status | Probe quote_status |
| Disclosure ack | Unchecked bind | Illegal bind | Probe ack timestamps |
| Quote expiry | clock past TTL | Should re-rate | clock + probe expired |
| Multi-vehicle | Partial add | Underpriced | Probe item count |
| Payment bind | Auth fail | Policy pending | Probe policy_state |
| E-sign bind | Signature order | Invalid policy | See legal vertical |
| Mid-flow save | Return later | Lost answers | Probe draft snapshot |
| Credit tier | External API mock | Flaky rate | Stub scoring probe |
| Regulatory variant | State forms | Wrong PDF | Probe form_id by state |
Rate fixture seed
await request.post('/api/test/seed-rating', {
data: {
runId,
productLine: 'auto',
tables: [
{ zip: '94105', age: 30, basePremiumCents: 12000 },
{ zip: '94105', age: 30, surcharge: 'DUIPrior', decline: true },
],
},
});
Step-by-step probe pattern
await page.goto('/quote/auto');
await fillDriverStep(page, { age: 30, zip: '94105' });
let q = await request.get(`/api/test/quote?runId=${runId}`).then(r => r.json());
expect(q.step).toBe('vehicle');
expect(q.premiumCents).toBeGreaterThan(0);
await fillVehicleStep(page, { vin: 'TESTVIN123' });
q = await request.get(`/api/test/quote?runId=${runId}`).then(r => r.json());
expect(q.step).toBe('coverage');
Knock-out negative
await fillDriverStep(page, { dui: true, zip: '94105' });
await page.getByRole('button', { name: 'Continue' }).click();
const q = await request.get(`/api/test/quote?runId=${runId}`).then(r => r.json());
expect(q.status).toBe('declined');
expect(q.boundPolicyId).toBeUndefined();
Manual session → SmartTest for wizards
Multi-step quote UIs are ideal for manual session capture:
- Agent walks auto + renters lines on staging with rate fixtures
- Convert each product_line path to SmartTest with shared rating seed
- Link
{ type: 'scenario', description: '#TS-<n>' }to the compliance matrix /testchimp evolvewhenquote_step × product_linegaps appear in TrueCoverage
See form validation for field-level negatives per step.
Bind and e-sign
Bind often triggers e-signature and payment (fintech vertical):
await page.getByRole('checkbox', { name: /disclosure/i }).check();
await page.getByRole('button', { name: 'Bind policy' }).click();
await expect.poll(async () =>
(await request.get(`/api/test/policy?runId=${runId}`)).json()
).toMatchObject({ state: 'bound', premiumCents: expect.any(Number) });
Requirement slices to cover
quote_step— driver, vehicle, coverage, disclosure, paymentproduct_line— auto, home, renters, life
CI checklist
- Rating seeds per product_line—not prod rate engine
- Knock-out negative per decline rule class
- Premium probe after each wizard step
- Disclosure acknowledgment timestamp in probe
- Quote expiry spec with Playwright clock
- Bind creates policy row—never UI confetti alone
Anti-patterns
| Anti-pattern | Why it fails | Better approach |
|---|---|---|
| Assert displayed premium string | Rounding/copy | premiumCents probe |
| One happy path all lines | Knock-out gaps | product_line matrix |
| Prod rating in CI | Nondeterministic | Fixture tables |
| Skip disclosure checkbox | Regulatory | ack probe |
| Full wizard every spec | Slow | Step seeds via API |
| Bind without e-sign probe | Invalid policy | envelope status |
Example scenario
Situation: Applicant with prior DUI answers honestly at driver step; should not reach bind.
Expected outcome: quote_status declined at step; no policy id; no payment captured.
Why UI-only automation breaks: Decline message shows but probe quote_status=quoted—agent binds manually by mistake.
- Arrange: Seed rating table declining DUIPrior for runId product auto.
- Act: Complete driver step with DUI yes; continue.
- Assert: Probe status declined; payment probe empty; audit knockout event.
TestChimp workflow: Compare quote_step × product_line prod funnel vs test; evolve step-4 knockouts.
Same Arrange/Act/Assert pattern as expired-coupon checkout.
Connect scenarios to your QA workflow
Capture business rules in markdown test plans and enforce them with seed routes and probe Assert. Link SmartTests with scenario annotations for requirement traceability. Use /testchimp test on PRs; /testchimp explore on SmartTest paths for non-functional gaps (ExploreChimp).
Related scenarios
- Form validation — wizard fields
- E-signatures — bind signatures
- Fintech web apps — premium payment
- Date/time/timezones — quote expiry
External references
Frequently asked questions
Multi-step quote wizards hard to maintain—how do manual sessions help?
Capture staging walkthrough per product_line, convert to SmartTests with shared rating seed and step probes. TrueCoverage quote_step × product_line shows gaps—run /testchimp evolve.
How do I test rating knock-outs?
Seed decline rules in test rating table, submit triggering answers, probe quote_status declined before bind—never UI message alone.
How do I verify premium at each step?
After each Continue, GET quote probe premiumCents and step index—compare to fixture expectation for zip/age boundaries.
Quote vs bind difference in tests?
Quote-only stops at quoted status without policy id; bind spec requires disclosure ack, payment/e-sign probes, and policy_state bound.
How do state-specific disclosures work?
Seed user garaging state, assert correct form_id in probe and checkbox labels optional; missing ack must block bind probe.
How do expired quotes behave?
Advance clock past quote TTL, attempt bind, probe expired status and forced re-rate flow.
Which product lines to prioritize in TrueCoverage?
Rank by prod quote_start volume per product_line; evolve undertested lines especially where knock-out rules differ.
Apply these patterns in your repo
Run `/testchimp init` to connect TestChimp to your repo, then `/testchimp test` on PRs to turn these patterns into maintained SmartTests. Use `/testchimp evolve` when you want to expand coverage as your app grows.