mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-26 15:21:41 +01:00
[deutschebahn] Fixed order of stops (#12406)
* Fixed order of stops * As execution was made synchronous in #12235 timeout is not needed any more Signed-off-by: Sönke Küper <soenkekueper@gmx.de>
This commit is contained in:
parent
b209d9a51a
commit
cf0597aea2
@ -129,13 +129,7 @@ public class DeutscheBahnTimetableHandler extends BaseBridgeHandler {
|
|||||||
this.executorService = executorService == null ? this.scheduler : executorService;
|
this.executorService = executorService == null ? this.scheduler : executorService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<TimetableStop> loadTimetable() {
|
private List<TimetableStop> loadTimetable(TimetableLoader currentLoader) {
|
||||||
final TimetableLoader currentLoader = this.loader;
|
|
||||||
if (currentLoader == null) {
|
|
||||||
this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.HANDLER_INITIALIZING_ERROR);
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final List<TimetableStop> stops = currentLoader.getTimetableStops();
|
final List<TimetableStop> stops = currentLoader.getTimetableStops();
|
||||||
this.updateStatus(ThingStatus.ONLINE);
|
this.updateStatus(ThingStatus.ONLINE);
|
||||||
@ -171,7 +165,7 @@ public class DeutscheBahnTimetableHandler extends BaseBridgeHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final EventType eventSelection = stopFilter == TimetableStopFilter.ARRIVALS ? EventType.ARRIVAL
|
final EventType eventSelection = stopFilter == TimetableStopFilter.ARRIVALS ? EventType.ARRIVAL
|
||||||
: EventType.ARRIVAL;
|
: EventType.DEPARTURE;
|
||||||
|
|
||||||
this.loader = new TimetableLoader( //
|
this.loader = new TimetableLoader( //
|
||||||
api, //
|
api, //
|
||||||
@ -247,7 +241,7 @@ public class DeutscheBahnTimetableHandler extends BaseBridgeHandler {
|
|||||||
}
|
}
|
||||||
final GroupedThings groupedThings = this.groupThingsPerPosition();
|
final GroupedThings groupedThings = this.groupThingsPerPosition();
|
||||||
currentLoader.setStopCount(groupedThings.getMaxPosition());
|
currentLoader.setStopCount(groupedThings.getMaxPosition());
|
||||||
final List<TimetableStop> timetableStops = this.loadTimetable();
|
final List<TimetableStop> timetableStops = this.loadTimetable(currentLoader);
|
||||||
if (timetableStops.isEmpty()) {
|
if (timetableStops.isEmpty()) {
|
||||||
updateThingsToUndefined(groupedThings);
|
updateThingsToUndefined(groupedThings);
|
||||||
return;
|
return;
|
||||||
|
@ -50,18 +50,18 @@ import org.openhab.core.types.UnDefType;
|
|||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHelper {
|
public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHelper {
|
||||||
|
|
||||||
private static Configuration createConfig() {
|
private static Configuration createConfig(String trainFilter) {
|
||||||
final Configuration config = new Configuration();
|
final Configuration config = new Configuration();
|
||||||
config.put("accessToken", "letMeIn");
|
config.put("accessToken", "letMeIn");
|
||||||
config.put("evaNo", "8000226");
|
config.put("evaNo", "8000226");
|
||||||
config.put("trainFilter", "all");
|
config.put("trainFilter", trainFilter);
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Bridge mockBridge() {
|
private static Bridge mockBridge(String trainFilter) {
|
||||||
final Bridge bridge = mock(Bridge.class);
|
final Bridge bridge = mock(Bridge.class);
|
||||||
when(bridge.getUID()).thenReturn(new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable"));
|
when(bridge.getUID()).thenReturn(new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable"));
|
||||||
when(bridge.getConfiguration()).thenReturn(createConfig());
|
when(bridge.getConfiguration()).thenReturn(createConfig(trainFilter));
|
||||||
|
|
||||||
final List<Thing> things = new ArrayList<>();
|
final List<Thing> things = new ArrayList<>();
|
||||||
things.add(DeutscheBahnTrainHandlerTest.mockThing(1));
|
things.add(DeutscheBahnTrainHandlerTest.mockThing(1));
|
||||||
@ -76,9 +76,9 @@ public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHel
|
|||||||
return bridge;
|
return bridge;
|
||||||
}
|
}
|
||||||
|
|
||||||
private DeutscheBahnTimetableHandler createAndInitHandler(final ThingHandlerCallback callback, final Bridge bridge)
|
private DeutscheBahnTimetableHandler createAndInitHandler(final ThingHandlerCallback callback, final Bridge bridge,
|
||||||
throws Exception {
|
String dataDirectory) throws Exception {
|
||||||
return createAndInitHandler(callback, bridge, createApiWithTestdata().getApiFactory());
|
return createAndInitHandler(callback, bridge, createApiWithTestdata(dataDirectory).getApiFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
private DeutscheBahnTimetableHandler createAndInitHandler( //
|
private DeutscheBahnTimetableHandler createAndInitHandler( //
|
||||||
@ -103,10 +103,10 @@ public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHel
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateChannels() throws Exception {
|
public void testUpdateChannels() throws Exception {
|
||||||
final Bridge bridge = mockBridge();
|
final Bridge bridge = mockBridge("all");
|
||||||
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
||||||
|
|
||||||
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge);
|
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge, "/timetablesData");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
|
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
|
||||||
@ -120,6 +120,44 @@ public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStopsAreOrderedByDeparture() throws Exception {
|
||||||
|
final Bridge bridge = mockBridge("departures");
|
||||||
|
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
||||||
|
|
||||||
|
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge,
|
||||||
|
"/timetablesDataDifferentOrder");
|
||||||
|
|
||||||
|
try {
|
||||||
|
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
|
||||||
|
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
|
||||||
|
|
||||||
|
verifyThingUpdated(bridge, 0, "-5296516961807204721-2108160906-5");
|
||||||
|
verifyThingUpdated(bridge, 1, "-8364795265993682073-2108160911-6");
|
||||||
|
} finally {
|
||||||
|
handler.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStopsAreOrderedByArrival() throws Exception {
|
||||||
|
final Bridge bridge = mockBridge("arrivals");
|
||||||
|
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
||||||
|
|
||||||
|
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge,
|
||||||
|
"/timetablesDataDifferentOrder");
|
||||||
|
|
||||||
|
try {
|
||||||
|
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
|
||||||
|
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
|
||||||
|
|
||||||
|
verifyThingUpdated(bridge, 0, "-8364795265993682073-2108160911-6");
|
||||||
|
verifyThingUpdated(bridge, 1, "-5296516961807204721-2108160906-5");
|
||||||
|
} finally {
|
||||||
|
handler.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void verifyThingUpdated(final Bridge bridge, int offset, String stopId) {
|
private void verifyThingUpdated(final Bridge bridge, int offset, String stopId) {
|
||||||
final Thing train = bridge.getThings().get(offset);
|
final Thing train = bridge.getThings().get(offset);
|
||||||
final DeutscheBahnTrainHandler childHandler = (DeutscheBahnTrainHandler) train.getHandler();
|
final DeutscheBahnTrainHandler childHandler = (DeutscheBahnTrainHandler) train.getHandler();
|
||||||
@ -128,7 +166,7 @@ public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHel
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateTrainsToUndefinedIfNoDataWasProvided() {
|
public void testUpdateTrainsToUndefinedIfNoDataWasProvided() {
|
||||||
final Bridge bridge = mockBridge();
|
final Bridge bridge = mockBridge("all");
|
||||||
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
||||||
|
|
||||||
final TimetablesV1ApiStub stubWithError = TimetablesV1ApiStub.createWithException();
|
final TimetablesV1ApiStub stubWithError = TimetablesV1ApiStub.createWithException();
|
||||||
@ -158,7 +196,7 @@ public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHel
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateTrainsToUndefinedIfNotEnoughDataWasProvided() {
|
public void testUpdateTrainsToUndefinedIfNotEnoughDataWasProvided() {
|
||||||
final Bridge bridge = mockBridge();
|
final Bridge bridge = mockBridge("all");
|
||||||
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
|
||||||
|
|
||||||
// Bridge contains 3 trains, but Timetable contains only 1 items, so two trains has to be updated to undef
|
// Bridge contains 3 trains, but Timetable contains only 1 items, so two trains has to be updated to undef
|
||||||
|
@ -33,9 +33,19 @@ public interface TimetablesV1ImplTestHelper {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an {@link TimetablesApiTestModule} that uses http response data from file system.
|
* Creates an {@link TimetablesApiTestModule} that uses http response data from file system.
|
||||||
|
* Uses default-testdata from directory /timetablesData
|
||||||
*/
|
*/
|
||||||
public default TimetablesApiTestModule createApiWithTestdata() throws Exception {
|
public default TimetablesApiTestModule createApiWithTestdata() throws Exception {
|
||||||
final URL timetablesData = getClass().getResource("/timetablesData");
|
return this.createApiWithTestdata("/timetablesData");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an {@link TimetablesApiTestModule} that uses http response data from file system.
|
||||||
|
*
|
||||||
|
* @param dataDirectory Directory within test-resources containing the stub-data.
|
||||||
|
*/
|
||||||
|
public default TimetablesApiTestModule createApiWithTestdata(String dataDirectory) throws Exception {
|
||||||
|
final URL timetablesData = getClass().getResource(dataDirectory);
|
||||||
assertNotNull(timetablesData);
|
assertNotNull(timetablesData);
|
||||||
final File testDataDir = new File(timetablesData.toURI());
|
final File testDataDir = new File(timetablesData.toURI());
|
||||||
final TimetableStubHttpCallable httpStub = new TimetableStubHttpCallable(testDataDir);
|
final TimetableStubHttpCallable httpStub = new TimetableStubHttpCallable(testDataDir);
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<timetable station='Lehrte'>
|
||||||
|
<!-- Modified testdata where first train arrives before the second one and departs after second train. -->
|
||||||
|
<s id="-8364795265993682073-2108160911-6">
|
||||||
|
<tl f="S" t="p" o="800244" c="S" n="99031"/>
|
||||||
|
<ar pt="2108160934" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
|
||||||
|
<dp pt="2108160937" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
|
||||||
|
</s>
|
||||||
|
|
||||||
|
<s id="-5296516961807204721-2108160906-5">
|
||||||
|
<tl f="S" t="p" o="800244" c="S" n="99030"/>
|
||||||
|
<ar pt="2108160935" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
|
||||||
|
<dp pt="2108160936" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
|
||||||
|
</s>
|
||||||
|
|
||||||
|
</timetable>
|
Loading…
Reference in New Issue
Block a user