Skip to content

Commit 2c97e73

Browse files
authored
Merge pull request #57 from Hacksore/develop
Fix #55 and update unit tests
2 parents dcfbbbe + 200b5ba commit 2c97e73

7 files changed

Lines changed: 219 additions & 26 deletions

File tree

__tests__/mock/americanStatus.json

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
{
2+
"vehicleStatus": {
3+
"dateTime": "2020-05-20T23:20:39Z",
4+
"acc": false,
5+
"trunkOpen": false,
6+
"doorLock": false,
7+
"defrostStatus": "false",
8+
"transCond": true,
9+
"doorLockStatus": "false",
10+
"doorOpen": {
11+
"frontRight": 1,
12+
"frontLeft": 1,
13+
"backLeft": 0,
14+
"backRight": 0
15+
},
16+
"airCtrlOn": false,
17+
"airTemp": {
18+
"unit": 1,
19+
"hvacTempType": 1,
20+
"value": "LO"
21+
},
22+
"battery": {
23+
"batSignalReferenceValue": {},
24+
"batSoc": 67,
25+
"batState": 0,
26+
"sjbDeliveryMode": 1
27+
},
28+
"ign3": false,
29+
"ignitionStatus": "false",
30+
"lowFuelLight": false,
31+
"sideBackWindowHeat": 0,
32+
"dte": {
33+
"unit": 3,
34+
"value": 142
35+
},
36+
"engine": false,
37+
"defrost": false,
38+
"hoodOpen": false,
39+
"airConditionStatus": "false",
40+
"steerWheelHeat": 0,
41+
"tirePressureLamp": {
42+
"tirePressureWarningLampRearLeft": 0,
43+
"tirePressureWarningLampFrontLeft": 0,
44+
"tirePressureWarningLampFrontRight": 0,
45+
"tirePressureWarningLampAll": 0,
46+
"tirePressureWarningLampRearRight": 0
47+
},
48+
"trunkOpenStatus": "false"
49+
}
50+
}

__tests__/mock/europeStatus.json

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
{
2+
"resMsg": {
3+
"vehicleStatusInfo": {
4+
"vehicleStatus": {
5+
"airCtrlOn": false,
6+
"engine": false,
7+
"doorLock": true,
8+
"doorOpen": {
9+
"frontLeft": 0,
10+
"frontRight": 0,
11+
"backLeft": 0,
12+
"backRight": 0
13+
},
14+
"trunkOpen": false,
15+
"airTemp": { "value": "0FH", "unit": 0, "hvacTempType": 1 },
16+
"defrost": false,
17+
"acc": false,
18+
"evStatus": {
19+
"batteryCharge": false,
20+
"batteryStatus": 54,
21+
"batteryPlugin": 0,
22+
"remainTime2": {
23+
"etc1": { "value": 22, "unit": 1 },
24+
"etc2": { "value": 1020, "unit": 1 },
25+
"etc3": { "value": 230, "unit": 1 },
26+
"atc": { "value": 410, "unit": 1 }
27+
},
28+
"drvDistance": [
29+
{
30+
"rangeByFuel": {
31+
"evModeRange": { "value": 235, "unit": 1 },
32+
"totalAvailableRange": { "value": 235, "unit": 1 }
33+
},
34+
"type": 2
35+
}
36+
],
37+
"reservChargeInfos": {
38+
"reservChargeInfo": {
39+
"reservChargeInfoDetail": {
40+
"reservInfo": {
41+
"day": [4],
42+
"time": { "time": "1030", "timeSection": 0 }
43+
},
44+
"reservChargeSet": true,
45+
"reservFatcSet": {
46+
"defrost": false,
47+
"airTemp": { "value": "0FH", "unit": 0, "hvacTempType": 1 },
48+
"airCtrl": 0,
49+
"heating1": 0
50+
}
51+
}
52+
},
53+
"offpeakPowerInfo": {
54+
"offPeakPowerTime1": {
55+
"starttime": { "time": "1200", "timeSection": 0 },
56+
"endtime": { "time": "1200", "timeSection": 0 }
57+
},
58+
"offPeakPowerFlag": 0
59+
},
60+
"reserveChargeInfo2": {
61+
"reservChargeInfoDetail": {
62+
"reservInfo": {
63+
"day": [0],
64+
"time": { "time": "1100", "timeSection": 0 }
65+
},
66+
"reservChargeSet": false,
67+
"reservFatcSet": {
68+
"defrost": false,
69+
"airTemp": { "value": "0FH", "unit": 0, "hvacTempType": 1 },
70+
"airCtrl": 0,
71+
"heating1": 0
72+
}
73+
}
74+
},
75+
"reservFlag": 0,
76+
"ect": {
77+
"start": { "day": 9, "time": { "time": "1200", "timeSection": 0 } },
78+
"end": { "day": 9, "time": { "time": "1200", "timeSection": 0 } }
79+
},
80+
"targetSOClist": [
81+
{
82+
"targetSOClevel": 80,
83+
"dte": {
84+
"rangeByFuel": {
85+
"evModeRange": { "value": 354, "unit": 1 },
86+
"totalAvailableRange": { "value": 354, "unit": 1 }
87+
},
88+
"type": 2
89+
},
90+
"plugType": 0
91+
},
92+
{
93+
"targetSOClevel": 100,
94+
"dte": {
95+
"rangeByFuel": {
96+
"evModeRange": { "value": 447, "unit": 1 },
97+
"totalAvailableRange": { "value": 447, "unit": 1 }
98+
},
99+
"type": 2
100+
},
101+
"plugType": 1
102+
}
103+
]
104+
}
105+
},
106+
"ign3": true,
107+
"hoodOpen": false,
108+
"transCond": true,
109+
"steerWheelHeat": 0,
110+
"sideBackWindowHeat": 0,
111+
"tirePressureLamp": {
112+
"tirePressureLampAll": 0,
113+
"tirePressureLampFL": 0,
114+
"tirePressureLampFR": 0,
115+
"tirePressureLampRL": 0,
116+
"tirePressureLampRR": 0
117+
},
118+
"battery": { "batSoc": 91, "batState": 0 },
119+
"time": "20200718192140"
120+
}
121+
}
122+
}
123+
}

