Skip to content

Commit

Permalink
feat(detail_screen): handle PowerTrait and render a Power widget
Browse files Browse the repository at this point in the history
  • Loading branch information
ses110 committed Dec 13, 2021
1 parent f4b4643 commit 650c487
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 18 deletions.
11 changes: 11 additions & 0 deletions lib/traits/detail_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart';
import 'package:yonomi_device_widgets/providers/lock_provider.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/providers/trait_detail_provider.dart';
import 'package:yonomi_device_widgets/traits/lock.dart';
import 'package:yonomi_device_widgets/traits/power_widget.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

class DetailScreen extends StatelessWidget {
Expand All @@ -21,6 +23,8 @@ class DetailScreen extends StatelessWidget {
create: (context) => TraitDetailProvider(request, deviceId)),
ChangeNotifierProvider(
create: (context) => LockProvider(request, deviceId)),
ChangeNotifierProvider(
create: (context) => PowerTraitProvider(request, deviceId)),
],
child: DetailScreenWidget(request, deviceId),
);
Expand Down Expand Up @@ -72,6 +76,13 @@ class DetailScreenWidget extends StatelessWidget {
child: LockWidget(lockProvider),
);
});
case 'power':
return Consumer<PowerTraitProvider>(builder: (_, powerProvider, child) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: PowerWidget(),
);
});
default:
return Padding(
padding: const EdgeInsets.all(8.0),
Expand Down
8 changes: 8 additions & 0 deletions lib/traits/power_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:flutter/widgets.dart';

class PowerWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text("PowerWidget");
}
}
2 changes: 1 addition & 1 deletion test/providers/power_trait_provider_test.mocks.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Mocks generated by Mockito 5.0.15 from annotations
// in yonomi_device_widgets/test/providers/power_provider_test.dart.
// in yonomi_device_widgets/test/providers/power_trait_provider_test.dart.
// Do not manually edit this file.

import 'dart:async' as _i4;
Expand Down
49 changes: 36 additions & 13 deletions test/traits/detail_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart';
import 'package:yonomi_device_widgets/providers/lock_provider.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/providers/trait_detail_provider.dart';
import 'package:yonomi_device_widgets/traits/detail_screen.dart';
import 'package:yonomi_device_widgets/traits/lock.dart';
import 'package:yonomi_device_widgets/traits/power_widget.dart';
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

