design_test.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_test/flutter_test.dart';
  3. import 'package:rackpeek_mobile/design.dart';
  4. void main() {
  5. Widget wrap(Widget child) => MaterialApp(
  6. theme: scribeTheme(),
  7. home: Scaffold(body: child),
  8. );
  9. testWidgets('FilterPill renders its label and is tappable', (tester) async {
  10. var taps = 0;
  11. await tester.pumpStateful(wrap(
  12. FilterPill(label: 'Servers', selected: false, onTap: () => taps++),
  13. ));
  14. expect(find.text('Servers'), findsOneWidget);
  15. await tester.tap(find.text('Servers'));
  16. expect(taps, 1);
  17. });
  18. testWidgets('ScribeAction disables when busy or handler is null',
  19. (tester) async {
  20. // The busy spinner animates forever, so no pumpAndSettle here.
  21. await tester.pumpWidget(wrap(
  22. ScribeAction(label: 'Save', busy: true, onPressed: () {}),
  23. ));
  24. await tester.pump();
  25. final button = tester.widget<FilledButton>(find.byType(FilledButton));
  26. expect(button.onPressed, isNull);
  27. await tester.pumpStateful(wrap(
  28. ScribeAction(label: 'Save', onPressed: () {}),
  29. ));
  30. final enabled = tester.widget<FilledButton>(find.byType(FilledButton));
  31. expect(enabled.onPressed, isNotNull);
  32. });
  33. testWidgets('ScribeAction meets the 44pt target', (tester) async {
  34. await tester.pumpStateful(wrap(
  35. ScribeAction(label: 'Save', onPressed: () {}),
  36. ));
  37. final size = tester.getSize(find.byType(FilledButton));
  38. expect(size.height, greaterThanOrEqualTo(44));
  39. });
  40. testWidgets('InlineNotice shows error styling and retry', (tester) async {
  41. var retried = false;
  42. await tester.pumpStateful(wrap(
  43. InlineNotice(message: 'boom', isError: true, onRetry: () => retried = true),
  44. ));
  45. expect(find.text('boom'), findsOneWidget);
  46. await tester.tap(find.text('Retry'));
  47. expect(retried, isTrue);
  48. });
  49. testWidgets('CategoryMark renders its glyph', (tester) async {
  50. await tester.pumpStateful(wrap(const CategoryMark(icon: Icons.bolt)));
  51. expect(find.byIcon(Icons.bolt), findsOneWidget);
  52. });
  53. }
  54. extension on WidgetTester {
  55. Future<void> pumpStateful(Widget widget) async {
  56. await pumpWidget(widget);
  57. await pumpAndSettle();
  58. }
  59. }