Skip to content

Commit

Permalink
feat: Scaffold for new color trait
Browse files Browse the repository at this point in the history
  • Loading branch information
rlperez committed Apr 20, 2022
1 parent 9e1daf8 commit 361420d
Show file tree
Hide file tree
Showing 10 changed files with 286 additions and 12 deletions.
9 changes: 9 additions & 0 deletions lib/providers/color_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:yonomi_device_widgets/providers/device_provider.dart';
import 'package:yonomi_platform_sdk/src/request/request.dart';

class ColorProvider extends DeviceProvider {
ColorProvider(Request request, String deviceId) : super(request, deviceId);

@override
String get displayName => 'COLOR';
}
12 changes: 12 additions & 0 deletions lib/traits/color_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';

class ColorWidget extends StatelessWidget {
ColorWidget(ColorProvider _colorProvider);

@override
Widget build(BuildContext context) {
// TODO: implement build
throw UnimplementedError();
}
}
3 changes: 2 additions & 1 deletion lib/traits/slim/battery_slim_widget.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/assets/traits/battery_level_icon.dart';
import 'package:yonomi_device_widgets/providers/battery_level_provider.dart';
import 'package:yonomi_device_widgets/traits/slim/base_slim_widget.dart';
import 'package:yonomi_device_widgets/ui/widget_style_constants.dart';

typedef CreateWidget = Widget Function(BuildContext context);

