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.*;
16 import static org.mockito.Mockito.*;
18 import java.util.List;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.junit.jupiter.api.Test;
22 import org.mockito.ArgumentCaptor;
23 import org.openhab.binding.mybmw.internal.dto.vehicle.Vehicle;
24 import org.openhab.binding.mybmw.internal.handler.MyBMWBridgeHandler;
25 import org.openhab.binding.mybmw.internal.util.FileReader;
26 import org.openhab.binding.mybmw.internal.utils.Constants;
27 import org.openhab.binding.mybmw.internal.utils.Converter;
28 import org.openhab.core.config.discovery.DiscoveryListener;
29 import org.openhab.core.config.discovery.DiscoveryResult;
30 import org.openhab.core.config.discovery.DiscoveryService;
31 import org.openhab.core.io.net.http.HttpClientFactory;
32 import org.openhab.core.thing.Bridge;
33 import org.openhab.core.thing.ThingUID;
35 import com.google.gson.JsonObject;
36 import com.google.gson.JsonParser;
39 * The {@link DiscoveryTest} Test Discovery Results
41 * @author Bernd Weymann - Initial contribution
44 public class DiscoveryTest {
47 public void testDiscovery() {
48 String content = FileReader.readFileInString("src/test/resources/responses/I01_REX/vehicles.json");
49 Bridge b = mock(Bridge.class);
50 MyBMWBridgeHandler bh = new MyBMWBridgeHandler(b, mock(HttpClientFactory.class), "en");
51 when(b.getUID()).thenReturn(new ThingUID("mybmw", "account", "abc"));
52 VehicleDiscovery discovery = new VehicleDiscovery();
53 discovery.setThingHandler(bh);
54 DiscoveryListener listener = mock(DiscoveryListener.class);
55 discovery.addDiscoveryListener(listener);
56 List<Vehicle> vl = Converter.getVehicleList(content);
57 assertEquals(1, vl.size(), "Vehicles found");
58 ArgumentCaptor<DiscoveryResult> discoveries = ArgumentCaptor.forClass(DiscoveryResult.class);
59 ArgumentCaptor<DiscoveryService> services = ArgumentCaptor.forClass(DiscoveryService.class);
60 bh.onResponse(content);
61 verify(listener, times(1)).thingDiscovered(services.capture(), discoveries.capture());
62 List<DiscoveryResult> results = discoveries.getAllValues();
63 assertEquals(1, results.size(), "Found Vehicles");
64 DiscoveryResult result = results.get(0);
65 assertEquals("mybmw:bev_rex:abc:anonymous", result.getThingUID().getAsString(), "Thing UID");
69 public void testProperties() {
70 String content = FileReader.readFileInString("src/test/resources/responses/I01_REX/vehicles.json");
71 Vehicle vehicle = Converter.getVehicle(Constants.ANONYMOUS, content);
72 String servicesSuppoertedReference = "RemoteHistory;ChargingHistory;ScanAndCharge;DCSContractManagement;BmwCharging;ChargeNowForBusiness;ChargingPlan";
73 String servicesUnsuppoertedReference = "MiniCharging;EvGoCharging;CustomerEsim;CarSharing;EasyCharge";
74 String servicesEnabledReference = "FindCharging;";
75 String servicesDisabledReference = "DataPrivacy;ChargingSettings;ChargingHospitality;ChargingPowerLimit;ChargingTargetSoc;ChargingLoudness";
76 assertEquals(servicesSuppoertedReference,
77 VehicleDiscovery.getServices(vehicle, VehicleDiscovery.SUPPORTED_SUFFIX, true), "Services supported");
78 assertEquals(servicesUnsuppoertedReference,
79 VehicleDiscovery.getServices(vehicle, VehicleDiscovery.SUPPORTED_SUFFIX, false),
80 "Services unsupported");
82 String servicesEnabled = VehicleDiscovery.getServices(vehicle, VehicleDiscovery.ENABLED_SUFFIX, true)
83 + Constants.SEMICOLON + VehicleDiscovery.getServices(vehicle, VehicleDiscovery.ENABLE_SUFFIX, true);
84 assertEquals(servicesEnabledReference, servicesEnabled, "Services enabled");
85 String servicesDisabled = VehicleDiscovery.getServices(vehicle, VehicleDiscovery.ENABLED_SUFFIX, false)
86 + Constants.SEMICOLON + VehicleDiscovery.getServices(vehicle, VehicleDiscovery.ENABLE_SUFFIX, false);
87 assertEquals(servicesDisabledReference, servicesDisabled, "Services disabled");
91 public void testAnonymousFingerPrint() {
92 String content = FileReader.readFileInString("src/test/resources/responses/fingerprint-raw.json");
93 String anonymous = Converter.anonymousFingerprint(content);
94 assertFalse(anonymous.contains("ABC45678"), "VIN deleted");
96 anonymous = Converter.anonymousFingerprint(Constants.EMPTY);
97 assertEquals(Constants.EMPTY, anonymous, "Equal Fingerprint if Empty");
99 anonymous = Converter.anonymousFingerprint(Constants.EMPTY_JSON);
100 assertEquals(Constants.EMPTY_JSON, anonymous, "Equal Fingerprint if Empty JSon");
104 public void testRawVehicleData() {
105 String content = FileReader.readFileInString("src/test/resources/responses/TwoVehicles/two-vehicles.json");
106 String anonymousVehicle = Converter.getRawVehicleContent("anonymous", content);
107 String contentAnon = FileReader.readFileInString("src/test/resources/responses/TwoVehicles/anonymous-raw.json");
109 JsonObject jo = JsonParser.parseString(contentAnon).getAsJsonObject();
110 assertEquals(jo.toString(), anonymousVehicle, "Anonymous VIN raw data");
111 String contentF11 = FileReader.readFileInString("src/test/resources/responses/TwoVehicles/f11-raw.json");
112 String f11Vehicle = Converter.getRawVehicleContent("some_vin_F11", content);
113 jo = JsonParser.parseString(contentF11).getAsJsonObject();
114 assertEquals(jo.toString(), f11Vehicle, "F11 VIN raw data");