]> git.basschouten.com Git - openhab-addons.git/blob
2bdb1fabf59625f8e484f7f46de3ce1cdc9d2c9c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.mybmw.internal.discovery;
14
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;
19
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.List;
23 import java.util.Optional;
24
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;
42
43 import com.google.gson.Gson;
44
45 /**
46  * The {@link VehicleDiscoveryTest} Test Discovery Results
47  *
48  * @author Bernd Weymann - Initial contribution
49  * @author Martin Grassl - updates
50  */
51 @NonNullByDefault
52 public class VehicleDiscoveryTest {
53
54     @Test
55     public void testDiscovery() {
56         String content = FileReader.fileToString("responses/vehicles.json");
57         List<Vehicle> vehicleList = Arrays.asList(new Gson().fromJson(content, Vehicle[].class));
58
59         VehicleDiscovery vehicleDiscovery = new VehicleDiscovery();
60
61         MyBMWBridgeHandler bridgeHandler = mock(MyBMWBridgeHandler.class);
62
63         List<Thing> things = new ArrayList<>();
64
65         Thing thing1 = mock(Thing.class);
66         when(thing1.getConfiguration()).thenReturn(createConfiguration("VIN1234567"));
67         things.add(thing1);
68         Thing thing2 = mock(Thing.class);
69         when(thing2.getConfiguration()).thenReturn(createConfiguration("VIN1234568"));
70         things.add(thing2);
71
72         Bridge bridge = mock(Bridge.class);
73         when(bridge.getUID()).thenReturn(new ThingUID("mybmw", "account", "abc"));
74
75         when(bridgeHandler.getThing()).thenReturn(bridge);
76
77         MyBMWHttpProxy myBMWProxy = mock(MyBMWHttpProxy.class);
78         try {
79             when(myBMWProxy.requestVehicles()).thenReturn(vehicleList);
80         } catch (NetworkException e) {
81         }
82
83         when(bridgeHandler.getMyBmwProxy()).thenReturn(Optional.of(myBMWProxy));
84
85         vehicleDiscovery.setThingHandler(bridgeHandler);
86         assertNotNull(vehicleDiscovery.getThingHandler());
87
88         DiscoveryListener listener = mock(DiscoveryListener.class);
89         vehicleDiscovery.addDiscoveryListener(listener);
90
91         assertEquals(2, vehicleList.size(), "Vehicles not found");
92         ArgumentCaptor<DiscoveryResult> discoveries = ArgumentCaptor.forClass(DiscoveryResult.class);
93         ArgumentCaptor<DiscoveryService> services = ArgumentCaptor.forClass(DiscoveryService.class);
94
95         // call the discovery
96         vehicleDiscovery.startScan();
97
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");
101
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");
104
105         // call the discovery again to check if the vehicle is already known -> no newly created vehicles should be
106         // found
107         when(bridge.getThings()).thenReturn(things);
108
109         ArgumentCaptor<DiscoveryResult> discoveries2 = ArgumentCaptor.forClass(DiscoveryResult.class);
110         ArgumentCaptor<DiscoveryService> services2 = ArgumentCaptor.forClass(DiscoveryService.class);
111
112         // call the discovery
113         vehicleDiscovery.startScan();
114
115         Mockito.verify(listener, Mockito.times(2)).thingDiscovered(services2.capture(), discoveries2.capture());
116         results = discoveries2.getAllValues();
117
118         vehicleDiscovery.deactivate();
119         assertEquals(2, results.size(), "Vehicles Not Found");
120     }
121
122     private Configuration createConfiguration(String vin) {
123         Configuration configuration = new Configuration();
124         configuration.put(MyBMWConstants.VIN, vin);
125
126         return configuration;
127     }
128 }