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
// @Scenario: QUOTE-KO-DUIto 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: 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.