]> git.basschouten.com Git - openhab-addons.git/blob
813558bc9d3217cb484527bff03d0a3afd328b94
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.dynamodb.internal;
14
15 import static org.junit.jupiter.api.Assertions.*;
16
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;
22 import java.util.Objects;
23
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.junit.jupiter.api.BeforeAll;
27 import org.junit.jupiter.api.Test;
28 import org.openhab.core.library.items.NumberItem;
29 import org.openhab.core.library.types.DecimalType;
30 import org.openhab.core.persistence.FilterCriteria;
31 import org.openhab.core.persistence.FilterCriteria.Operator;
32 import org.openhab.core.persistence.FilterCriteria.Ordering;
33 import org.openhab.core.persistence.HistoricItem;
34
35 /**
36  *
37  * @author Sami Salonen - Initial contribution
38  *
39  */
40 @NonNullByDefault
41 public class PagingIntegrationTest extends BaseIntegrationTest {
42
43     public static final boolean LEGACY_MODE = false;
44     private static final String NAME = "number";
45     private static final int STATE_COUNT = 10;
46
47     private static @Nullable ZonedDateTime storeStart;
48
49     @SuppressWarnings("null")
50     @BeforeAll
51     public static void populateData() {
52         storeStart = ZonedDateTime.now();
53
54         NumberItem item = (NumberItem) ITEMS.get(NAME);
55         for (int i = 0; i < STATE_COUNT; i++) {
56             item.setState(new DecimalType(i));
57             try {
58                 // Add some delay to enforce different timestamps in ms accuracy
59                 Thread.sleep(5);
60             } catch (InterruptedException e) {
61                 fail("Interrupted");
62                 return;
63             }
64             service.store(item);
65         }
66     }
67
68     @SuppressWarnings("null")
69     @Test
70     public void testPagingFirstPage() {
71         waitForAssert(() -> {
72             FilterCriteria criteria = new FilterCriteria();
73             criteria.setItemName(NAME);
74             criteria.setBeginDate(Objects.requireNonNull(storeStart));
75             criteria.setOrdering(Ordering.ASCENDING);
76             criteria.setPageNumber(0);
77             criteria.setPageSize(3);
78             assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2);
79         });
80     }
81
82     @SuppressWarnings("null")
83     @Test
84     public void testPagingSecondPage() {
85         waitForAssert(() -> {
86             FilterCriteria criteria = new FilterCriteria();
87             criteria.setItemName(NAME);
88             criteria.setBeginDate(Objects.requireNonNull(storeStart));
89             criteria.setOrdering(Ordering.ASCENDING);
90             criteria.setPageNumber(1);
91             criteria.setPageSize(3);
92             assertItemStates(BaseIntegrationTest.service.query(criteria), 3, 4, 5);
93         });
94     }
95
96     @SuppressWarnings("null")
97     @Test
98     public void testPagingPagePartialPage() {
99         waitForAssert(() -> {
100             FilterCriteria criteria = new FilterCriteria();
101             criteria.setItemName(NAME);
102             criteria.setBeginDate(Objects.requireNonNull(storeStart));
103             criteria.setOrdering(Ordering.ASCENDING);
104             criteria.setPageNumber(3);
105             criteria.setPageSize(3);
106             assertItemStates(BaseIntegrationTest.service.query(criteria), 9);
107         });
108     }
109
110     @SuppressWarnings("null")
111     @Test
112     public void testPagingPageOutOfBounds() {
113         waitForAssert(() -> {
114             FilterCriteria criteria = new FilterCriteria();
115             criteria.setItemName(NAME);
116             criteria.setBeginDate(Objects.requireNonNull(storeStart));
117             criteria.setOrdering(Ordering.ASCENDING);
118             criteria.setPageNumber(4);
119             criteria.setPageSize(3);
120             assertItemStates(BaseIntegrationTest.service.query(criteria)); // no results
121         });
122     }
123
124     @SuppressWarnings("null")
125     @Test
126     public void testPagingPage0Descending() {
127         waitForAssert(() -> {
128             FilterCriteria criteria = new FilterCriteria();
129             criteria.setItemName(NAME);
130             criteria.setBeginDate(Objects.requireNonNull(storeStart));
131             criteria.setOrdering(Ordering.DESCENDING);
132             criteria.setPageNumber(0);
133             criteria.setPageSize(3);
134             assertItemStates(BaseIntegrationTest.service.query(criteria), 9, 8, 7);
135         });
136     }
137
138     @SuppressWarnings("null")
139     @Test
140     public void testPagingPage0HugePageSize() {
141         waitForAssert(() -> {
142             FilterCriteria criteria = new FilterCriteria();
143             criteria.setItemName(NAME);
144             criteria.setBeginDate(Objects.requireNonNull(storeStart));
145             criteria.setOrdering(Ordering.ASCENDING);
146             criteria.setPageNumber(0);
147             criteria.setPageSize(900);
148             assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
149         });
150     }
151
152     @SuppressWarnings("null")
153     @Test
154     public void testPagingFirstPageWithFilter() {
155         waitForAssert(() -> {
156             FilterCriteria criteria = new FilterCriteria();
157             criteria.setItemName(NAME);
158             criteria.setBeginDate(Objects.requireNonNull(storeStart));
159             criteria.setOrdering(Ordering.ASCENDING);
160             criteria.setPageNumber(0);
161             criteria.setPageSize(3);
162             criteria.setOperator(Operator.GT);
163             criteria.setState(new DecimalType(new BigDecimal(3)));
164             assertItemStates(BaseIntegrationTest.service.query(criteria), 4, 5, 6);
165         });
166     }
167
168     private void assertItemStates(Iterable<HistoricItem> actualIterable, int... expected) {
169         Iterator<HistoricItem> actualIterator = actualIterable.iterator();
170         List<DecimalType> expectedStates = new ArrayList<>();
171         List<DecimalType> actualStates = new ArrayList<>();
172         for (int expectedState : expected) {
173             assertTrue(actualIterator.hasNext());
174             HistoricItem actual = actualIterator.next();
175             expectedStates.add(new DecimalType(expectedState));
176             actualStates.add((DecimalType) actual.getState());
177         }
178         assertEquals(expectedStates, actualStates);
179         assertFalse(actualIterator.hasNext());
180     }
181 }