2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mybmw.internal.discovery;
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.junit.jupiter.api.Assertions.assertNotNull;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.when;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.List;
23 import java.util.Optional;
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.junit.jupiter.api.Test;
27 import org.mockito.ArgumentCaptor;
28 import org.mockito.Mockito;
29 import org.openhab.binding.mybmw.internal.MyBMWConstants;
30 import org.openhab.binding.mybmw.internal.dto.vehicle.Vehicle;
31 import org.openhab.binding.mybmw.internal.handler.MyBMWBridgeHandler;
32 import org.openhab.binding.mybmw.internal.handler.backend.MyBMWHttpProxy;
33 import org.openhab.binding.mybmw.internal.handler.backend.NetworkException;
34 import org.openhab.binding.mybmw.internal.util.FileReader;
35 import org.openhab.core.config.core.Configuration;
36 import org.openhab.core.config.discovery.DiscoveryListener;
37 import org.openhab.core.config.discovery.DiscoveryResult;
38 import org.openhab.core.config.discovery.DiscoveryService;
39 import org.openhab.core.thing.Bridge;
40 import org.openhab.core.thing.Thing;
41 import org.openhab.core.thing.ThingUID;
43 import com.google.gson.Gson;
46 * The {@link VehicleDiscoveryTest} Test Discovery Results
48 * @author Bernd Weymann - Initial contribution
49 * @author Martin Grassl - updates
52 public class VehicleDiscoveryTest {
55 public void testDiscovery() {
56 String content = FileReader.fileToString("responses/vehicles.json");
57 List<Vehicle> vehicleList = Arrays.asList(new Gson().fromJson(content, Vehicle[].class));
59 VehicleDiscovery vehicleDiscovery = new VehicleDiscovery();
61 MyBMWBridgeHandler bridgeHandler = mock(MyBMWBridgeHandler.class);
63 List<Thing> things = new ArrayList<>();
65 Thing thing1 = mock(Thing.class);
66 when(thing1.getConfiguration()).thenReturn(createConfiguration("VIN1234567"));
68 Thing thing2 = mock(Thing.class);
69 when(thing2.getConfiguration()).thenReturn(createConfiguration("VIN1234568"));
72 Bridge bridge = mock(Bridge.class);
73 when(bridge.getUID()).thenReturn(new ThingUID("mybmw", "account", "abc"));
75 when(bridgeHandler.getThing()).thenReturn(bridge);
77 MyBMWHttpProxy myBMWProxy = mock(MyBMWHttpProxy.class);
79 when(myBMWProxy.requestVehicles()).thenReturn(vehicleList);
80 } catch (NetworkException e) {
83 when(bridgeHandler.getMyBmwProxy()).thenReturn(Optional.of(myBMWProxy));
85 vehicleDiscovery.setThingHandler(bridgeHandler);
86 assertNotNull(vehicleDiscovery.getThingHandler());
88 DiscoveryListener listener = mock(DiscoveryListener.class);
89 vehicleDiscovery.addDiscoveryListener(listener);
91 assertEquals(2, vehicleList.size(), "Vehicles not found");
92 ArgumentCaptor<DiscoveryResult> discoveries = ArgumentCaptor.forClass(DiscoveryResult.class);
93 ArgumentCaptor<DiscoveryService> services = ArgumentCaptor.forClass(DiscoveryService.class);
96 vehicleDiscovery.startScan();
98 Mockito.verify(listener, Mockito.times(2)).thingDiscovered(services.capture(), discoveries.capture());
99 List<DiscoveryResult> results = discoveries.getAllValues();
100 assertEquals(2, results.size(), "Vehicles Not Found");
102 assertEquals("mybmw:conv:abc:VIN1234567", results.get(0).getThingUID().getAsString(), "Thing UID");
103 assertEquals("mybmw:conv:abc:VIN1234568", results.get(1).getThingUID().getAsString(), "Thing UID");
105 // call the discovery again to check if the vehicle is already known -> no newly created vehicles should be
107 when(bridge.getThings()).thenReturn(things);
109 ArgumentCaptor<DiscoveryResult> discoveries2 = ArgumentCaptor.forClass(DiscoveryResult.class);
110 ArgumentCaptor<DiscoveryService> services2 = ArgumentCaptor.forClass(DiscoveryService.class);
112 // call the discovery
113 vehicleDiscovery.startScan();
115 Mockito.verify(listener, Mockito.times(2)).thingDiscovered(services2.capture(), discoveries2.capture());
116 results = discoveries2.getAllValues();
118 vehicleDiscovery.deactivate();
119 assertEquals(2, results.size(), "Vehicles Not Found");
122 private Configuration createConfiguration(String vin) {
123 Configuration configuration = new Configuration();
124 configuration.put(MyBMWConstants.VIN, vin);
126 return configuration;