Skip to content

Commit 1d1fa18

Browse files
authored
Merge pull request #91 from syncromatics/feature/EN-6322-add-bike-rack-slots
feat(bikeRackSlots): EN-6322 add bike rack slots
2 parents 533b395 + 2244dad commit 1d1fa18

7 files changed

Lines changed: 171 additions & 11 deletions

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mocks/bikeRackSlots.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const bikeRackSlots = {
2+
list: [
3+
{
4+
vehicle: {
5+
href: '/1/SYNC/vehicles/1',
6+
},
7+
bike_rack_slot: 'Front',
8+
is_occupied: true,
9+
event_time: '2017-01-01T00:00:00.000-07:00',
10+
latitude: 123.456789,
11+
longitude: 12.345678,
12+
},
13+
{
14+
vehicle: {
15+
href: '/1/SYNC/vehicles/1',
16+
},
17+
bike_rack_slot: 'Middle',
18+
is_occupied: false,
19+
event_time: '2017-01-01T00:00:00.000-07:00',
20+
latitude: 123.456789,
21+
longitude: 12.345678,
22+
},
23+
{
24+
vehicle: {
25+
href: '/1/SYNC/vehicles/1',
26+
},
27+
bike_rack_slot: 'Rear',
28+
is_occupied: true,
29+
event_time: '2017-01-01T00:00:00.000-07:00',
30+
latitude: 123.456789,
31+
longitude: 12.345678,
32+
},
33+
],
34+
};
35+
36+
export default bikeRackSlots;

