]> git.basschouten.com Git - openhab-addons.git/blob
c0f942de10dd36e8fc3d4f3f607bdf0486a8d6ea
[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
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;
33
34 /**
35  *
36  * @author Sami Salonen - Initial contribution
37  *
38  */
39 @NonNullByDefault
40 public class PagingIntegrationTest extends BaseIntegrationTest {
41
42     public static final boolean LEGACY_MODE = false;
43     private static final String NAME = "number";
44     private static final int STATE_COUNT = 10;
45
46     private static @Nullable ZonedDateTime storeStart;
47
48     @SuppressWarnings("null")
49     @BeforeAll
50     public static void populateData() {
51         storeStart = ZonedDateTime.now();
52
53         NumberItem item = (NumberItem) ITEMS.get(NAME);
54         for (int i = 0; i < STATE_COUNT; i++) {
55             item.setState(new DecimalType(i));
56             try {
57                 // Add some delay to enforce different timestamps in ms accuracy
58                 Thread.sleep(5);
59             } catch (InterruptedException e) {
60                 fail("Interrupted");
61                 return;
62             }
63             service.store(item);
64         }
65     }
66
67     @SuppressWarnings("null")
68     @Test
69     public void testPagingFirstPage() {
70         waitForAssert(() -> {
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);
78         });
79     }
80
81     @SuppressWarnings("null")
82     @Test
83     public void testPagingSecondPage() {
84         waitForAssert(() -> {
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);
92         });
93     }
94
95     @SuppressWarnings("null")
96     @Test
97     public void testPagingPagePartialPage() {
98         waitForAssert(() -> {
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);
106         });
107     }
108
109     @SuppressWarnings("null")
110     @Test
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
120         });
121     }
122
123     @SuppressWarnings("null")
124     @Test
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);
134         });
135     }
136
137     @SuppressWarnings("null")
138     @Test
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);
148         });
149     }
150
151     @SuppressWarnings("null")
152     @Test
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);
164         });
165     }
166
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());
176         }
177         assertEquals(expectedStates, actualStates);
178         assertFalse(actualIterator.hasNext());
179     }
180 }