Happy path / Lifecycle
Open Salesforce sync rules.
Organizer reviews active campaign count, import size cap, email uniqueness policy, Lead/Contact target, and field map readiness.
Repair invalid rules.
The UI blocks sync until required mappings and limit conflicts are resolved.
Save rules.
A single audit row records the rule revision and provider transaction id.
Failure modes
Expired token refresh
Expired token refreshes before rule validation retries.
429 backoff
Limit metadata reads back off with jitter.
Webhook replay
Rule callback replay is idempotent.
Schema drift
Unknown Salesforce field metadata does not crash mapping UI.
Missing credential
Re-auth CTA replaces stack traces.
Sandbox isolation
Mock fixture cannot validate against prod org metadata.
Audit row
Every rule validation writes one audit row.
Partial rollback
Failed mapping save rolls back or shows per-field outcomes.
Active campaign limit
Too many active campaigns blocks save with a count and remediation.
Import size cap
Oversized import is blocked before commit.
Lead vs Contact required
Sync cannot run until target object policy is explicit.
Parity gap
Gap panel remains until rule enforcement ships.
Stable test attributes
Visibility teeth. Rule status, errors, and gap marker must be visible when active.
| data-test | Where | Purpose |
|---|---|---|
salesforce-sync-rules-panel | sync rules | main surface |
salesforce-active-campaign-limit | sync rules | campaign limit |
salesforce-import-size-cap | sync rules | import cap |
salesforce-email-uniqueness-rule | sync rules | dedupe policy |
salesforce-lead-contact-selector | sync rules | target object |
salesforce-field-map-editor | sync rules | field mapping |
salesforce-sync-rules-save-cta | sync rules | save rules |
salesforce-sync-rules-gap-panel | sync rules | absent gap marker |
Agent test plan
- salesforce-sync-rules-opens
- salesforce-sync-rules-gap-probe
- oauth-refresh-on-expired-token
- rate-limit-backoff
- webhook-replay-idempotent
- schema-drift-degrades-gracefully
- missing-credential-graceful-error
- sandbox-vs-prod-isolation
- audit-log-row-per-sync
- partial-import-rollback
- active-campaign-limit-blocks
- import-size-cap-blocks
- lead-contact-required
- field-map-required