Skip to content

Commit

Permalink
fix: Thermostats can have multiple traits and states so make sure tar…
Browse files Browse the repository at this point in the history
…get temp is returning the target temp state
  • Loading branch information
rlperez committed Jan 19, 2022
1 parent a3fb8a3 commit 8ffe24e
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 56 deletions.
15 changes: 12 additions & 3 deletions lib/providers/thermostat_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,16 @@ class ThermostatProvider extends DeviceProvider {
as ThermostatTrait?;
}

List<ThermostatTrait> getThermostatTraits() {
return deviceDetail?.traits
.whereType<ThermostatTrait>()
.toList(growable: false) ??
<ThermostatTrait>[];
}
Future<void> setPointAction(String deviceId, double temperature,
{SetPointActionFunction setPoint =
ThermostatRepository.setPointThermostat}) async {
return performAction<double>(temperature, () => thermostatTargetTemperature,
return performAction<double>(temperature, () => targetTemperature,
() => setPoint(_request, deviceId, temperature));
}

Expand All @@ -40,8 +46,11 @@ class ThermostatProvider extends DeviceProvider {
() => setMode(_request, deviceId, mode));
}

double get thermostatTargetTemperature =>
getThermostatTrait()?.state.value ?? 0;
double get targetTemperature => getThermostatTraits()
.firstWhere((trait) => trait.state is TargetTemperature,
orElse: () => ThermostatTrait(TargetTemperature(0.0)))
.state
.value;

@override
String get displayName => deviceDetail?.displayName ?? _DEFAULT_DISPLAY_NAME;
Expand Down
57 changes: 31 additions & 26 deletions test/components/modes_toolbar_test.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@
// in yonomi_device_widgets/test/components/modes_toolbar_test.dart.
// Do not manually edit this file.

import 'dart:async' as _i4;
import 'dart:ui' as _i9;
import 'dart:async' as _i5;
import 'dart:ui' as _i10;

import 'package:mockito/mockito.dart' as _i1;
import 'package:yonomi_device_widgets/providers/device_provider.dart' as _i7;
import 'package:yonomi_device_widgets/providers/device_provider.dart' as _i8;
import 'package:yonomi_device_widgets/providers/thermostat_provider.dart'
as _i2;
import 'package:yonomi_device_widgets/providers/widget_state.dart' as _i3;
import 'package:yonomi_platform_sdk/src/repository/devices/devices_repository.dart'
as _i8;
as _i9;
import 'package:yonomi_platform_sdk/src/repository/devices/thermostat_repository.dart'
as _i5;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
as _i6;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
as _i7;
import 'package:yonomi_platform_sdk/yonomi-sdk.dart' as _i4;

// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
Expand All @@ -35,9 +36,9 @@ class MockThermostatProvider extends _i1.Mock
}