class BatterySlimWidget extends BaseSlimWidget {
BatterySlimWidget(_batteryLevelTraitProvider,
BatterySlimWidget(BatteryLevelProvider _batteryLevelTraitProvider,
{Color? backgroundColor, CreateWidget? createContent, Key? key})
: super(
provider: _batteryLevelTraitProvider,
Expand Down
12 changes: 12 additions & 0 deletions lib/traits/slim/color_slim_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_device_widgets/traits/slim/base_slim_widget.dart';

class ColorSlimWidget extends BaseSlimWidget {
ColorSlimWidget(ColorProvider _colorTraitProvider)
: super(
provider: _colorTraitProvider,
leftIcon: UnknownItemIcon(),
headerText: Text('Color'));
}
35 changes: 35 additions & 0 deletions test/mixins/color_testing.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

import 'color_testing.mocks.dart';

@GenerateMocks([ColorProvider])
mixin ColorTesting {
MockColorProvider mockColorProvider(TestColorDevice device) {
final mockColorProvider = MockColorProvider();
when(mockColorProvider.displayName).thenReturn(device.displayName);
when(mockColorProvider.deviceDetail).thenReturn(device);
return mockColorProvider;
}
}

class TestColorDevice extends Device {
TestColorDevice(Device device)
: super(
device.id,
device.displayName,
device.description,
device.manufacturerName,
device.model,
device.serialNumber,
device.createdAt,
device.updatedAt, [
...device.traits // .where((t) => t.runtimeType != ColorTrait)
]);

TestColorDevice withColor(param0) {
return this;
}
}
104 changes: 104 additions & 0 deletions test/mixins/color_testing.mocks.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Mocks generated by Mockito 5.0.15 from annotations
// in yonomi_device_widgets/test/mixins/color_testing.dart.
// Do not manually edit this file.

import 'dart:async' as _i4;
import 'dart:ui' as _i7;

import 'package:mockito/mockito.dart' as _i1;
import 'package:yonomi_device_widgets/providers/color_provider.dart' as _i2;
import 'package:yonomi_device_widgets/providers/device_provider.dart' as _i5;
import 'package:yonomi_device_widgets/providers/widget_state.dart' as _i3;
import 'package:yonomi_platform_sdk/src/repository/devices_repository.dart'
as _i6;

// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis

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

@override
String get displayName =>
(super.noSuchMethod(Invocation.getter(#displayName), returnValue: '')
as String);

get getColorState => null;
@override
set setState(_i3.WidgetState? newState) =>
super.noSuchMethod(Invocation.setter(#setState, newState),
returnValueForMissingStub: null);
@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 isBusy =>
(super.noSuchMethod(Invocation.getter(#isBusy), returnValue: false)
as bool);
@override
bool get isInErrorState => (super
.noSuchMethod(Invocation.getter(#isInErrorState), returnValue: false)
as bool);
@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
_i4.Future<void> fetchData(
{_i5.GetDeviceDetailsMethod? getDetails =
_i6.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#fetchData, [], {#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
@override
void setErrorState(String? errorMsg) =>
super.noSuchMethod(Invocation.method(#setErrorState, [errorMsg]),
returnValueForMissingStub: null);
@override
_i4.Future<void> performAction<T>(
T? desiredState, Function? getState, Function? action,
{_i5.GetDeviceDetailsMethod? getDetails =
_i6.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#performAction, [desiredState, getState, action],
{#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
@override
void addListener(_i7.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null);
@override
void removeListener(_i7.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();
}
18 changes: 18 additions & 0 deletions test/providers/color_provider_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:flutter_test/flutter_test.dart';

import '../mixins/color_testing.dart';
import '../mixins/device_testing.dart';

class BatteryLevelProviderTest with DeviceTesting, ColorTesting {}

void main() {
group('For ColorProvider', () {
test("""When loading device data, we are notified that it is loading
through isLoading.""", () async {});
test("""After successfully loading device data, should be in idle state
when done.""", () async {});
test("""When an error occurs loading device data, we are notified
an error occurred using isInErrorState and get
an error message with getErrorMessage.""", () async {});
});
}
51 changes: 51 additions & 0 deletions test/traits/color_widget_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_device_widgets/traits/color_widget.dart';

import '../mixins/color_testing.dart';
import '../mixins/device_testing.dart';

class ColorWidgetTest with DeviceTesting, ColorTesting {
MaterialApp createMaterialApp(ColorProvider mockColorProvider) {
return MaterialApp(
home: new Scaffold(body: Scaffold(body: ColorWidget(mockColorProvider))),
);
}
}

main() {
final test = ColorWidgetTest();
final colorDevice = TestColorDevice(test.device());

testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockColorProvider = test.mockColorProvider(colorDevice);
when(mockColorProvider.isLoading).thenReturn(true);

await tester.pumpWidget(test.createMaterialApp(mockColorProvider));

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

testWidgets('When performing action, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockColorProvider = test.mockColorProvider(colorDevice);
when(mockColorProvider.isPerformingAction).thenReturn(true);

await tester.pumpWidget(test.createMaterialApp(mockColorProvider));

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

testWidgets('When color widget is in error, should show error icon',
(WidgetTester tester) async {
final mockColorProvider = test.mockColorProvider(colorDevice);
when(mockColorProvider.isInErrorState).thenReturn(true);

await tester.pumpWidget(test.createMaterialApp(mockColorProvider));

expect(find.byIcon(Icons.error), findsOneWidget);
});
}
11 changes: 0 additions & 11 deletions test/traits/slim/brightness_slim_widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,6 @@ void main() {
expect(find.byType(CircularProgressIndicator), findsOneWidget);
});

testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockBrightnessProvider =
test.mockBrightnessProvider(brightnessDevice);
when(mockBrightnessProvider.isLoading).thenReturn(true);

await tester.pumpWidget(createMaterialApp(mockBrightnessProvider));

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

testWidgets('When slider moved, should execute call for brightness change ',
(WidgetTester tester) async {
final mockBrightnessProvider =
Expand Down
43 changes: 43 additions & 0 deletions test/traits/slim/color_slim_widget_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_device_widgets/traits/slim/color_slim_widget.dart';

import '../../mixins/color_testing.dart';
import '../../mixins/device_testing.dart';

class ColorSlimWidgetTest with DeviceTesting, ColorTesting {
MaterialApp createMaterialApp(ColorProvider mockColorProvider) {
return MaterialApp(
home: new Scaffold(
body: Scaffold(body: ColorSlimWidget(mockColorProvider))),
);
}
}

void main() {
final test = ColorSlimWidgetTest();
final colorDevice = TestColorDevice(test.device());

testWidgets('When loading, should show CircularProgressIndicator ',
(WidgetTester tester) async {
final mockColorProvider = test.mockColorProvider(colorDevice);
when(mockColorProvider.isLoading).thenReturn(true);

await tester.pumpWidget(test.createMaterialApp(mockColorProvider));

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

testWidgets(
'When widget color state value is null, should call provider for color',
(WidgetTester tester) async {
final mockColorProvider =
test.mockColorProvider(colorDevice.withColor(null));

await tester.pumpWidget(test.createMaterialApp(mockColorProvider));

verify(mockColorProvider.getColorState).called(2);
});
}

0 comments on commit 361420d

Please sign in to comment.