]> git.basschouten.com Git - openhab-addons.git/blob
52b6e1b7da33dbb8989c2e34b7151ffb8ed80f23
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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 import static org.junit.jupiter.api.Assumptions.assumeTrue;
17
18 import java.math.BigDecimal;
19 import java.time.ZonedDateTime;
20 import java.util.Arrays;
21 import java.util.Iterator;
22 import java.util.LinkedList;
23 import java.util.List;
24
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.eclipse.jdt.annotation.Nullable;
27 import org.junit.jupiter.api.BeforeAll;
28 import org.junit.jupiter.api.Test;
29 import org.openhab.core.library.items.NumberItem;
30 import org.openhab.core.library.types.DecimalType;
31 import org.openhab.core.persistence.FilterCriteria;
32 import org.openhab.core.persistence.FilterCriteria.Operator;
33 import org.openhab.core.persistence.FilterCriteria.Ordering;
34 import org.openhab.core.persistence.HistoricItem;
35
36 /**
37  *
38  * @author Sami Salonen - Initial contribution
39  *
40  */
41 @NonNullByDefault
42 public class PagingIntegrationTest extends BaseIntegrationTest {
43
44     private static final String NAME = "number";
45     private static final int STATE_COUNT = 10;
46
47     private static @Nullable ZonedDateTime storeStart;
48
49     @BeforeAll
50     public static void checkService() throws InterruptedException {
51         String msg = "DynamoDB integration tests will be skipped. Did you specify AWS credentials for testing? "
52                 + "See BaseIntegrationTest for more details";
53         if (service == null) {
54             System.out.println(msg);
55         }
56         assumeTrue(service != null, msg);
57
58         populateData();
59     }
60
61     public static void populateData() {
62         storeStart = ZonedDateTime.now();
63
64         NumberItem item = (NumberItem) ITEMS.get(NAME);
65
66         for (int i = 0; i < STATE_COUNT; i++) {
67             item.setState(new DecimalType(i));
68             service.store(item);
69         }
70     }
71
72     @Test
73     public void testPagingFirstPage() {
74         FilterCriteria criteria = new FilterCriteria();
75         criteria.setItemName(NAME);
76         criteria.setBeginDate(storeStart);
77         criteria.setOrdering(Ordering.ASCENDING);
78         criteria.setPageNumber(0);
79         criteria.setPageSize(3);
80         assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2);
81     }
82
83     @Test
84     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);
92     }
93
94     @Test
95     public void testPagingPagePartialPage() {
96         FilterCriteria criteria = new FilterCriteria();
97         criteria.setItemName(NAME);
98         criteria.setBeginDate(storeStart);
99         criteria.setOrdering(Ordering.ASCENDING);
100         criteria.setPageNumber(3);
101         criteria.setPageSize(3);
102         assertItemStates(BaseIntegrationTest.service.query(criteria), 9);
103     }
104
105     @Test
106     public void testPagingPageOutOfBounds() {
107         FilterCriteria criteria = new FilterCriteria();
108         criteria.setItemName(NAME);
109         criteria.setBeginDate(storeStart);
110         criteria.setOrdering(Ordering.ASCENDING);
111         criteria.setPageNumber(4);
112         criteria.setPageSize(3);
113         assertItemStates(BaseIntegrationTest.service.query(criteria)); // no results
114     }
115
116     @Test
117     public void testPagingPage0Descending() {
118         FilterCriteria criteria = new FilterCriteria();
119         criteria.setItemName(NAME);
120         criteria.setBeginDate(storeStart);
121         criteria.setOrdering(Ordering.DESCENDING);
122         criteria.setPageNumber(0);
123         criteria.setPageSize(3);
124         assertItemStates(BaseIntegrationTest.service.query(criteria), 9, 8, 7);
125     }
126
127     @Test
128     public void testPagingPage0HugePageSize() {
129         FilterCriteria criteria = new FilterCriteria();
130         criteria.setItemName(NAME);
131         criteria.setBeginDate(storeStart);
132         criteria.setOrdering(Ordering.ASCENDING);
133         criteria.setPageNumber(0);
134         criteria.setPageSize(900);
135         assertItemStates(BaseIntegrationTest.service.query(criteria), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
136     }
137
138     @Test
139     public void testPagingFirstPageWithFilter() {
140         FilterCriteria criteria = new FilterCriteria();
141         criteria.setItemName(NAME);
142         criteria.setBeginDate(storeStart);
143         criteria.setOrdering(Ordering.ASCENDING);
144         criteria.setPageNumber(0);
145         criteria.setPageSize(3);
146         criteria.setOperator(Operator.GT);
147         criteria.setState(new DecimalType(new BigDecimal(3)));
148         assertItemStates(BaseIntegrationTest.service.query(criteria), 4, 5, 6);
149     }
150
151     private void assertItemStates(Iterable<HistoricItem> actualIterable, int... expected) {
152         Iterator<HistoricItem> actualIterator = actualIterable.iterator();
153         List<HistoricItem> got = new LinkedList<HistoricItem>();
154         for (int expectedState : expected) {
155             assertTrue(actualIterator.hasNext());
156             HistoricItem actual = actualIterator.next();
157             assertEquals(new DecimalType(expectedState), actual.getState());
158             got.add(actual);
159         }
160         if (actualIterator.hasNext()) {
161             fail("Did not expect any more items, but got at least this extra element: "
162                     + actualIterator.next().toString() + ". Before this we got: " + Arrays.toString(got.toArray()));
163         }
164     }
165 }