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.binding.ecowatt.internal;
15 import static org.junit.jupiter.api.Assertions.*;
17 import java.io.IOException;
18 import java.io.InputStream;
19 import java.nio.charset.StandardCharsets;
20 import java.time.OffsetDateTime;
21 import java.time.ZonedDateTime;
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.eclipse.jdt.annotation.Nullable;
25 import org.junit.jupiter.api.BeforeEach;
26 import org.junit.jupiter.api.Test;
27 import org.openhab.binding.ecowatt.internal.handler.EcowattHandler;
28 import org.openhab.binding.ecowatt.internal.restapi.EcowattApiResponse;
29 import org.openhab.core.library.types.DecimalType;
30 import org.openhab.core.types.State;
31 import org.openhab.core.types.UnDefType;
33 import com.google.gson.Gson;
34 import com.google.gson.GsonBuilder;
35 import com.google.gson.JsonDeserializer;
38 * Tests of methods getting channel state from API response
40 * @author Laurent Garnier - Initial contribution
43 public class EcowattApiResponseTest {
45 private static final DecimalType STATE_ZERO = new DecimalType(0);
46 private static final DecimalType STATE_ONE = new DecimalType(1);
47 private static final DecimalType STATE_TWO = new DecimalType(2);
48 private static final DecimalType STATE_THREE = new DecimalType(3);
50 private final Gson gson = new GsonBuilder().registerTypeAdapter(ZonedDateTime.class,
51 (JsonDeserializer<ZonedDateTime>) (json, type, jsonDeserializationContext) -> OffsetDateTime
52 .parse(json.getAsJsonPrimitive().getAsString()).toZonedDateTime())
54 private static @Nullable EcowattApiResponse apiResponse;
57 public void loadApiResponse() throws IOException {
58 InputStream resourceStream = getClass().getResourceAsStream("/ApiResponse.json");
59 assertNotNull(resourceStream);
60 final String response = new String(resourceStream.readAllBytes(), StandardCharsets.UTF_8);
61 apiResponse = gson.fromJson(response, EcowattApiResponse.class);
62 assertNotNull(apiResponse);
66 public void getDaySignalStateWithNullResponse() {
67 assertEquals(UnDefType.UNDEF,
68 EcowattHandler.getDaySignalState(null, ZonedDateTime.parse("2022-09-19T21:30:00+02:00")));
72 public void getDaySignalStateWithSameOffset() {
73 ZonedDateTime dateTime = ZonedDateTime.parse("2022-09-19T21:30:00+02:00");
74 assertEquals(UnDefType.UNDEF, EcowattHandler.getDaySignalState(apiResponse, dateTime.minusDays(1)));
75 assertEquals(STATE_THREE, EcowattHandler.getDaySignalState(apiResponse, dateTime));
76 assertEquals(STATE_TWO, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(1)));
77 assertEquals(STATE_ONE, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(2)));
78 assertEquals(STATE_ONE, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(3)));
79 assertEquals(UnDefType.UNDEF, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(4)));
83 public void getDaySignalStateWithOtherOffset() {
84 ZonedDateTime dateTime = ZonedDateTime.parse("2022-09-20T00:30:00+05:00");
85 assertEquals(UnDefType.UNDEF, EcowattHandler.getDaySignalState(apiResponse, dateTime.minusDays(1)));
86 assertEquals(STATE_THREE, EcowattHandler.getDaySignalState(apiResponse, dateTime));
87 assertEquals(STATE_TWO, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(1)));
88 assertEquals(STATE_ONE, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(2)));
89 assertEquals(STATE_ONE, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(3)));
90 assertEquals(UnDefType.UNDEF, EcowattHandler.getDaySignalState(apiResponse, dateTime.plusDays(4)));
94 public void getHourSignalStateWithNullResponse() {
95 assertEquals(UnDefType.UNDEF,
96 EcowattHandler.getHourSignalState(null, ZonedDateTime.parse("2022-09-19T00:30:00+02:00")));
100 public void getHourSignalStateWithSameOffset() {
101 ZonedDateTime dateTime = ZonedDateTime.parse("2022-09-19T00:30:00+02:00");
103 assertEquals(UnDefType.UNDEF, EcowattHandler.getHourSignalState(apiResponse, dateTime.minusHours(1)));
106 for (int h = 0; h < 24; h++) {
110 expectedState = STATE_ZERO;
116 expectedState = STATE_TWO;
122 expectedState = STATE_THREE;
125 expectedState = STATE_ONE;
127 assertEquals(expectedState, EcowattHandler.getHourSignalState(apiResponse, dateTime.plusHours(h)));
130 dateTime = dateTime.plusDays(1);
131 for (int h = 0; h < 24; h++) {
132 expectedState = h == 20 ? STATE_TWO : STATE_ONE;
133 assertEquals(expectedState, EcowattHandler.getHourSignalState(apiResponse, dateTime.plusHours(h)));
136 dateTime = dateTime.plusDays(1);
137 for (int h = 0; h < 24; h++) {
138 expectedState = STATE_ONE;
139 assertEquals(expectedState, EcowattHandler.getHourSignalState(apiResponse, dateTime.plusHours(h)));
142 dateTime = dateTime.plusDays(1);
143 for (int h = 0; h < 24; h++) {
144 expectedState = h == 23 ? UnDefType.UNDEF : STATE_ONE;
145 assertEquals(expectedState, EcowattHandler.getHourSignalState(apiResponse, dateTime.plusHours(h)));
148 dateTime = dateTime.plusDays(1);
149 assertEquals(UnDefType.UNDEF, EcowattHandler.getHourSignalState(apiResponse, dateTime));
153 public void getHourSignalStateWithOtherOffset() {
154 ZonedDateTime dateTime = ZonedDateTime.parse("2022-09-19T00:30:00+05:00");
156 for (int h = 0; h < 24; h++) {
161 expectedState = UnDefType.UNDEF;
165 expectedState = STATE_ZERO;
170 expectedState = STATE_TWO;
176 expectedState = STATE_THREE;
179 expectedState = STATE_ONE;
181 assertEquals(expectedState, EcowattHandler.getHourSignalState(apiResponse, dateTime.plusHours(h)));