src/mocks/realTime.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Server } from 'mock-socket';
33
import * as messages from '../subscriptions/messages';
44
import areas from './areas';
55
import callStates from './callStates';
6+
import bikeRackSlots from './bikeRackSlots';
67
import dispatchMessages from './dispatchMessages';
78
import dispatchMessageStatus from './dispatchMessageStatus';
89
import enplugDetails from './enplugDetails';
@@ -134,6 +135,9 @@ const realTime = {
134135
case 'ASSIGNMENTS':
135136
data = vehicles.list.map((v) => v.assignment);
136137
break;
138+
case 'BIKE_RACK_SLOTS':
139+
data = bikeRackSlots.list;
140+
break;
137141
case 'CALL_STATES':
138142
data = callStates.list;
139143
break;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import RealTimeContext from './RealTimeContext';
2+
3+
/**
4+
* A real time context that can be used to generate subscriptions to Bike Rack Slot entities.
5+
*/
6+
class BikeRackSlotsRealTimeContext extends RealTimeContext {
7+
/**
8+
* Creates a context that can subscribe to Bike Rack Slot updates.
9+
* @param {RealTimeClient} realTimeClient Pre-configured instance of RealTimeClient.
10+
* @param {string} customerCode The customer code to query for updates.
11+
*/
12+
constructor(realTimeClient, customerCode) {
13+
const entityName = 'BIKE_RACK_SLOTS';
14+
super(realTimeClient, entityName, customerCode);
15+
this.filters = {
16+
vehicles: [],
17+
};
18+
}
19+
20+
/**
21+
* Restrict subscriptions created by this context to a single vehicle.
22+
* @param {Resource|string} vehicle Href or resource representation of a Vehicle.
23+
* @returns {BikeRackSlotsRealTimeContext} Context with filter applied.
24+
*/
25+
forVehicle(vehicle) {
26+
return this.forVehicles([vehicle]);
27+
}
28+
29+
/**
30+
* Restrict subscriptions created by this context to a set of vehicles.
31+
* @param {Array.<Resource|string>} vehicles Array of href or resource representations of
32+
* Vehicles.
33+
* @returns {BikeRackSlotsRealTimeContext} Context with filter applied.
34+
*/
35+
forVehicles(vehicles) {
36+
this.assertSubscriptionNotStarted();
37+
this.filters.vehicles = vehicles.map(RealTimeContext.resolveHref);
38+
return this;
39+
}
40+
}
41+
42+
export default BikeRackSlotsRealTimeContext;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import chai from 'chai';
2+
import chaiAsPromised from 'chai-as-promised';
3+
import BikeRackSlotsRealTimeContext from './BikeRackSlotsRealTimeContext';
4+
import RealTimeClient from '../RealTimeClient';
5+
import { realTime as mock } from '../mocks';
6+
7+
chai.should();
8+
chai.use(chaiAsPromised);
9+
10+
describe('When creating a subscription for Bike Rack Slots', () => {
11+
const entity = 'BIKE_RACK_SLOTS';
12+
const customerCode = 'SYNC';
13+
14+
it('can add filters for a single vehicle', () => {
15+
const server = mock.getServer();
16+
const realTimeClient = new RealTimeClient(mock.authenticatedClient, mock.options);
17+
const subject = new BikeRackSlotsRealTimeContext(realTimeClient, customerCode);
18+
19+
const vehicleHref = '123';
20+
const expectedFilters = { vehicles: [vehicleHref] };
21+
subject.forVehicle(vehicleHref).on('update', () => {});
22+
23+
const options = { closeConnection: true, realTimeClient };
24+
return server.verifySubscription(entity, options).should.eventually.become(expectedFilters);
25+
});
26+
27+
it('can add filters for multiple vehicles', () => {
28+
const server = mock.getServer();
29+
const realTimeClient = new RealTimeClient(mock.authenticatedClient, mock.options);
30+
const subject = new BikeRackSlotsRealTimeContext(realTimeClient, customerCode);
31+
32+
const vehicleHrefs = ['123', '456', '489'];
33+
const expectedFilters = { vehicles: vehicleHrefs };
34+
35+
subject.forVehicles(vehicleHrefs).on('update', () => {});
36+
37+
const options = { closeConnection: true, realTimeClient };
38+
return server.verifySubscription(entity, options).should.eventually.become(expectedFilters);
39+
});
40+
41+
it('should handle entity updates', () => {
42+
const server = mock.getServer();
43+
const realTimeClient = new RealTimeClient(mock.authenticatedClient, mock.options);
44+
const subject = new BikeRackSlotsRealTimeContext(realTimeClient, customerCode);
45+
46+
let resolver;
47+
const updateReceived = new Promise((resolve) => {
48+
resolver = resolve;
49+
});
50+
const connectionClosed = updateReceived.then(() => server.closeConnection(realTimeClient));
51+
52+
const subscription = subject.forVehicle('/1/SYNC/vehicles/1').on('update', resolver);
53+
54+
return Promise.all([subscription, updateReceived, connectionClosed]);
55+
});
56+
});

src/resources/RealTimeContextFactory.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import AreasRealTimeContext from './AreasRealTimeContext';
22
import AssignmentsRealTimeContext from './AssignmentsRealTimeContext';
3+
import BikeRackSlotsRealTimeContext from './BikeRackSlotsRealTimeContext';
34
import CallStatesRealTimeContext from './CallStatesRealTimeContext';
45
import DispatchMessagesRealTimeContext from './DispatchMessagesRealTimeContext';
56
import DispatchMessageStatusRealTimeContext from './DispatchMessageStatusRealTimeContext';
@@ -80,6 +81,14 @@ class RealTimeContextFactory {
8081
return new AssignmentsRealTimeContext(this.realTimeClient, this.customerCode);
8182
}
8283

84+
/**
85+
* Creates a RealTimeContext for querying Bike Rack Slot updates.
86+
* @returns {BikeRackSlotsRealTimeContext} The newly created context.
87+
*/
88+
bikeRackSlots() {
89+
return new BikeRackSlotsRealTimeContext(this.realTimeClient, this.customerCode);
90+
}
91+
8392
/**
8493
* Creates a RealTimeContext for querying Call State updates.
8594
* @returns {CallStatesRealTimeContext} The newly created context.

src/resources/RealTimeContextFactory.test.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ describe('When creating a RealTimeContext', () => {
2323
result.realTimeClient.should.equal(realTimeClient);
2424
});
2525

26+
it('should reuse its RealTimeClient when creating an BikeRackSlotsRealTimeContext', () => {
27+
const result = factory.bikeRackSlots();
28+
result.realTimeClient.should.equal(realTimeClient);
29+
});
30+
2631
it('should reuse its RealTimeClient when creating an CallStatesRealTimeContext', () => {
2732
const result = factory.callStates();
2833
result.realTimeClient.should.equal(realTimeClient);
@@ -63,9 +68,11 @@ describe('When attaching disconnect and reconnect handlers', () => {
6368
const customerCode = 'SYNC';
6469

6570
it('should attach disconnect handlers to the realTimeClient', () => {
66-
const disconnectHandler = () => { };
71+
const disconnectHandler = () => {};
6772
let verifyCallback;
68-
const didVerifyCallback = new Promise((resolve) => { verifyCallback = resolve; });
73+
const didVerifyCallback = new Promise((resolve) => {
74+
verifyCallback = resolve;
75+
});
6976
const realTimeClientMock = {
7077
addEventListener: (event, handler) => {
7178
if (event === 'disconnect' && handler === disconnectHandler) {
@@ -80,11 +87,13 @@ describe('When attaching disconnect and reconnect handlers', () => {
8087
});
8188

8289
it('should remove disconnect handlers', () => {
83-
const disconnectHandler = () => { };
90+
const disconnectHandler = () => {};
8491
let verifyCallback;
85-
const didVerifyCallback = new Promise((resolve) => { verifyCallback = resolve; });
92+
const didVerifyCallback = new Promise((resolve) => {
93+
verifyCallback = resolve;
94+
});
8695
const realTimeClientMock = {
87-
addEventListener: () => { },
96+
addEventListener: () => {},
8897
removeEventListener: (event, handler) => {
8998
if (event === 'disconnect' && handler === disconnectHandler) {
9099
verifyCallback(true);
@@ -99,9 +108,11 @@ describe('When attaching disconnect and reconnect handlers', () => {
99108
});
100109

101110
it('should fire reconnect handlers', () => {
102-
const reconnectHandler = () => { };
111+
const reconnectHandler = () => {};
103112
let verifyCallback;
104-
const didVerifyCallback = new Promise((resolve) => { verifyCallback = resolve; });
113+
const didVerifyCallback = new Promise((resolve) => {
114+
verifyCallback = resolve;
115+
});
105116
const realTimeClientMock = {
106117
addEventListener: (event, handler) => {
107118
if (event === 'reconnect' && handler === reconnectHandler) {
@@ -116,11 +127,13 @@ describe('When attaching disconnect and reconnect handlers', () => {
116127
});
117128

118129
it('should remove reconnect handlers', () => {
119-
const reconnectHandler = () => { };
130+
const reconnectHandler = () => {};
120131
let verifyCallback;
121-
const didVerifyCallback = new Promise((resolve) => { verifyCallback = resolve; });
132+
const didVerifyCallback = new Promise((resolve) => {
133+
verifyCallback = resolve;
134+
});
122135
const realTimeClientMock = {
123-
addEventListener: () => { },
136+
addEventListener: () => {},
124137
removeEventListener: (event, handler) => {
125138
if (event === 'reconnect' && handler === reconnectHandler) {
126139
verifyCallback(true);

0 commit comments

Comments
 (0)