Skip to content

Commit

Permalink
fix: injection method non nullable
Browse files Browse the repository at this point in the history
  • Loading branch information
Suraj Adhikari committed Nov 18, 2021
1 parent ce6b92f commit ba7aeff
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 67 deletions.
41 changes: 18 additions & 23 deletions lib/providers/lock_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,65 +2,60 @@ import 'package:flutter/cupertino.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

typedef GetLockDetailsFunction = Future<Device> Function(
Request? request, String? id);
Request request, String id);

typedef SendLockUnlockFunction = Future<void> Function(
Request? request, String? id, bool lockUnlock);
Request request, String id, bool lockUnlock);

class LockProvider extends ChangeNotifier {
bool loadingDetail = false;
bool loadingAction = false;

LockProvider(Request request, String deviceId,
{GetLockDetailsFunction? injectLockDetailsMethod}) {
{GetLockDetailsFunction getLockDetails =
DevicesRepository.getLockDetails}) {
_request = request;
getDeviceDetail(deviceId, injectLockDetailsMethod: injectLockDetailsMethod);
getDeviceDetail(deviceId, getLockDetails: getLockDetails);
}

Request? _request;
late Request _request;
Device? _deviceDetail;

Device? get deviceDetail => _deviceDetail;

bool get isLocked => getLockTrait()?.state?.value ?? false;
bool get isLocked => getLockTrait()?.state.value ?? false;

LockTrait? getLockTrait() {
return _deviceDetail?.traits?.first as LockTrait?;
return _deviceDetail?.traits.first as LockTrait?;
}

Future<void> getDeviceDetail(String deviceId,
{GetLockDetailsFunction? injectLockDetailsMethod}) async {
final getLockDetailsMethod =
injectLockDetailsMethod ?? DevicesRepository.getLockDetails as Future<Device> Function(Request?, String);

{GetLockDetailsFunction getLockDetails =
DevicesRepository.getLockDetails}) async {
loadingDetail = true;
notifyListeners();

_deviceDetail = await getLockDetailsMethod(_request, deviceId);
_deviceDetail = await getLockDetails(_request, deviceId);

loadingDetail = false;
notifyListeners();
}

Future<void> setLockUnlockAction(String? deviceId, bool setLock,
{GetLockDetailsFunction? injectLockDetailsMethod,
SendLockUnlockFunction? injectSendLockUnlockMethod}) async {
final getLockDetailsMethod =
injectLockDetailsMethod ?? DevicesRepository.getLockDetails as Future<Device> Function(Request?, String?);
final sendLockUnlockMethod =
injectSendLockUnlockMethod ?? LockRepository.sendLockUnlockAction as Future<void> Function(Request?, String?, bool);

Future<void> setLockUnlockAction(String deviceId, bool setLock,
{GetLockDetailsFunction lockDetails = DevicesRepository.getLockDetails,
SendLockUnlockFunction sendLockUnlock =
LockRepository.sendLockUnlockAction}) async {
if (!loadingAction) {
loadingAction = true;

notifyListeners();

await sendLockUnlockMethod(_request, deviceId, setLock);
await sendLockUnlock(_request, deviceId, setLock);

var maxRetries = 0;
while (getLockTrait()?.state?.value != setLock && maxRetries < 10) {
while (getLockTrait()?.state.value != setLock && maxRetries < 10) {
// Wait more time
_deviceDetail = await getLockDetailsMethod(_request, deviceId);
_deviceDetail = await lockDetails(_request, deviceId);
await Future.delayed(Duration(milliseconds: 750));
maxRetries++;
}
Expand Down
26 changes: 12 additions & 14 deletions lib/providers/thermostat_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ typedef GetThermostatDetailsFunction = Future<Device> Function(

class ThermostatProvider extends ChangeNotifier {
ThermostatProvider(Request request, String deviceId,
{GetThermostatDetailsFunction? injectGetThermostatDetailsMethod}) {
{GetThermostatDetailsFunction injectGetThermostatDetailsMethod =
DevicesRepository.getThermostatDetails}) {
this._request = request;
getDeviceDetail(deviceId,
injectGetThermostatDetailsMethod: injectGetThermostatDetailsMethod);
getThermostatDetails: injectGetThermostatDetailsMethod);
}

late Request _request;
Expand All @@ -29,23 +30,20 @@ class ThermostatProvider extends ChangeNotifier {
}

Future<void> setPointAction(String deviceId, double temperature,
{SetPointActionFunction? injectSetPointThermostatMethod}) async {
final setPointThermostatMethod = injectSetPointThermostatMethod ??
ThermostatRepository.setPointThermostat;
setPointThermostatMethod(_request, deviceId, temperature);
{SetPointActionFunction setPoint =
ThermostatRepository.setPointThermostat}) async {
setPoint(_request, deviceId, temperature);
}

Future<void> setThermostatMode(String? deviceId, GThermostatMode mode,
{SetModeFunction? injectSetModeMethod}) async {
final setModeMethod = injectSetModeMethod ?? ThermostatRepository.setMode;
setModeMethod(_request, deviceId!, mode);
Future<void> setThermostatMode(String deviceId, GThermostatMode mode,
{SetModeFunction setMode = ThermostatRepository.setMode}) async {
setMode(_request, deviceId, mode);
}

Future<void> getDeviceDetail(String deviceId,
{GetThermostatDetailsFunction? injectGetThermostatDetailsMethod}) async {
final getThermostatDetailsMethod = injectGetThermostatDetailsMethod ??
DevicesRepository.getThermostatDetails;
_deviceDetail = await getThermostatDetailsMethod(_request, deviceId);
{GetThermostatDetailsFunction getThermostatDetails =
DevicesRepository.getThermostatDetails}) async {
_deviceDetail = await getThermostatDetails(_request, deviceId);
notifyListeners();
}

Expand Down
16 changes: 8 additions & 8 deletions test/providers/lock_provider_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.doc
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

class MockGetLockDetailsFunction extends Mock {
Future<Device> call(Request? request, String? id);
Future<void> call(Request? request, String? id);
}

class MockSendLockUnlockFunction extends Mock {
Expand All @@ -23,11 +23,11 @@ void main() {
MockSendLockUnlockFunction() as Future<void> Function(
Request?, String?, bool?);
LockProvider lockProvider = LockProvider(request, "deviceId",
injectLockDetailsMethod: mockLockDetailsMethod);
getLockDetails: mockLockDetailsMethod);

await lockProvider.setLockUnlockAction("deviceId", true,
injectLockDetailsMethod: mockLockDetailsMethod,
injectSendLockUnlockMethod: mockSendLockUnlockMethod);
lockDetails: mockLockDetailsMethod,
sendLockUnlock: mockSendLockUnlockMethod);

verify(mockSendLockUnlockMethod(any, any, false)).called(1);
});
Expand All @@ -37,10 +37,10 @@ void main() {
GetLockDetailsFunction mockLockDetailsMethod = MockGetLockDetailsFunction()
as Future<Device> Function(Request?, String?);
LockProvider lockProvider = LockProvider(request, "deviceId",
injectLockDetailsMethod: mockLockDetailsMethod);
getLockDetails: mockLockDetailsMethod);

await lockProvider.getDeviceDetail("test",
injectLockDetailsMethod: mockLockDetailsMethod);
getLockDetails: mockLockDetailsMethod);

verify(mockLockDetailsMethod(any, any)).called(2);
});
Expand All @@ -64,10 +64,10 @@ void main() {
),
));
LockProvider lockProvider = LockProvider(request, "deviceId",
injectLockDetailsMethod: mockLockDetailsMethod);
getLockDetails: mockLockDetailsMethod);

