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.dynamodb.internal;
15 import static org.junit.jupiter.api.Assertions.*;
17 import java.math.BigDecimal;
18 import java.time.ZonedDateTime;
19 import java.util.ArrayList;
20 import java.util.Iterator;
21 import java.util.List;
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.eclipse.jdt.annotation.Nullable;
25 import org.junit.jupiter.api.BeforeAll;
26 import org.junit.jupiter.api.Test;
27 import org.openhab.core.library.items.NumberItem;
28 import org.openhab.core.library.types.DecimalType;
29 import org.openhab.core.persistence.FilterCriteria;
30 import org.openhab.core.persistence.FilterCriteria.Operator;
31 import org.openhab.core.persistence.FilterCriteria.Ordering;
32 import org.openhab.core.persistence.HistoricItem;
36 * @author Sami Salonen - Initial contribution
40 public class PagingIntegrationTest extends BaseIntegrationTest {
42 public static final boolean LEGACY_MODE = false;
43 private static final String NAME = "number";
44 private static final int STATE_COUNT = 10;
46 private static @Nullable ZonedDateTime storeStart;
48 @SuppressWarnings("null")
50 public static void populateData() {
51 storeStart = ZonedDateTime.now();
53 NumberItem item = (NumberItem) ITEMS.get(NAME);
54 for (int i = 0; i < STATE_COUNT; i++) {
55 item.setState(new DecimalType(i));
57 // Add some delay to enforce different timestamps in ms accuracy
59 } catch (InterruptedException e) {
67 @SuppressWarnings("null")
69 public void testPagingFirstPage() {
71 FilterCriteria criteria = new FilterCriteria();
72 criteria.setItemName(NAME);
73 criteria.setBeginDate(storeStart);
74 criteria.setOrdering(Ordering.ASCENDING);
75 criteria.setPageNumber(0);
76 criteria.setPageSize(3);
77 assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2);
81 @SuppressWarnings("null")
83 public void testPagingSecondPage() {
85 FilterCriteria criteria = new FilterCriteria();
86 criteria.setItemName(NAME);
87 criteria.setBeginDate(storeStart);
88 criteria.setOrdering(Ordering.ASCENDING);
89 criteria.setPageNumber(1);
90 criteria.setPageSize(3);
91 assertItemStates(BaseIntegrationTest.service.query(criteria), 3, 4, 5);
95 @SuppressWarnings("null")
97 public void testPagingPagePartialPage() {
99 FilterCriteria criteria = new FilterCriteria();
100 criteria.setItemName(NAME);
101 criteria.setBeginDate(storeStart);
102 criteria.setOrdering(Ordering.ASCENDING);
103 criteria.setPageNumber(3);
104 criteria.setPageSize(3);
105 assertItemStates(BaseIntegrationTest.service.query(criteria), 9);
109 @SuppressWarnings("null")
111 public void testPagingPageOutOfBounds() {
112 waitForAssert(() -> {
113 FilterCriteria criteria = new FilterCriteria();
114 criteria.setItemName(NAME);
115 criteria.setBeginDate(storeStart);
116 criteria.setOrdering(Ordering.ASCENDING);
117 criteria.setPageNumber(4);
118 criteria.setPageSize(3);
119 assertItemStates(BaseIntegrationTest.service.query(criteria)); // no results
123 @SuppressWarnings("null")
125 public void testPagingPage0Descending() {
126 waitForAssert(() -> {
127 FilterCriteria criteria = new FilterCriteria();
128 criteria.setItemName(NAME);
129 criteria.setBeginDate(storeStart);
130 criteria.setOrdering(Ordering.DESCENDING);
131 criteria.setPageNumber(0);
132 criteria.setPageSize(3);
133 assertItemStates(BaseIntegrationTest.service.query(criteria), 9, 8, 7);
137 @SuppressWarnings("null")
139 public void testPagingPage0HugePageSize() {
140 waitForAssert(() -> {
141 FilterCriteria criteria = new FilterCriteria();
142 criteria.setItemName(NAME);
143 criteria.setBeginDate(storeStart);
144 criteria.setOrdering(Ordering.ASCENDING);
145 criteria.setPageNumber(0);
146 criteria.setPageSize(900);
147 assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
151 @SuppressWarnings("null")
153 public void testPagingFirstPageWithFilter() {
154 waitForAssert(() -> {
155 FilterCriteria criteria = new FilterCriteria();
156 criteria.setItemName(NAME);
157 criteria.setBeginDate(storeStart);
158 criteria.setOrdering(Ordering.ASCENDING);
159 criteria.setPageNumber(0);
160 criteria.setPageSize(3);
161 criteria.setOperator(Operator.GT);
162 criteria.setState(new DecimalType(new BigDecimal(3)));
163 assertItemStates(BaseIntegrationTest.service.query(criteria), 4, 5, 6);
167 private void assertItemStates(Iterable<HistoricItem> actualIterable, int... expected) {
168 Iterator<HistoricItem> actualIterator = actualIterable.iterator();
169 List<DecimalType> expectedStates = new ArrayList<>();
170 List<DecimalType> actualStates = new ArrayList<>();
171 for (int expectedState : expected) {
172 assertTrue(actualIterator.hasNext());
173 HistoricItem actual = actualIterator.next();
174 expectedStates.add(new DecimalType(expectedState));
175 actualStates.add((DecimalType) actual.getState());
177 assertEquals(expectedStates, actualStates);
178 assertFalse(actualIterator.hasNext());