@override
double get thermostatTargetTemperature =>
(super.noSuchMethod(Invocation.getter(#thermostatTargetTemperature),
returnValue: 0.0) as double);
double get targetTemperature => (super
.noSuchMethod(Invocation.getter(#targetTemperature), returnValue: 0.0)
as double);
@override
String get displayName =>
(super.noSuchMethod(Invocation.getter(#displayName), returnValue: '')
Expand Down Expand Up @@ -71,51 +72,55 @@ class MockThermostatProvider extends _i1.Mock
(super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false)
as bool);
@override
_i4.Future<void> setPointAction(String? deviceId, double? temperature,
List<_i4.ThermostatTrait> getThermostatTraits() =>
(super.noSuchMethod(Invocation.method(#getThermostatTraits, []),
returnValue: <_i4.ThermostatTrait>[]) as List<_i4.ThermostatTrait>);
@override
_i5.Future<void> setPointAction(String? deviceId, double? temperature,
{_i2.SetPointActionFunction? setPoint =
_i5.ThermostatRepository.setPointThermostat}) =>
_i6.ThermostatRepository.setPointThermostat}) =>
(super.noSuchMethod(
Invocation.method(
#setPointAction, [deviceId, temperature], {#setPoint: setPoint}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
_i4.Future<void> setThermostatMode(
String? deviceId, _i6.GThermostatMode? mode,
{_i2.SetModeFunction? setMode = _i5.ThermostatRepository.setMode}) =>
_i5.Future<void> setThermostatMode(
String? deviceId, _i7.GThermostatMode? mode,
{_i2.SetModeFunction? setMode = _i6.ThermostatRepository.setMode}) =>
(super.noSuchMethod(
Invocation.method(
#setThermostatMode, [deviceId, mode], {#setMode: setMode}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
_i4.Future<void> fetchData(
{_i7.GetDeviceDetailsMethod? getDetails =
_i8.DevicesRepository.getDeviceDetails}) =>
_i5.Future<void> fetchData(
{_i8.GetDeviceDetailsMethod? getDetails =
_i9.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#fetchData, [], {#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
void setErrorState(String? errorMsg) =>
super.noSuchMethod(Invocation.method(#setErrorState, [errorMsg]),
returnValueForMissingStub: null);
@override
_i4.Future<void> performAction<T>(
_i5.Future<void> performAction<T>(
T? desiredState, Function? getState, Function? action,
{_i7.GetDeviceDetailsMethod? getDetails =
_i8.DevicesRepository.getDeviceDetails}) =>
{_i8.GetDeviceDetailsMethod? getDetails =
_i9.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#performAction, [desiredState, getState, action],
{#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
void addListener(_i9.VoidCallback? listener) =>
void addListener(_i10.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null);
@override
void removeListener(_i9.VoidCallback? listener) =>
void removeListener(_i10.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
returnValueForMissingStub: null);
@override
Expand Down
2 changes: 1 addition & 1 deletion test/providers/thermostat_provider_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ void main() {
await thermostatProvider.fetchData(
getDetails: mockGetThermostatDetailsFunction);

expect(thermostatProvider.thermostatTargetTemperature, 23.1);
expect(thermostatProvider.targetTemperature, 23.1);
expect(thermostatProvider.displayName, 'someDisplayName');
expect(thermostatProvider.isLoading, equals(false));
expect(thermostatProvider.isInErrorState, equals(false));
Expand Down
57 changes: 31 additions & 26 deletions test/widgets/components/modes_toolbar_test.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@
// in yonomi_device_widgets/test/widgets/components/modes_toolbar_test.dart.
// Do not manually edit this file.

import 'dart:async' as _i4;
import 'dart:ui' as _i9;
import 'dart:async' as _i5;
import 'dart:ui' as _i10;

import 'package:mockito/mockito.dart' as _i1;
import 'package:yonomi_device_widgets/providers/device_provider.dart' as _i7;
import 'package:yonomi_device_widgets/providers/device_provider.dart' as _i8;
import 'package:yonomi_device_widgets/providers/thermostat_provider.dart'
as _i2;
import 'package:yonomi_device_widgets/providers/widget_state.dart' as _i3;
import 'package:yonomi_platform_sdk/src/repository/devices/devices_repository.dart'
as _i8;
as _i9;
import 'package:yonomi_platform_sdk/src/repository/devices/thermostat_repository.dart'
as _i5;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
as _i6;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
as _i7;
import 'package:yonomi_platform_sdk/yonomi-sdk.dart' as _i4;

// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
Expand All @@ -35,9 +36,9 @@ class MockThermostatProvider extends _i1.Mock
}

@override
double get thermostatTargetTemperature =>
(super.noSuchMethod(Invocation.getter(#thermostatTargetTemperature),
returnValue: 0.0) as double);
double get targetTemperature => (super
.noSuchMethod(Invocation.getter(#targetTemperature), returnValue: 0.0)
as double);
@override
String get displayName =>
(super.noSuchMethod(Invocation.getter(#displayName), returnValue: '')
Expand Down Expand Up @@ -71,51 +72,55 @@ class MockThermostatProvider extends _i1.Mock
(super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false)
as bool);
@override
_i4.Future<void> setPointAction(String? deviceId, double? temperature,
List<_i4.ThermostatTrait> getThermostatTraits() =>
(super.noSuchMethod(Invocation.method(#getThermostatTraits, []),
returnValue: <_i4.ThermostatTrait>[]) as List<_i4.ThermostatTrait>);
@override
_i5.Future<void> setPointAction(String? deviceId, double? temperature,
{_i2.SetPointActionFunction? setPoint =
_i5.ThermostatRepository.setPointThermostat}) =>
_i6.ThermostatRepository.setPointThermostat}) =>
(super.noSuchMethod(
Invocation.method(
#setPointAction, [deviceId, temperature], {#setPoint: setPoint}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
_i4.Future<void> setThermostatMode(
String? deviceId, _i6.GThermostatMode? mode,
{_i2.SetModeFunction? setMode = _i5.ThermostatRepository.setMode}) =>
_i5.Future<void> setThermostatMode(
String? deviceId, _i7.GThermostatMode? mode,
{_i2.SetModeFunction? setMode = _i6.ThermostatRepository.setMode}) =>
(super.noSuchMethod(
Invocation.method(
#setThermostatMode, [deviceId, mode], {#setMode: setMode}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
_i4.Future<void> fetchData(
{_i7.GetDeviceDetailsMethod? getDetails =
_i8.DevicesRepository.getDeviceDetails}) =>
_i5.Future<void> fetchData(
{_i8.GetDeviceDetailsMethod? getDetails =
_i9.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#fetchData, [], {#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
void setErrorState(String? errorMsg) =>
super.noSuchMethod(Invocation.method(#setErrorState, [errorMsg]),
returnValueForMissingStub: null);
@override
_i4.Future<void> performAction<T>(
_i5.Future<void> performAction<T>(
T? desiredState, Function? getState, Function? action,
{_i7.GetDeviceDetailsMethod? getDetails =
_i8.DevicesRepository.getDeviceDetails}) =>
{_i8.GetDeviceDetailsMethod? getDetails =
_i9.DevicesRepository.getDeviceDetails}) =>
(super.noSuchMethod(
Invocation.method(#performAction, [desiredState, getState, action],
{#getDetails: getDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
returnValueForMissingStub: Future<void>.value()) as _i5.Future<void>);
@override
void addListener(_i9.VoidCallback? listener) =>
void addListener(_i10.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null);
@override
void removeListener(_i9.VoidCallback? listener) =>
void removeListener(_i10.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
returnValueForMissingStub: null);
@override
Expand Down

0 comments on commit 8ffe24e

Please sign in to comment.