await lockProvider.getDeviceDetail("test",
injectLockDetailsMethod: mockLockDetailsMethod);
getLockDetails: mockLockDetailsMethod);

expect(lockProvider.deviceDetail?.displayName, "someDisplayName");
});
Expand Down
42 changes: 20 additions & 22 deletions test/widgets/components/modes_toolbar_test.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
// Do not manually edit this file.

import 'dart:async' as _i3;
import 'dart:ui' as _i5;
import 'dart:ui' as _i7;

import 'package:mockito/mockito.dart' as _i1;
import 'package:yonomi_device_widgets/providers/thermostat_provider.dart'
as _i2;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
import 'package:yonomi_platform_sdk/src/repository/devices/devices_repository.dart'
as _i6;
import 'package:yonomi_platform_sdk/src/repository/devices/thermostat_repository.dart'
as _i4;
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart'
as _i5;

// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
Expand Down Expand Up @@ -38,43 +42,37 @@ class MockThermostatProvider extends _i1.Mock
as bool);
@override
_i3.Future<void> setPointAction(String? deviceId, double? temperature,
{_i2.SetPointActionFunction? injectSetPointThermostatMethod}) =>
{_i2.SetPointActionFunction? setPoint =
_i4.ThermostatRepository.setPointThermostat}) =>
(super.noSuchMethod(
Invocation.method(#setPointAction, [
deviceId,
temperature
], {
#injectSetPointThermostatMethod: injectSetPointThermostatMethod
}),
Invocation.method(
#setPointAction, [deviceId, temperature], {#setPoint: setPoint}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i3.Future<void>);
@override
_i3.Future<void> setThermostatMode(
String? deviceId, _i4.GThermostatMode? mode,
{_i2.SetModeFunction? injectSetModeMethod}) =>
String? deviceId, _i5.GThermostatMode? mode,
{_i2.SetModeFunction? setMode = _i4.ThermostatRepository.setMode}) =>
(super.noSuchMethod(
Invocation.method(#setThermostatMode, [deviceId, mode],
{#injectSetModeMethod: injectSetModeMethod}),
Invocation.method(
#setThermostatMode, [deviceId, mode], {#setMode: setMode}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i3.Future<void>);
@override
_i3.Future<void> getDeviceDetail(String? deviceId,
{_i2.GetThermostatDetailsFunction?
injectGetThermostatDetailsMethod}) =>
{_i2.GetThermostatDetailsFunction? getThermostatDetails =
_i6.DevicesRepository.getThermostatDetails}) =>
(super.noSuchMethod(
Invocation.method(#getDeviceDetail, [
deviceId
], {
#injectGetThermostatDetailsMethod: injectGetThermostatDetailsMethod
}),
Invocation.method(#getDeviceDetail, [deviceId],
{#getThermostatDetails: getThermostatDetails}),
returnValue: Future<void>.value(),
returnValueForMissingStub: Future<void>.value()) as _i3.Future<void>);
@override
void addListener(_i5.VoidCallback? listener) =>
void addListener(_i7.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null);
@override
void removeListener(_i5.VoidCallback? listener) =>
void removeListener(_i7.VoidCallback? listener) =>
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
returnValueForMissingStub: null);
@override
Expand Down

0 comments on commit ba7aeff

Please sign in to comment.