__tests__/vehicle.spec.ts

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { EuropeanController } from '../lib/controllers/european.controller';
1010
import CanadianVehicle from '../lib/vehicles/canadian.vehicle';
1111
import { CanadianController } from '../lib/controllers/canadian.controller';
1212

13+
import AMERICAN_STATUS_MOCK from './mock/americanStatus.json';
14+
import EUROPE_STATUS_MOCK from './mock/europeStatus.json';
15+
1316
jest.mock('got');
1417

1518
const referenceMap = {
@@ -73,6 +76,16 @@ describe('AmericanVehicle', () => {
7376
const response = await vehicle.lock();
7477
expect(response).toEqual('Lock successful');
7578
});
79+
80+
it('call status commmand', async () => {
81+
(got as any).mockReturnValueOnce({
82+
body: JSON.stringify(AMERICAN_STATUS_MOCK),
83+
statusCode: 200,
84+
});
85+
86+
const response = await vehicle.status({ parsed: true });
87+
expect(response.engine.range).toEqual(AMERICAN_STATUS_MOCK.vehicleStatus.dte.value);
88+
});
7689
});
7790

7891
describe('CanadianVehicle', () => {
@@ -116,24 +129,23 @@ describe('EuropeanVehicle', () => {
116129
expect(vehicle.nickname()).toEqual('Jest is best');
117130
});
118131

119-
// TODO: EU lead gets to write these :)
120-
// it('call lock commmand', async () => {
121-
// (got as any).mockReturnValueOnce({
122-
// body: {},
123-
// statusCode: 200
124-
// });
125-
126-
// const response = await vehicle.lock();
127-
// expect(response).toEqual('Lock successful');
128-
// });
129-
130-
// it('call unlock commmand', async () => {
131-
// (got as any).mockReturnValueOnce({
132-
// body: {},
133-
// statusCode: 200
134-
// });
135-
136-
// const response = await vehicle.unlock();
137-
// expect(response).toEqual('Unlock successful');
138-
// });
132+
it('call status commmand', async () => {
133+
// mocks the pin code request
134+
(got as any).mockReturnValueOnce({
135+
body: {},
136+
statusCode: 200,
137+
});
138+
139+
(got as any).mockReturnValueOnce({
140+
body: EUROPE_STATUS_MOCK,
141+
statusCode: 200,
142+
});
143+
144+
const response = await vehicle.status({ parsed: true });
145+
146+
const expected =
147+
EUROPE_STATUS_MOCK.resMsg.vehicleStatusInfo.vehicleStatus.evStatus.drvDistance[0].rangeByFuel
148+
.totalAvailableRange.value;
149+
expect(response.engine.range).toEqual(expected);
150+
});
139151
});

lib/util.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
export const getTempCode = (temperature: number): string => {
22
switch (temperature) {
3+
case 14.0:
4+
return '00H';
5+
case 14.5:
6+
return '01H';
37
case 15.0:
48
return '02H';
59
case 15.5:
@@ -63,12 +67,16 @@ export const getTempCode = (temperature: number): string => {
6367
case 30.0:
6468
return '20H';
6569
default:
66-
throw new Error('temperature out of bounds! min: 15.0* max: 30*, max step: 0.5');
70+
throw new Error('temperature out of bounds! min: 14.0* max: 30*, max step: 0.5');
6771
}
6872
};
6973

7074
export const getTempFromCode = (code: string): number => {
7175
switch (code) {
76+
case '00H':
77+
return 14.0;
78+
case '01H':
79+
return 14.5;
7280
case '02H':
7381
return 15.0;
7482
case '03H':
@@ -132,6 +140,6 @@ export const getTempFromCode = (code: string): number => {
132140
case '20H':
133141
return 30.0;
134142
default:
135-
throw new Error('temperature out of bounds! min: 15.0* max: 30*, max step: 0.5');
143+
throw new Error('temperature out of bounds! min: 14.0* max: 30*, max step: 0.5');
136144
}
137145
};

lib/vehicles/american.vehicle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ export default class AmericanVehicle extends Vehicle {
211211
} as VehicleStatus;
212212

213213
this._status = input.parsed ? parsedStatus : vehicleStatus;
214-
214+
215215
return Promise.resolve(this._status);
216216
}
217217

lib/vehicles/european.vehicle.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ export default class EuropeanVehicle extends Vehicle {
184184
hoodOpen: vehicleStatus.hoodOpen,
185185
trunkOpen: vehicleStatus.trunkOpen,
186186
locked: vehicleStatus.doorLock,
187-
doors: {
187+
openDoors: {
188188
frontRight: !!vehicleStatus.doorOpen.frontRight,
189189
frontLeft: !!vehicleStatus.doorOpen.frontLeft,
190190
backLeft: !!vehicleStatus.doorOpen.backLeft,
@@ -214,7 +214,7 @@ export default class EuropeanVehicle extends Vehicle {
214214
charging: vehicleStatus?.evStatus?.batteryCharge,
215215
batteryCharge: vehicleStatus?.battery?.batSoc,
216216
},
217-
};
217+
} as VehicleStatus;
218218

219219
this._status = input.parsed ? parsedStatus : vehicleStatus;
220220

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bluelinky",
3-
"version": "5.1.0",
3+
"version": "5.1.1",
44
"description": "",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

0 commit comments

Comments
 (0)