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.persistence.influxdb;
15 import static org.junit.jupiter.api.Assertions.assertThrows;
16 import static org.mockito.ArgumentMatchers.any;
17 import static org.mockito.Mockito.*;
18 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.DATABASE_PARAM;
19 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.PASSWORD_PARAM;
20 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.RETENTION_POLICY_PARAM;
21 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.TOKEN_PARAM;
22 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.URL_PARAM;
23 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.USER_PARAM;
24 import static org.openhab.persistence.influxdb.internal.InfluxDBConfiguration.VERSION_PARAM;
28 import org.eclipse.jdt.annotation.NonNullByDefault;
29 import org.junit.jupiter.api.Test;
30 import org.junit.jupiter.api.extension.ExtendWith;
31 import org.mockito.Mock;
32 import org.mockito.junit.jupiter.MockitoExtension;
33 import org.mockito.junit.jupiter.MockitoSettings;
34 import org.mockito.quality.Strictness;
35 import org.openhab.core.items.ItemRegistry;
36 import org.openhab.core.items.MetadataRegistry;
37 import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService;
38 import org.openhab.persistence.influxdb.internal.InfluxDBRepository;
39 import org.openhab.persistence.influxdb.internal.InfluxDBVersion;
40 import org.openhab.persistence.influxdb.internal.ItemTestHelper;
41 import org.openhab.persistence.influxdb.internal.UnexpectedConditionException;
44 * @author Joan Pujol Espinar - Initial contribution
46 @ExtendWith(MockitoExtension.class)
47 @MockitoSettings(strictness = Strictness.LENIENT)
49 public class InfluxDBPersistenceServiceTest {
50 private static final Map<String, Object> VALID_V1_CONFIGURATION = Map.of( //
51 URL_PARAM, "http://localhost:8086", //
52 VERSION_PARAM, InfluxDBVersion.V1.name(), //
53 USER_PARAM, "user", PASSWORD_PARAM, "password", //
54 DATABASE_PARAM, "openhab", //
55 RETENTION_POLICY_PARAM, "default");
57 private static final Map<String, Object> VALID_V2_CONFIGURATION = Map.of( //
58 URL_PARAM, "http://localhost:8086", //
59 VERSION_PARAM, InfluxDBVersion.V2.name(), //
60 TOKEN_PARAM, "sampletoken", //
61 DATABASE_PARAM, "openhab", //
62 RETENTION_POLICY_PARAM, "default");
64 private static final Map<String, Object> INVALID_V1_CONFIGURATION = Map.of(//
65 URL_PARAM, "http://localhost:8086", //
66 VERSION_PARAM, InfluxDBVersion.V1.name(), //
67 USER_PARAM, "user", //
68 DATABASE_PARAM, "openhab", //
69 RETENTION_POLICY_PARAM, "default");
71 private static final Map<String, Object> INVALID_V2_CONFIGURATION = Map.of( //
72 URL_PARAM, "http://localhost:8086", //
73 VERSION_PARAM, InfluxDBVersion.V2.name(), //
74 DATABASE_PARAM, "openhab", //
75 RETENTION_POLICY_PARAM, "default");
77 private @Mock @NonNullByDefault({}) InfluxDBRepository influxDBRepositoryMock;
79 private final InfluxDBMetadataService influxDBMetadataService = new InfluxDBMetadataService(
80 mock(MetadataRegistry.class));
83 public void activateWithValidV1ConfigShouldConnectRepository() {
84 getService(VALID_V1_CONFIGURATION);
85 verify(influxDBRepositoryMock).connect();
89 public void activateWithValidV2ConfigShouldConnectRepository() {
90 getService(VALID_V2_CONFIGURATION);
91 verify(influxDBRepositoryMock).connect();
95 public void activateWithInvalidV1ConfigShouldFail() {
96 assertThrows(IllegalArgumentException.class, () -> getService(INVALID_V1_CONFIGURATION));
100 public void activateWithInvalidV2ShouldFail() {
101 assertThrows(IllegalArgumentException.class, () -> getService(INVALID_V2_CONFIGURATION));
105 public void deactivateShouldDisconnectRepository() {
106 InfluxDBPersistenceService instance = getService(VALID_V2_CONFIGURATION);
107 instance.deactivate();
108 verify(influxDBRepositoryMock).disconnect();
112 public void storeItemWithConnectedRepository() throws UnexpectedConditionException {
113 InfluxDBPersistenceService instance = getService(VALID_V2_CONFIGURATION);
114 when(influxDBRepositoryMock.isConnected()).thenReturn(true);
115 instance.store(ItemTestHelper.createNumberItem("number", 5));
116 verify(influxDBRepositoryMock, timeout(5000)).write(any());
120 public void storeItemWithDisconnectedRepositoryIsIgnored() throws UnexpectedConditionException {
121 InfluxDBPersistenceService instance = getService(VALID_V2_CONFIGURATION);
122 when(influxDBRepositoryMock.isConnected()).thenReturn(false);
123 instance.store(ItemTestHelper.createNumberItem("number", 5));
124 verify(influxDBRepositoryMock, never()).write(any());
127 private InfluxDBPersistenceService getService(Map<String, Object> config) {
128 return new InfluxDBPersistenceService(mock(ItemRegistry.class), influxDBMetadataService, config) {
130 protected InfluxDBRepository createInfluxDBRepository() {
131 return influxDBRepositoryMock;