UNPKG

homebridge-fujitsu-airstage

Version:

A Homebridge plugin to control devices that use the Fujitsu Airstage API.

1,422 lines (1,237 loc) 87.9 kB
'use strict'; const assert = require('node:assert'); const { mock, test } = require('node:test'); const airstage = require('./../../../src/airstage'); const clientWithAccessToken = new airstage.cloud.Client( 'us', 'United States', 'en', 'example@example.com', 'password', null, null, 'existingAccessToken', '2099-01-01', 'existingRefreshToken' ); const clientWithoutAccessToken = new airstage.cloud.Client( 'us', 'United States', 'en', 'example@example.com', 'password' ); test('airstage.cloud.Client#refreshTokenOrAuthenticate calls _apiClient.postUsersMeRefreshToken with success', (context, done) => { const expectedResponse = { 'accessToken': 'testAccessToken', 'expiresIn': 3600, 'refreshToken': 'testRefreshToken' }; context.mock.method( clientWithAccessToken._apiClient, 'postUsersMeRefreshToken', (refreshToken, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersMeRefreshToken.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'existingRefreshToken'); }); clientWithAccessToken.refreshTokenOrAuthenticate((error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse); done(); }); }); test('airstage.cloud.Client#refreshTokenOrAuthenticate calls _apiClient.postUsersMeRefreshToken with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postUsersMeRefreshToken', (refreshToken, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersMeRefreshToken.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'existingRefreshToken'); }); clientWithAccessToken.refreshTokenOrAuthenticate((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#refreshTokenOrAuthenticate calls _apiClient.postUsersSignIn with success', (context, done) => { const expectedResponse = { 'accessToken': 'testAccessToken', 'expiresIn': 3600, 'refreshToken': 'testRefreshToken' }; context.mock.method( clientWithoutAccessToken._apiClient, 'postUsersSignIn', (email, password, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithoutAccessToken._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'example@example.com'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'password'); }); clientWithoutAccessToken.refreshTokenOrAuthenticate((error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse); done(); }); }); test('airstage.cloud.Client#refreshTokenOrAuthenticate calls _apiClient.postUsersSignIn with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithoutAccessToken._apiClient, 'postUsersSignIn', (email, password, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithoutAccessToken._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'example@example.com'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'password'); }); clientWithoutAccessToken.refreshTokenOrAuthenticate((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#refreshTokenOrAuthenticate returns error', (context, done) => { const client = new airstage.cloud.Client( 'us', 'United States', 'en' ); context.mock.method( client._apiClient, 'postUsersMeRefreshToken' ); context.mock.method( client._apiClient, 'postUsersSignIn' ); context.after(() => { const mockedRefreshMethod = client._apiClient.postUsersMeRefreshToken.mock; const mockedAuthenticateMethod = client._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedRefreshMethod.calls.length, 0); assert.strictEqual(mockedAuthenticateMethod.calls.length, 0); }); client.refreshTokenOrAuthenticate((error, result) => { assert.strictEqual(error, 'Could not refresh token or authenticate'); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#authenticate calls _apiClient.postUsersSignIn with success', (context, done) => { const expectedResponse = { 'accessToken': 'testAccessToken', 'expiresIn': 3600, 'refreshToken': 'testRefreshToken' }; context.mock.method( clientWithAccessToken._apiClient, 'postUsersSignIn', (email, password, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'example@example.com'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'password'); }); clientWithAccessToken.authenticate((error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse); done(); }); }); test('airstage.cloud.Client#authenticate calls _apiClient.postUsersSignIn with "Invalid email or password" error', (context, done) => { const expectedError = 'Invalid email or password'; context.mock.method( clientWithAccessToken._apiClient, 'postUsersSignIn', (email, password, callback) => { callback({ 'statusCode': 401, 'error': null, 'response': { 'messageCode': 'AIRSTAGE_POST_USERS_SIGNIN_EMAIL_PASSWORD_INVALID' } }); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'example@example.com'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'password'); }); clientWithAccessToken.authenticate((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#authenticate calls _apiClient.postUsersSignIn with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postUsersSignIn', (email, password, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersSignIn.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'example@example.com'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'password'); }); clientWithAccessToken.authenticate((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#refreshToken calls _apiClient.postUsersMeRefreshToken with success', (context, done) => { const expectedResponse = { 'accessToken': 'testAccessToken', 'expiresIn': 3600, 'refreshToken': 'testRefreshToken' }; context.mock.method( clientWithAccessToken._apiClient, 'postUsersMeRefreshToken', (refreshToken, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersMeRefreshToken.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'existingRefreshToken'); }); clientWithAccessToken.refreshToken((error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse); done(); }); }); test('airstage.cloud.Client#refreshToken calls _apiClient.postUsersMeRefreshToken with "Invalid access token" error', (context, done) => { const expectedError = 'Invalid access token'; context.mock.method( clientWithAccessToken._apiClient, 'postUsersMeRefreshToken', (refreshToken, callback) => { callback({ 'statusCode': 403, 'error': null, 'response': { 'messageCode': 'AIRSTAGE_COMMON_TOKEN_INVALID' } }); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersMeRefreshToken.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'existingRefreshToken'); }); clientWithAccessToken.refreshToken((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#refreshToken calls _apiClient.postUsersMeRefreshToken with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postUsersMeRefreshToken', (refreshToken, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postUsersMeRefreshToken.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'existingRefreshToken'); }); clientWithAccessToken.refreshToken((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getTemperatureScale calls _apiClient.getUsersMe with success', (context, done) => { const expectedResponse = { 'tempUnit': 'F' }; context.mock.method( clientWithAccessToken._apiClient, 'getUsersMe', (callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getUsersMe.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 1); }); clientWithAccessToken.resetUserMetadataCache(); clientWithAccessToken.getTemperatureScale((error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse.tempUnit); done(); }); }); test('airstage.cloud.Client#getTemperatureScale calls _apiClient.getUsersMe with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getUsersMe', (callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getUsersMe.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 1); }); clientWithAccessToken.resetUserMetadataCache(); clientWithAccessToken.getTemperatureScale((error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setTemperatureScale calls _apiClient.putUsersMe with success', (context, done) => { const expectedResponse = { 'tempUnit': 'F' }; context.mock.method( clientWithAccessToken._apiClient, 'putUsersMe', (parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.putUsersMe.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 3); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'tempUnit'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'F'); }); clientWithAccessToken.resetUserMetadataCache(); clientWithAccessToken.setTemperatureScale('F', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse.tempUnit); done(); }); }); test('airstage.cloud.Client#setTemperatureScale calls _apiClient.putUsersMe with "Invalid access token" error', (context, done) => { const expectedError = 'Invalid access token'; context.mock.method( clientWithAccessToken._apiClient, 'putUsersMe', (parameterName, parameterValue, callback) => { callback({ 'statusCode': 403, 'error': null, 'response': { 'messageCode': 'AIRSTAGE_COMMON_TOKEN_INVALID' } }); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.putUsersMe.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 3); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'tempUnit'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'F'); }); clientWithAccessToken.resetUserMetadataCache(); clientWithAccessToken.setTemperatureScale('F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setTemperatureScale calls _apiClient.putUsersMe with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'putUsersMe', (parameterName, parameterValue, callback) => { assert.strictEqual(parameterName, 'tempUnit'); assert.strictEqual(parameterValue, 'F'); callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.putUsersMe.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 3); assert.strictEqual(mockedMethod.calls[0].arguments[0], 'tempUnit'); assert.strictEqual(mockedMethod.calls[0].arguments[1], 'F'); }); clientWithAccessToken.resetUserMetadataCache(); clientWithAccessToken.setTemperatureScale('F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getName calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'deviceName': 'My Device' }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getName('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse.deviceName); done(); }); }); test('airstage.cloud.Client#getName calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getName('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getConnectionStatus calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'connectionStatus': 'Online' }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getConnectionStatus('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse.connectionStatus); done(); }); }); test('airstage.cloud.Client#getConnectionStatus calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getConnectionStatus('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getModel calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_model', 'value': 'AZ123' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getModel('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, expectedResponse.parameters[0].value); done(); }); }); test('airstage.cloud.Client#getModel calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getModel('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getPowerState calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_onoff', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getPowerState('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'ON'); done(); }); }); test('airstage.cloud.Client#getPowerState calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getPowerState('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setPowerState calls _apiClient.postDevicesSetParametersRequest with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_onoff', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.mock.method( clientWithAccessToken._apiClient, 'getDevicesRequest', (deviceId, requestId, callback) => { callback({'error': null, 'response': expectedGetDevicesRequestResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_onoff'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '1'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setPowerState('12345', 'ON', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'ON'); done(); }); }); test('airstage.cloud.Client#setPowerState calls _apiClient.postDevicesSetParametersRequest with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_onoff'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '1'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setPowerState('12345', 'ON', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getOperationMode calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_op_mode', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getOperationMode('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'COOL'); done(); }); }); test('airstage.cloud.Client#getOperationMode calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getOperationMode('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setOperationMode calls _apiClient.postDevicesSetParametersRequest with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_op_mode', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.mock.method( clientWithAccessToken._apiClient, 'getDevicesRequest', (deviceId, requestId, callback) => { callback({'error': null, 'response': expectedGetDevicesRequestResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_op_mode'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '1'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setOperationMode('12345', 'COOL', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'COOL'); done(); }); }); test('airstage.cloud.Client#setOperationMode updates fan speed in device cache to AUTO when DRY with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_op_mode', 'value': '2' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.mock.method( clientWithAccessToken._apiClient, 'getDevicesRequest', (deviceId, requestId, callback) => { callback({'error': null, 'response': expectedGetDevicesRequestResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_op_mode'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '2'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setOperationMode('12345', 'DRY', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'DRY'); clientWithAccessToken.getFanSpeed('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'AUTO'); done(); }); }); }); test('airstage.cloud.Client#setOperationMode calls _apiClient.postDevicesSetParametersRequest with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_op_mode'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '1'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setOperationMode('12345', 'COOL', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getIndoorTemperature calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_indoor_tmp', 'value': '7200' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getIndoorTemperature('12345', 'F', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 72); done(); }); }); test('airstage.cloud.Client#getIndoorTemperature calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getIndoorTemperature('12345', 'F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getTargetTemperature calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_set_tmp', 'value': '220' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getTargetTemperature('12345', 'F', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 72); done(); }); }); test('airstage.cloud.Client#getTargetTemperature calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getTargetTemperature('12345', 'F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setTargetTemperature calls _apiClient.postDevicesSetParametersRequest with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_set_tmp', 'value': '220' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.mock.method( clientWithAccessToken._apiClient, 'getDevicesRequest', (deviceId, requestId, callback) => { callback({'error': null, 'response': expectedGetDevicesRequestResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_set_tmp'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '220'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setTargetTemperature('12345', 72, 'F', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 72); done(); }); }); test('airstage.cloud.Client#setTargetTemperature calls _apiClient.postDevicesSetParametersRequest with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_set_tmp'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '220'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setTargetTemperature('12345', 72, 'F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getTemperatureDelta calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_indoor_tmp', 'value': '7400' }, { 'name': 'iu_set_tmp', 'value': '220' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getTemperatureDelta('12345', 'F', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 4); done(); }); }); test('airstage.cloud.Client#getTemperatureDelta calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getTemperatureDelta('12345', 'F', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getFanSpeed calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_fan_spd', 'value': '11' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getFanSpeed('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'HIGH'); done(); }); }); test('airstage.cloud.Client#getFanSpeed calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getFanSpeed('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setFanSpeed calls _apiClient.postDevicesSetParametersRequest with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_fan_spd', 'value': '11' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.mock.method( clientWithAccessToken._apiClient, 'getDevicesRequest', (deviceId, requestId, callback) => { callback({'error': null, 'response': expectedGetDevicesRequestResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_fan_spd'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '11'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setFanSpeed('12345', 'HIGH', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 'HIGH'); done(); }); }); test('airstage.cloud.Client#setFanSpeed calls _apiClient.postDevicesSetParametersRequest with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'postDevicesSetParametersRequest', (deviceId, deviceSubId, parameterName, parameterValue, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.postDevicesSetParametersRequest.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 5); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); assert.strictEqual(mockedMethod.calls[0].arguments[1], '0'); assert.strictEqual(mockedMethod.calls[0].arguments[2], 'iu_fan_spd'); assert.strictEqual(mockedMethod.calls[0].arguments[3], '11'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.setFanSpeed('12345', 'HIGH', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#getAirflowVerticalDirection calls _apiClient.getDevice with success', (context, done) => { const expectedResponse = { 'parameters': [ { 'name': 'iu_af_dir_vrt', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': null, 'response': expectedResponse}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getAirflowVerticalDirection('12345', (error, result) => { assert.strictEqual(error, null); assert.strictEqual(result, 1); done(); }); }); test('airstage.cloud.Client#getAirflowVerticalDirection calls _apiClient.getDevice with error', (context, done) => { const expectedError = 'Error'; context.mock.method( clientWithAccessToken._apiClient, 'getDevice', (deviceId, callback) => { callback({'error': expectedError, 'response': null}); } ); context.after(() => { const mockedMethod = clientWithAccessToken._apiClient.getDevice.mock; assert.strictEqual(mockedMethod.calls.length, 1); assert.strictEqual(mockedMethod.calls[0].arguments.length, 2); assert.strictEqual(mockedMethod.calls[0].arguments[0], '12345'); }); clientWithAccessToken.resetDeviceCache('12345'); clientWithAccessToken.getAirflowVerticalDirection('12345', (error, result) => { assert.strictEqual(error, expectedError); assert.strictEqual(result, null); done(); }); }); test('airstage.cloud.Client#setAirflowVerticalDirection with 0 calls _apiClient.postDevicesSetParametersRequest with success', (context, done) => { const expectedResponse = {'reqId': '54321'}; const expectedGetDevicesRequestResponse = { 'status': 'complete', 'result': 'success', 'parameters': [ { 'name': 'iu_af_dir_vrt', 'value': '1' } ] }; context.mock.method( clientWithAccessToken._apiC