]> git.basschouten.com Git - openhab-addons.git/blob
1b58e6243ea4b89b74649c95a0d22fcbe811e4fd
[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
18 import java.time.LocalDateTime;
19 import java.time.ZoneId;
20 import java.time.ZonedDateTime;
21 import java.time.format.DateTimeFormatter;
22
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.junit.jupiter.api.BeforeEach;
25 import org.junit.jupiter.api.Test;
26 import org.openhab.core.persistence.FilterCriteria;
27 import org.openhab.core.persistence.FilterCriteria.Ordering;
28
29 /**
30  * Tests the {@link JdbcBaseDAO}.
31  *
32  * @author Christoph Weitkamp - Initial contribution
33  */
34 @NonNullByDefault
35 public class JdbcBaseDAOTest {
36
37     private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
38     private static final DateTimeFormatter DATE_PARSER = DateTimeFormatter.ofPattern(DATE_PATTERN);
39     private static final ZoneId UTC_ZONE_ID = ZoneId.of("UTC");
40     private static final String DB_TABLE_NAME = "testitem";
41
42     private final JdbcBaseDAO jdbcBaseDAO = new JdbcBaseDAO();
43     private @NonNullByDefault({}) FilterCriteria filter;
44
45     @BeforeEach
46     public void setup() {
47         filter = new FilterCriteria();
48     }
49
50     @Test
51     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
52         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
53         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time DESC"));
54     }
55
56     @Test
57     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseAscendingOrder() {
58         filter.setOrdering(Ordering.ASCENDING);
59
60         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
61         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time ASC"));
62     }
63
64     @Test
65     public void testHistItemFilterQueryProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClauseDescendingOrder() {
66         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
67         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
68
69         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
70         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " WHERE TIME>'" //
71                 + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
72                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "' ORDER BY time DESC"));
73     }
74
75     @Test
76     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrderAndLimit() {
77         filter.setPageSize(1);
78
79         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
80         assertThat(sql, is("SELECT time, value FROM " + DB_TABLE_NAME + " ORDER BY time DESC LIMIT 0,1"));
81     }
82
83     @Test
84     public void testHistItemFilterDeleteProviderReturnsDeleteQueryWithoutWhereClause() {
85         String sql = jdbcBaseDAO.histItemFilterDeleteProvider(filter, DB_TABLE_NAME, UTC_ZONE_ID);
86         assertThat(sql, is("DELETE FROM " + DB_TABLE_NAME));
87     }
88
89     @Test
90     public void testHistItemFilterDeleteProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClause() {
91         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
92         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
93
94         String sql = jdbcBaseDAO.histItemFilterDeleteProvider(filter, DB_TABLE_NAME, UTC_ZONE_ID);
95         assertThat(sql, is("DELETE FROM " + DB_TABLE_NAME + " WHERE TIME>'" //
96                 + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
97                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
98     }
99
100     @Test
101     public void testResolveTimeFilterWithNoDatesReturnsEmptyString() {
102         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
103         assertThat(sql, is(""));
104     }
105
106     @Test
107     public void testResolveTimeFilterWithStartDateOnlyReturnsWhereClause() {
108         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
109
110         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
111         assertThat(sql, is(" WHERE TIME>'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'"));
112     }
113
114     @Test
115     public void testResolveTimeFilterWithEndDateOnlyReturnsWhereClause() {
116         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
117
118         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
119         assertThat(sql, is(" WHERE TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
120     }
121
122     @Test
123     public void testResolveTimeFilterWithStartAndEndDateReturnsWhereClauseWithTwoConditions() {
124         filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
125         filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
126
127         String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
128         assertThat(sql, is(" WHERE TIME>'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'" //
129                 + " AND TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
130     }
131
132     private ZonedDateTime parseDateTimeString(String dts) {
133         return ZonedDateTime.of(LocalDateTime.parse(dts, DATE_PARSER), UTC_ZONE_ID);
134     }
135 }