Skip to content

Commit

Permalink
feat(power_widget): handle loading, error and normal UI states for Po…
Browse files Browse the repository at this point in the history
…werWidget
  • Loading branch information
ses110 committed Dec 16, 2021
1 parent 428e485 commit 90cfe2c
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 13 deletions.
28 changes: 25 additions & 3 deletions lib/traits/power_widget.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
Expand All @@ -9,8 +10,29 @@ class PowerWidget extends StatelessWidget {

@override
Widget build(BuildContext context) {
return powerTraitProvider.isBusy
? CircularProgressIndicator()
: Text("PowerWidget");
if (powerTraitProvider.isBusy) {
print("In Busy State");
return CircularProgressIndicator();
} else if (powerTraitProvider.isInErrorState) {
print("In Error State");
_showToast(context, powerTraitProvider.getErrorMessage);
return Icon(Icons.error);
} else {
print("Show Switch with its state");
return CupertinoSwitch(
value: powerTraitProvider.getOnOffState,
onChanged: (bool onOff) {
print('turned ${(onOff) ? 'on' : 'off'}');
powerTraitProvider.sendPowerOnOffAction(onOff);
},
);
}
}

void _showToast(BuildContext context, String message) {
WidgetsBinding.instance!
.addPostFrameCallback((_) => ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message)),
));
}
}
7 changes: 6 additions & 1 deletion test/traits/detail_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,13 @@ Widget createDetailScreenWidgetForTrait(
when(mockLockProvider.loadingAction).thenReturn(false);
when(mockLockProvider.isLocked).thenReturn(false);

PowerTraitProvider mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(false);
when(mockPowerTraitProvider.isInErrorState).thenReturn(false);
when(mockPowerTraitProvider.getOnOffState).thenReturn(false);

return createMaterialApp(req, deviceId, mockTraitDetailProvider,
mockLockProvider, MockPowerTraitProvider());
mockLockProvider, mockPowerTraitProvider);
}

MaterialApp createMaterialApp(
Expand Down
75 changes: 66 additions & 9 deletions test/traits/power_widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,71 @@ MaterialApp createMaterialApp(PowerTraitProvider mockPowerProvider) {

@GenerateMocks([PowerTraitProvider])
void main() {
testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(true);
// when(mockPowerTraitProvider.loadingAction).thenReturn(false);
await tester.pumpWidget(createMaterialApp(mockPowerTraitProvider));

expect(find.byType(CircularProgressIndicator), findsOneWidget);
expect(find.byType(CupertinoSwitch), findsNothing);
group("For PowerWidget, ", () {
testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(true);
await tester.pumpWidget(createMaterialApp(mockPowerTraitProvider));

expect(find.byType(CircularProgressIndicator), findsOneWidget);
expect(find.byType(CupertinoSwitch), findsNothing);
});

testWidgets('When an error occurs, should show some kind of error',
(WidgetTester tester) async {
WidgetsFlutterBinding.ensureInitialized();

String errorMessage = "An error occurred";
final mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(false);
when(mockPowerTraitProvider.isInErrorState).thenReturn(true);
when(mockPowerTraitProvider.getErrorMessage).thenReturn(errorMessage);

// tester.binding.scheduleFrame();
await tester.pumpWidget(createMaterialApp(mockPowerTraitProvider));

await tester.pump(const Duration(milliseconds: 750));

expect(find.byType(CircularProgressIndicator), findsNothing);
expect(find.byIcon(Icons.error), findsOneWidget);
// expect(find.text(errorMessage), findsOneWidget);
});

testWidgets('Should show a Switch widget with On state if device is On',
(WidgetTester tester) async {
final mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(false);
when(mockPowerTraitProvider.isInErrorState).thenReturn(false);
when(mockPowerTraitProvider.getOnOffState).thenReturn(false);

await tester.pumpWidget(createMaterialApp(mockPowerTraitProvider));

expect(find.byType(CircularProgressIndicator), findsNothing);
expect(find.byType(CupertinoSwitch), findsOneWidget);
expect(
find.byWidgetPredicate(
(widget) => widget is CupertinoSwitch && widget.value == false,
description: 'Switch is Off'),
findsOneWidget);
});

testWidgets('Should show a Switch widget with Off state if device is Off',
(WidgetTester tester) async {
final mockPowerTraitProvider = MockPowerTraitProvider();
when(mockPowerTraitProvider.isBusy).thenReturn(false);
when(mockPowerTraitProvider.isInErrorState).thenReturn(false);
when(mockPowerTraitProvider.getOnOffState).thenReturn(true);

await tester.pumpWidget(createMaterialApp(mockPowerTraitProvider));

expect(find.byType(CircularProgressIndicator), findsNothing);
expect(find.byType(CupertinoSwitch), findsOneWidget);
expect(
find.byWidgetPredicate(
(widget) => widget is CupertinoSwitch && widget.value == true,
description: 'Switch is On'),
findsOneWidget);
});
});
}

0 comments on commit 90cfe2c

Please sign in to comment.