]> git.basschouten.com Git - openhab-addons.git/blob
37146ad07b88505d54068db939517afe120ce4a9
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.persistence.jdbc.db;
14
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertEquals;
18 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
19
20 import java.time.LocalDateTime;
21 import java.time.ZoneId;
22 import java.time.ZonedDateTime;
23 import java.time.format.DateTimeFormatter;
24
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.openhab.core.library.items.CallItem;
29 import org.openhab.core.library.items.ColorItem;
30 import org.openhab.core.library.items.ContactItem;
31 import org.openhab.core.library.items.DateTimeItem;
32 import org.openhab.core.library.items.DimmerItem;
33 import org.openhab.core.library.items.ImageItem;
34 import org.openhab.core.library.items.LocationItem;
35 import org.openhab.core.library.items.NumberItem;
36 import org.openhab.core.library.items.PlayerItem;
37 import org.openhab.core.library.items.RollershutterItem;
38 import org.openhab.core.library.items.StringItem;
39 import org.openhab.core.library.items.SwitchItem;
40 import org.openhab.core.library.types.DateTimeType;
41 import org.openhab.core.library.types.DecimalType;
42 import org.openhab.core.library.types.HSBType;
43 import org.openhab.core.library.types.OnOffType;
44 import org.openhab.core.library.types.OpenClosedType;
45 import org.openhab.core.library.types.PercentType;
46 import org.openhab.core.library.types.PlayPauseType;
47 import org.openhab.core.library.types.PointType;
48 import org.openhab.core.library.types.QuantityType;
49 import org.openhab.core.library.types.RawType;
50 import org.openhab.core.library.types.RewindFastforwardType;
51 import org.openhab.core.library.types.StringListType;
52 import org.openhab.core.library.types.StringType;
53 import org.openhab.core.library.unit.SIUnits;
54 import org.openhab.core.persistence.FilterCriteria;
55 import org.openhab.core.persistence.FilterCriteria.Ordering;
56 import org.openhab.core.types.State;
57
58 /**
59  * Tests the {@link JdbcBaseDAO}.
60  *
61  * @author Christoph Weitkamp - Initial contribution
62  */
63 @NonNullByDefault
64 public class JdbcBaseDAOTest {
65
66     private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
67     private static final DateTimeFormatter DATE_PARSER = DateTimeFormatter.ofPattern(DATE_PATTERN);
68     private static final ZoneId UTC_ZONE_ID = ZoneId.of("UTC");
69     private static final String DB_TABLE_NAME = "testitem";
70
71     private final JdbcBaseDAO jdbcBaseDAO = new JdbcBaseDAO();
72     private @NonNullByDefault({}) FilterCriteria filter;
73
74     @BeforeEach
75     public void setup() {
76         filter = new FilterCriteria();
77     }
78
79     @Test
80     public void testObjectAsStateReturnsValidState() {
81         State decimalType = jdbcBaseDAO.objectAsState(new NumberItem("testNumberItem"), null, 7.3);
82         assertInstanceOf(DecimalType.class, decimalType);
83         assertEquals(DecimalType.valueOf("7.3"), decimalType);
84         State quantityType = jdbcBaseDAO.objectAsState(new NumberItem("testNumberItem"), SIUnits.CELSIUS, 7.3);
85         assertInstanceOf(QuantityType.class, quantityType);
86         assertEquals(QuantityType.valueOf("7.3 °C"), quantityType);
87
88         State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
89                 java.sql.Timestamp.valueOf("2021-02-01 23:30:02.049"));
90         assertInstanceOf(DateTimeType.class, dateTimeType);
91         assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
92
93         dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
94                 LocalDateTime.parse("2021-02-01T23:30:02.049"));
95         assertInstanceOf(DateTimeType.class, dateTimeType);
96         assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
97
98         State hsbType = jdbcBaseDAO.objectAsState(new ColorItem("testColorItem"), null, "184,100,52");
99         assertInstanceOf(HSBType.class, hsbType);
100         assertEquals(HSBType.valueOf("184,100,52"), hsbType);
101
102         State percentType = jdbcBaseDAO.objectAsState(new DimmerItem("testDimmerItem"), null, 52);
103         assertInstanceOf(PercentType.class, percentType);
104         assertEquals(PercentType.valueOf("52"), percentType);
105
106         percentType = jdbcBaseDAO.objectAsState(new RollershutterItem("testRollershutterItem"), null, 39);
107         assertInstanceOf(PercentType.class, percentType);
108         assertEquals(PercentType.valueOf("39"), percentType);
109
110         State openClosedType = jdbcBaseDAO.objectAsState(new ContactItem("testContactItem"), null, "OPEN");
111         assertInstanceOf(OpenClosedType.class, openClosedType);
112         assertThat(openClosedType, is(OpenClosedType.OPEN));
113
114         State playPauseType = jdbcBaseDAO.objectAsState(new PlayerItem("testPlayerItem"), null, "PLAY");
115         assertInstanceOf(PlayPauseType.class, playPauseType);
116         assertThat(playPauseType, is(PlayPauseType.PLAY));
117         State rewindFastforwardType = jdbcBaseDAO.objectAsState(new PlayerItem("testPlayerItem"), null, "REWIND");
118         assertInstanceOf(RewindFastforwardType.class, rewindFastforwardType);
119         assertThat(rewindFastforwardType, is(RewindFastforwardType.REWIND));
120
121         State onOffType = jdbcBaseDAO.objectAsState(new SwitchItem("testSwitchItem"), null, "ON");
122         assertInstanceOf(OnOffType.class, onOffType);
123         assertThat(onOffType, is(OnOffType.ON));
124
125         State stringListType = jdbcBaseDAO.objectAsState(new CallItem("testCallItem"), null, "0699222222,0179999998");
126         assertInstanceOf(StringListType.class, stringListType);
127         assertEquals(StringListType.valueOf("0699222222,0179999998"), stringListType);
128
129         State expectedRawType = new RawType(new byte[0], "application/octet-stream");
130         State rawType = jdbcBaseDAO.objectAsState(new ImageItem("testImageItem"), null, expectedRawType.toFullString());
131         assertInstanceOf(RawType.class, rawType);
132         assertThat(rawType, is(expectedRawType));
133
134         State pointType = jdbcBaseDAO.objectAsState(new LocationItem("testLocationItem"), null, "1,2,3");
135         assertInstanceOf(PointType.class, pointType);
136         assertEquals(PointType.valueOf("1,2,3"), pointType);
137
138         State stringType = jdbcBaseDAO.objectAsState(new StringItem("testStringItem"), null, "String");
139         assertInstanceOf(StringType.class, stringType);
140         assertEquals(StringType.valueOf("String"), stringType);
141     }
142
143     @Test
144     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
145         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
146         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time DESC"));
147     }
148
149     @Test
150     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseAscendingOrder() {
151         filter.setOrdering(Ordering.ASCENDING);
152
153         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
154         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time ASC"));
155     }
156
157     @Test
158     public void testHistItemFilterQueryProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClauseDescendingOrder() {
159         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
160         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
161
162         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
163         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " WHERE TIME>'" //
164                 + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
165                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "' ORDER BY time DESC"));
166     }
167
168     @Test
169     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrderAndLimit() {
170         filter.setPageSize(1);
171
172         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
173         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time DESC LIMIT 0,1"));
174     }
175
176     @Test
177     public void testHistItemFilterDeleteProviderReturnsDeleteQueryWithoutWhereClause() {
178         String sql = jdbcBaseDAO.histItemFilterDeleteProvider(filter, DB_TABLE_NAME, UTC_ZONE_ID);
179         assertThat(sql, is("TRUNCATE TABLE " + DB_TABLE_NAME));
180     }
181
182     @Test
183     public void testHistItemFilterDeleteProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClause() {
184         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
185         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
186
187         String sql = jdbcBaseDAO.histItemFilterDeleteProvider(filter, DB_TABLE_NAME, UTC_ZONE_ID);
188         assertThat(sql, is("DELETE FROM " + DB_TABLE_NAME + " WHERE TIME>'" //
189                 + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
190                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
191     }
192
193     @Test
194     public void testResolveTimeFilterWithNoDatesReturnsEmptyString() {
195         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
196         assertThat(sql, is(""));
197     }
198
199     @Test
200     public void testResolveTimeFilterWithStartDateOnlyReturnsWhereClause() {
201         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
202
203         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
204         assertThat(sql, is(" WHERE TIME>'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'"));
205     }
206
207     @Test
208     public void testResolveTimeFilterWithEndDateOnlyReturnsWhereClause() {
209         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
210
211         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
212         assertThat(sql, is(" WHERE TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
213     }
214
215     @Test
216     public void testResolveTimeFilterWithStartAndEndDateReturnsWhereClauseWithTwoConditions() {
217         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
218         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
219
220         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
221         assertThat(sql, is(" WHERE TIME>'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
222                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
223     }
224
225     private ZonedDateTime parseDateTimeString(String dts) {
226         return ZonedDateTime.of(LocalDateTime.parse(dts, DATE_PARSER), UTC_ZONE_ID);
227     }
228 }