Expand All @@ -28,8 +30,8 @@ Widget createDetailScreenWhenLoading(

LockProvider mockLockProvider = MockLockProvider();

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

Widget createDetailScreenWidgetForTrait(
Expand All @@ -46,24 +48,34 @@ Widget createDetailScreenWidgetForTrait(
when(mockLockProvider.loadingAction).thenReturn(false);
when(mockLockProvider.isLocked).thenReturn(false);

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

MaterialApp createMaterialApp(TraitDetailProvider mockTraitBasedNotifier,
LockProvider mockLockProvider, Request req, String deviceId) {
MaterialApp createMaterialApp(
Request req,
String deviceId,
TraitDetailProvider mockTraitBasedNotifier,
LockProvider mockLockProvider,
PowerTraitProvider mockPowerTrait) {
return MaterialApp(
home: Column(children: [
MultiProvider(providers: [
ChangeNotifierProvider<TraitDetailProvider>.value(
value: mockTraitBasedNotifier),
ChangeNotifierProvider<LockProvider>.value(value: mockLockProvider),
], child: DetailScreenWidget(req, deviceId)),
MultiProvider(
providers: [
ChangeNotifierProvider<TraitDetailProvider>.value(
value: mockTraitBasedNotifier),
ChangeNotifierProvider<LockProvider>.value(value: mockLockProvider),
ChangeNotifierProvider<PowerTraitProvider>.value(
value: mockPowerTrait),
],
child: DetailScreenWidget(req, deviceId),
),
]),
);
}

@GenerateMocks([TraitDetailProvider, LockProvider, BuildContext])
@GenerateMocks(
[TraitDetailProvider, LockProvider, PowerTraitProvider, BuildContext])
void main() {
testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
Expand All @@ -72,7 +84,7 @@ void main() {
expect(find.byType(CircularProgressIndicator), findsOneWidget);
});

testWidgets('For the LockTrait, Detail screen should show the LockWidget ',
testWidgets('For the Lock Trait, Detail screen should show the LockWidget ',
(WidgetTester tester) async {
Request request = Request('', {});
final String testedDeviceId = "";
Expand All @@ -82,6 +94,17 @@ void main() {
expect(find.byType(LockWidget), findsOneWidget);
});

testWidgets(
'For the Power Trait, Detail screen should show the Power Widget ',
(WidgetTester tester) async {
Request request = Request('', {});
final String testedDeviceId = "";
await tester.pumpWidget(createDetailScreenWidgetForTrait(
PowerTrait("power", IsOnOff(true)), request, testedDeviceId));

expect(find.byType(PowerWidget), findsOneWidget);
});

testWidgets(
'For any Unknown/Unsupported Trait, Detail screen should show the UnknownItemIcon widget',
(WidgetTester tester) async {
Expand Down
95 changes: 91 additions & 4 deletions test/traits/detail_screen_test.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@ import 'package:flutter/material.dart' as _i3;
import 'package:flutter/src/foundation/diagnostics.dart' as _i4;
import 'package:mockito/mockito.dart' as _i1;
import 'package:yonomi_device_widgets/providers/lock_provider.dart' as _i9;
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart'
as _i11;
import 'package:yonomi_device_widgets/providers/trait_detail_provider.dart'
as _i5;
import 'package:yonomi_platform_sdk/src/repository/devices/devices_repository.dart'
as _i7;
import 'package:yonomi_platform_sdk/src/repository/traits/lock_repository.dart'
as _i10;
import 'package:yonomi_platform_sdk/src/repository/traits/power_repository.dart'
as _i12;
import 'package:yonomi_platform_sdk/yonomi-sdk.dart' as _i2;

// ignore_for_file: avoid_redundant_argument_values
Expand Down Expand Up @@ -58,10 +62,6 @@ class MockTraitDetailProvider extends _i1.Mock
_i1.throwOnMissingStub(this);
}

@override
set setLoading(bool? newLoading) =>
super.noSuchMethod(Invocation.setter(#setLoading, newLoading),
returnValueForMissingStub: null);
@override
bool get isLoading =>
(super.noSuchMethod(Invocation.getter(#isLoading), returnValue: false)
Expand Down Expand Up @@ -175,6 +175,93 @@ class MockLockProvider extends _i1.Mock implements _i9.LockProvider {
String toString() => super.toString();
}

/// A class which mocks [PowerTraitProvider].
///
/// See the documentation for Mockito's code generation for more information.
class MockPowerTraitProvider extends _i1.Mock
implements _i11.PowerTraitProvider {
MockPowerTraitProvider() {
_i1.throwOnMissingStub(this);
}

@override
int get MAX_RETRIES =>
(super.noSuchMethod(Invocation.getter(#MAX_RETRIES), returnValue: 0)
as int);
@override
int get RETRY_DELAY_MS =>
(super.noSuchMethod(Invocation.getter(#RETRY_DELAY_MS), returnValue: 0)
as int);
@override
bool get getOnOffState =>
(super.noSuchMethod(Invocation.getter(#getOnOffState), returnValue: false)
as bool);
@override
bool get isBusy =>
(super.noSuchMethod(Invocation.getter(#isBusy), returnValue: false)
as bool);
@override
bool get isLoading =>
(super.noSuchMethod(Invocation.getter(#isLoading), returnValue: false)
as bool);
@override
bool get isPerformingAction =>
(super.noSuchMethod(Invocation.getter(#isPerformingAction),
returnValue: false) as bool);
@override
bool get isInErrorState => (super
.noSuchMethod(Invocation.getter(#isInErrorState), returnValue: false)
as bool);
@override
set setErrorMessage(String? errorMsg) =>
super.noSuchMethod(Invocation.setter(#setErrorMessage, errorMsg),
returnValueForMissingStub: null);
@override
String get getErrorMessage =>
(super.noSuchMethod(Invocation.getter(#getErrorMessage), returnValue: '')
as String);
@override
bool get hasListeners =>
(super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false)
as bool);
@override
_i6.Future<_i2.Device?> fetchData(
{_i11.GetDeviceDetailsMethod? getDeviceDetails =
_i7.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(
#fetchData, [], {#getDeviceDetails: getDeviceDetails}),
returnValue: Future<_i2.Device?>.value()) as _i6.Future<_i2.Device?>);
@override
_i6.Future<void> sendPowerOnOffAction(bool? desiredOnOffState,
{_i11.GetDeviceDetailsMethod? getDetails =
_i7.DevicesRepository.getDeviceDetails,
_i11.SendPowerMethod? sendPowerMethod =
_i12.PowerRepository.sendPowerAction}) =>
(super.noSuchMethod(
Invocation.method(#sendPowerOnOffAction, [desiredOnOffState],
{#getDetails: getDetails, #sendPowerMethod: sendPowerMethod}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i6.Future<void>);
@override
void addListener(_i8.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null);
@override
void removeListener(_i8.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
returnValueForMissingStub: null);
@override
void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
returnValueForMissingStub: null);
@override
void notifyListeners() =>
super.noSuchMethod(Invocation.method(#notifyListeners, []),
returnValueForMissingStub: null);
@override
String toString() => super.toString();
}

/// A class which mocks [BuildContext].
///
/// See the documentation for Mockito's code generation for more information.
Expand Down

0 comments on commit 650c487

Please sign in to comment.