2 * Copyright (c) 2010-2022 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.jdbc.db;
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
18 import java.time.LocalDateTime;
19 import java.time.ZoneId;
20 import java.time.ZonedDateTime;
21 import java.time.format.DateTimeFormatter;
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;
30 * Tests the {@link JdbcBaseDAO}.
32 * @author Christoph Weitkamp - Initial contribution
35 public class JdbcBaseDAOTest {
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";
42 private final JdbcBaseDAO jdbcBaseDAO = new JdbcBaseDAO();
43 private @NonNullByDefault({}) FilterCriteria filter;
47 filter = new FilterCriteria();
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"));
57 public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseAscendingOrder() {
58 filter.setOrdering(Ordering.ASCENDING);
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"));
65 public void testHistItemFilterQueryProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClauseDescendingOrder() {
66 filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
67 filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
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"));
76 public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrderAndLimit() {
77 filter.setPageSize(1);
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"));
84 public void testHistItemFilterDeleteProviderReturnsDeleteQueryWithoutWhereClause() {
85 String sql = jdbcBaseDAO.histItemFilterDeleteProvider(filter, DB_TABLE_NAME, UTC_ZONE_ID);
86 assertThat(sql, is("TRUNCATE TABLE " + DB_TABLE_NAME));
90 public void testHistItemFilterDeleteProviderWithStartAndEndDateReturnsDeleteQueryWithWhereClause() {
91 filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
92 filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
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()) + "'"));
101 public void testResolveTimeFilterWithNoDatesReturnsEmptyString() {
102 String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
103 assertThat(sql, is(""));
107 public void testResolveTimeFilterWithStartDateOnlyReturnsWhereClause() {
108 filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
110 String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
111 assertThat(sql, is(" WHERE TIME>'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'"));
115 public void testResolveTimeFilterWithEndDateOnlyReturnsWhereClause() {
116 filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
118 String sql = jdbcBaseDAO.resolveTimeFilter(filter, UTC_ZONE_ID);
119 assertThat(sql, is(" WHERE TIME<'" + JdbcBaseDAO.JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'"));
123 public void testResolveTimeFilterWithStartAndEndDateReturnsWhereClauseWithTwoConditions() {
124 filter.setBeginDate(parseDateTimeString("2022-01-10T15:01:44"));
125 filter.setEndDate(parseDateTimeString("2022-01-15T15:01:44"));
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()) + "'"));
132 private ZonedDateTime parseDateTimeString(String dts) {
133 return ZonedDateTime.of(LocalDateTime.parse(dts, DATE_PARSER), UTC_ZONE_ID);