> flutter-testing
Write unit, widget, and integration tests with robots, widget keys, and Patrol in Flutter. Use when writing Flutter unit tests, widget tests, or integration tests with Patrol. (triggers: **/test/**.dart, **/integration_test/**.dart, **/robots/**.dart, lib/core/keys/**.dart, test, patrol, robot, WidgetKeys, patrolTest, blocTest, mocktail)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/flutter-testing?format=md"Flutter Testing Standards
Priority: P0 (CRITICAL)
Core Rules
- Test Pyramid: Unit > Widget > Integration.
- Naming:
should <behavior> when <condition>. - AAA: Arrange, Act, Assert in all tests.
- Shared Mocks:
test/shared/only — no local mocks. - File Placement:
_integration_test.dartONLY inintegration_test/. - Robot-First: ALL UI assertions/interactions via Robot pattern (e.g.,
CheckoutRobot) — never rawfind.*/expect()in test body.
Widget Testing & Mocking
- Setup: Use
TestWrapper.init()insetUpAllandtester.pumpLocalizedWidget(...). - Mocking: Use GetIt registration of Mock BLoCs in
setUpAllif created internally. Use blocTest for BLoC logic and whenListen for state transitions. - Stubbing: Always stub bloc.state and bloc.stream in
setUp. Prohibitany()/anyNamed(). - Async: Use settle: false for loading or stream states to verify mid-process transitions.
Robot Pattern
- All interactions and assertions belong in
*Robot(e.g.,expectFirstOrderVisible()). - Symmetric: every
expectXxxVisible()needs expectXxxNotVisible() pairs. - BaseRobot Centralization: Extract standard scrolling (
scrollDown,scrollToEnd) and screen visibility assertions (expectScreenVisible,expectScreenNotVisible) into a commonBaseRobotor parent class to avoid duplication. - Widget tests: include a
pumpScreen(bloc:, settle:)helper. - Widget Keys: Use WidgetKeys constants from
lib/core/keys/— never inlineKey('string').
Integration Testing
- Use patrolTest with IntegrationAuthHelper.loginOrSkip($) for authenticated flows.
- Use $.native.tap() or
$.native.*for native interactions (e.g., system dialogs). - Create a robot:
final robot = OrdersRobot($.tester)— share the same class as widget tests. - Only
$.native.*and navigation helpers may remain inline in the test body.
Anti-Patterns
- No inline Key: Use
WidgetKeysconstant. Noany(): Use typed matchers. - No local mocks: Use
test/shared/. No missing bloc stub: Stubstate+stream. - No test-body logic: Move
find.*/expect()to robot. No raw find in integration tests. - No
_integration_test.dartintest/: Rename or merge. - No unused imports: Remove
v_dlswhen robots handle assertions. Check Material import needs. - No happy-path-only: Add
Edge casesgroup. No one-sided assertions: AddexpectNotVisiblepairs. - No unchecked text casing: Verify
.toUpperCase(),.tr()in source.
> related_skills --same-repo
> common-store-changelog
Generate user-facing release notes for the Apple App Store and Google Play Store by collecting git history, triaging user-impacting changes, and drafting store-compliant changelogs. Enforces character limits (App Store ≤4000, Google Play ≤500), tone, and bullet format. Use when generating release notes, app store changelog, play store release, what's new, or version release notes for any mobile app. (triggers: generate changelog, app store notes, play store release, what's new, release notes, ve
> golang-tooling
Go developer toolchain — gopls LSP diagnostics, linting, formatting, and vet. Use when setting up Go tooling, running linters, or integrating gopls with Claude Code. (triggers: gopls, golangci-lint, golangci.yml, go vet, goimports, staticcheck, go tooling, go lint)
> common-ui-design
Design distinctive, production-grade frontend UI with bold aesthetic choices. Use when building web components, pages, interfaces, dashboards, or applications in any framework (React, Next.js, Angular, Vue, HTML/CSS). (triggers: build a page, create a component, design a dashboard, landing page, UI for, build a layout, make it look good, improve the design, build UI, create interface, design screen)
> common-owasp
OWASP Top 10 audit checklist for Web Applications (2021) and APIs (2023). Load during any security review, PR review, or codebase audit touching web, mobile backend, or API code. (triggers: security review, OWASP, broken access control, IDOR, BOLA, injection, broken auth, API review, authorization, access control)