From 8adca69140c4a74b619fc5701a317c77f5bd0dd9 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Feb 2025 13:36:12 +0100 Subject: [PATCH] update unit tests, add analogsensors --- test/test_api/test_api.cpp | 34 +++++++++++++++++++++++++--------- test/test_api/test_api.h | 33 +++++++++++++++++---------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/test/test_api/test_api.cpp b/test/test_api/test_api.cpp index 91ecd0109..54b6461be 100644 --- a/test/test_api/test_api.cpp +++ b/test/test_api/test_api.cpp @@ -22,7 +22,6 @@ #include #include "ESPAsyncWebServer.h" -#include "ESP32React.h" #include "web/WebAPIService.h" using namespace emsesp; @@ -32,7 +31,7 @@ void run_tests(); const char * call_url(const char * url); AsyncWebServer * webServer; -ESP32React * esp32React; +ESP32React * esp32React; WebAPIService * webAPIService; EMSESP application; FS dummyFS; @@ -67,13 +66,13 @@ static TestStream stream; // load the tests // this is generated from this file when compiled with -DEMSESP_UNITY_CREATE // copy the output to the test_api.h file -#include "test_api.h" // generated test functions +#include "test_api.h" -// Unity's setup call - is called before each test +// Unity's setup call - is called before each test - empty for now void setUp() { } -// Unity's teardown call - is called after each test +// Unity's teardown call - is called after each test - empty for now void tearDown() { } @@ -171,7 +170,6 @@ const char * call_url(const char * url) { request.method(HTTP_GET); request.url(url); webAPIService->webAPIService(&request); - return webAPIService->getResponse(); } @@ -187,7 +185,6 @@ const char * call_url(const char * url, const char * data) { request.method(HTTP_POST); request.url(url); webAPIService->webAPIService(&request, json); - return webAPIService->getResponse(); } @@ -268,11 +265,28 @@ void manual_test4() { TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/thermostat", data)); } +void manual_test5() { + auto expected_response = "[{}]"; // empty is good + char data[] = "{\"value\":11}"; + + TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor/test_analogsensor4", data)); +} + +void manual_test6() { + auto expected_response = "[{}]"; // empty is good + char data[] = "{\"value\":10,\"id\":33}"; + + TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor/setvalue", data)); +} + + void run_manual_tests() { RUN_TEST(manual_test1); RUN_TEST(manual_test2); RUN_TEST(manual_test3); RUN_TEST(manual_test4); + RUN_TEST(manual_test5); + RUN_TEST(manual_test6); } const char * run_console_command(const char * command) { @@ -318,8 +332,10 @@ void run_console_tests() { // auto-generate the tests void create_tests() { - // These tests should all pass.... + // These match the calls in test_api.h + // They are all READ calls, no POST or PUT. We use the manual tests for those. + // this first section should all pass capture("/api/boiler"); capture("/api/boiler/commands"); capture("/api/boiler/values"); @@ -406,7 +422,7 @@ void create_tests() { // Main entry point int main() { webServer = new AsyncWebServer(80); - esp32React = new ESP32React(webServer, &dummyFS); + esp32React = new ESP32React(webServer, &dummyFS); webAPIService = new WebAPIService(webServer, esp32React->getSecurityManager()); // Serial console for commands diff --git a/test/test_api/test_api.h b/test/test_api/test_api.h index 0d6ff3ef4..2e8c2b813 100644 --- a/test/test_api/test_api.h +++ b/test/test_api/test_api.h @@ -1,7 +1,6 @@ // ************************************************************************************************** // -// Compile with -DEMSESP_UNITY_CREATE to generate the test functions -// and copy the output and paste below. +// Compile with -DEMSESP_UNITY_CREATE to generate the test functions, copy the output and paste below. // // TODO convert output to JSON and compare, showing differences // @@ -92,7 +91,9 @@ void test_7() { void test_8() { auto expected_response = "[{\"name\":\"outdoortemp\",\"fullname\":\"outside " - "temperature\",\"circuit\":\"\",\"type\":\"number\",\"uom\":\"°C\",\"readable\":true,\"writeable\":false,\"visible\":true}]"; + "temperature\",\"circuit\":\"\",\"type\":\"number\",\"uom\":\"°C\",\"state_class\":\"measurement\",\"device_class\":" + "\"temperature\",\"readable\":true,\"writeable\":false,\"visible\":true}]"; + TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/boiler/outdoortemp")); } @@ -126,15 +127,15 @@ void test_13() { void test_14() { auto expected_response = "[{\"name\":\"seltemp\",\"fullname\":\"hc1 selected room " - "temperature\",\"circuit\":\"hc1\",\"value\":20.5,\"type\":\"number\",\"min\":0,\"max\":30,\"uom\":\"°C\",\"readable\":true," - "\"writeable\":true,\"visible\":true}]"; + "temperature\",\"circuit\":\"hc1\",\"value\":20.5,\"type\":\"number\",\"min\":0,\"max\":30,\"uom\":\"°C\",\"state_class\":" + "\"measurement\",\"device_class\":\"temperature\",\"readable\":true,\"writeable\":true,\"visible\":true}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/thermostat/hc1/seltemp")); } void test_15() { auto expected_response = "[{\"name\":\"seltemp\",\"fullname\":\"hc2 selected room " - "temperature\",\"circuit\":\"hc2\",\"value\":20.6,\"type\":\"number\",\"min\":0,\"max\":30,\"uom\":\"°C\",\"readable\":true," - "\"writeable\":true,\"visible\":true}]"; + "temperature\",\"circuit\":\"hc2\",\"value\":20.6,\"type\":\"number\",\"min\":0,\"max\":30,\"uom\":\"°C\",\"state_class\":" + "\"measurement\",\"device_class\":\"temperature\",\"readable\":true,\"writeable\":true,\"visible\":true}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/thermostat/hc2/seltemp")); } @@ -163,20 +164,20 @@ void test_19() { "\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1,\"haEnabled\":true,\"mqttQos\":0," "\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10,\"publishTimeSolar\":10,\"publishTimeMixer\":" "10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false,\"publish2command\":false,\"sendResponse\":false}," - "\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":2,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0,\"analogSensors\":3," + "\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":2,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0,\"analogSensors\":4," "\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":" "\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"S32\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," - "\"maxWebLogBuffer\":25,\"webLogBuffer\":0,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" + "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" "\"boiler\",\"name\":\"My Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":37,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x2E " "0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":15," "\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 " "0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":2},{\"type\":\"analogsensor\",\"name\":\"analogsensor\"," - "\"entities\":3},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; + "\"entities\":4},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system")); } @@ -189,26 +190,26 @@ void test_20() { "\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1,\"haEnabled\":true,\"mqttQos\":0," "\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10,\"publishTimeSolar\":10,\"publishTimeMixer\":" "10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false,\"publish2command\":false,\"sendResponse\":false}," - "\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":2,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0,\"analogSensors\":3," + "\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":2,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0,\"analogSensors\":4," "\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":" "\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"S32\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," - "\"maxWebLogBuffer\":25,\"webLogBuffer\":0,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" + "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" "\"boiler\",\"name\":\"My Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":37,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x2E " "0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":15," "\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 " "0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":2},{\"type\":\"analogsensor\",\"name\":\"analogsensor\"," - "\"entities\":3},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; + "\"entities\":4},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/info")); } void test_21() { auto expected_response = - "[{\"name\":\"locale\",\"circuit\":\"settings\",\"readable\":true,\"writable\":false,\"visible\":true,\"value\":\"en\",\"type\":\"string\"}]"; + "[{\"name\":\"locale\",\"circuit\":\"settings\",\"readable\":true,\"writeable\":false,\"visible\":true,\"value\":\"en\",\"type\":\"string\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/settings/locale")); } @@ -267,12 +268,12 @@ void test_31() { } void test_32() { - auto expected_response = "[{\"test_analogsensor1\":0,\"test_analogsensor2\":1,\"test_analogsensor3\":0}]"; + auto expected_response = "[{\"test_analogsensor1\":0,\"test_analogsensor2\":1,\"test_analogsensor3\":0,\"test_analogsensor4\":0}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor")); } void test_33() { - auto expected_response = "[{\"test_analogsensor1\":0,\"test_analogsensor2\":1,\"test_analogsensor3\":0}]"; + auto expected_response = "[{\"test_analogsensor1\":0,\"test_analogsensor2\":1,\"test_analogsensor3\":0,\"test_analogsensor4\":0}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor/info")); }