high priority medium complexity testing pending testing specialist Tier 7

Acceptance Criteria

Widget tests exist for IntegrationConfigDashboard covering: card renders with correct integration name/type, status badge displays 'active'/'inactive'/'error' states with correct colors, tapping a card emits the correct navigation/selection event
Widget tests for CredentialManagementForm cover: password fields are masked by default, show/hide toggle reveals and re-masks text, form submits only when all required fields are non-empty, error text renders below invalid fields
Widget tests for FieldMappingEditor cover: 'Add Row' button appends a new mapping row, 'Remove' button on a row deletes it, validation error appears when source or destination field is empty, duplicate destination fields produce an inline error
Widget tests for SyncScheduleConfiguration cover: each frequency option (hourly, daily, weekly, manual) is selectable, only one option can be active at a time, selecting a frequency emits the correct value to the parent widget
Widget tests for ExcludedFeaturesConfigPanel cover: each feature toggle starts in its persisted state, toggling on/off updates local state immediately, saving emits the updated exclusion list
Integration tests cover the complete wizard flow from step 1 (select integration type) through final confirmation, including back-navigation preserving previously entered data
All widget tests use flutter_test's WidgetTester and do not require a live Supabase connection (all service dependencies are mocked)
Test file naming follows pattern: <widget_name>_test.dart co-located in test/ mirroring the lib/ structure
All tests pass in CI with flutter test --coverage and coverage for tested widgets is ≥ 80%

Technical Requirements

frameworks
Flutter
flutter_test
mockito or mocktail for mocking
data models
IntegrationConfig
CredentialEntry
FieldMapping
SyncSchedule
ExcludedFeature
performance requirements
Each widget test must complete in under 2 seconds
Full test suite must complete in under 60 seconds on CI
security requirements
No real API keys or credentials must appear in test fixtures — use clearly fake placeholder strings
Credential masking behavior must be explicitly tested and must never expose secrets in widget tree
ui components
IntegrationConfigDashboard
CredentialManagementForm
FieldMappingEditor
SyncScheduleConfiguration
ExcludedFeaturesConfigPanel
IntegrationSetupWizard

Execution Context

Execution Tier
Tier 7

Tier 7 - 84 tasks

Can start after Tier 6 completes

Integration Task

Handles integration between different epics or system components. Requires coordination across multiple development streams.

Implementation Notes

Wrap widgets under test in a MaterialApp with the app's design token theme so design-system-dependent rendering does not cause RenderFlex overflows in tests. For BLoC-based components, wrap with BlocProvider and seed initial state explicitly rather than relying on real initialization. For Riverpod-based components, use ProviderScope with overrides. Test the wizard flow by pumping the root wizard widget and simulating taps through each step — avoid testing each step widget in isolation for the integration test.

For credential masking, assert obscureText: true on the TextField before toggle and obscureText: false after.

Testing Requirements

Use flutter_test WidgetTester for all widget-level tests. Mock all external service dependencies (Supabase, BLoC/Riverpod providers) using mocktail or mockito. Write a separate integration_test/ file for the end-to-end wizard flow using flutter_test's integration test runner. Aim for ≥ 80% line coverage on the five tested widgets.

Test both happy paths and failure/edge-case paths (empty state, validation error, credential reveal/hide). Use pumpAndSettle after state changes to ensure widget tree is stable before asserting.

Epic Risks (4)
medium impact high prob technical

The multi-step Integration Setup Wizard must render different credential fields, field mapping targets, and validation rules depending on the selected integration type. If the type-specific branching logic is implemented as conditional widget trees rather than driven by the Integration Type Registry, the wizard becomes unmaintainable and adding new integration types requires UI code changes.

Mitigation & Contingency

Mitigation: Design the wizard to be metadata-driven from the Integration Type Registry from day one. Credential form fields, required field validation, and mapping target lists are all fetched from the registry, not hardcoded in widgets. Implement one integration type end-to-end first (Xledger) to validate the pattern before building the others.

Contingency: If the metadata-driven approach proves too complex for the initial delivery, implement Xledger and Dynamics as hardcoded wizard variants and create a registry-driven refactor as a follow-up technical debt ticket with a fixed deadline.

medium impact medium prob dependency

The Excluded Features Configuration Panel must wire directly into the feature flag system to suppress HLF app features. If the feature flag system does not yet expose a writable admin interface, this panel cannot save its configuration, blocking the HLF-specific acceptance criteria.

Mitigation & Contingency

Mitigation: Verify that the Organization-scoped Feature Flags feature (a declared dependency) exposes a Dart API for programmatic flag writes before starting this panel. Coordinate with the feature flags team to ensure the write API is available. If needed, schedule this panel as the last item in the epic.

Contingency: If the feature flag write API is unavailable at implementation time, store excluded features in the integration's JSONB settings column and wire them into a local feature flag provider that merges database state with the standard flag system at app startup.

high impact medium prob scope

The Field Mapping Editor's usability for non-technical org admins is high-risk. If the visual mapping interface is confusing, admins will configure incorrect mappings that cause silent data corruption in accounting exports — a serious financial risk discovered only at month-end reconciliation.

Mitigation & Contingency

Mitigation: Conduct usability testing with at least one admin user from Blindeforbundet on the field mapping editor prototype before full implementation. Provide descriptive labels and sample data values for all fields. Add a 'test mapping' preview that shows a transformed sample record before saving.

Contingency: If usability testing reveals the visual editor is too complex, implement a simplified list-based mapping editor (select app field → select external field, one row at a time) as a fallback, deferring the drag-and-drop visual editor to a future iteration.

medium impact medium prob technical

The Credential Management Form's masked fields and connection-test flow may conflict with screen reader requirements — VoiceOver and JAWS must be able to navigate the form, understand which fields are already configured, and receive feedback on connection test results without exposing credential values in accessible text.

Mitigation & Contingency

Mitigation: Design accessible semantics labels for masked fields (e.g., 'API key: configured, last 4 characters: abcd') from the start. Use Flutter's Semantics widget to provide screen-reader-specific text that differs from visual display. Test with VoiceOver on iOS and TalkBack on Android during development, not only at QA.

Contingency: If accessibility conflicts with security requirements for the credential form, implement a separate 'accessibility mode' flow where credential configuration is done through a separate confirmation step that provides more explicit semantic feedback without risk of value exposure.