diff --git a/platformio.ini b/platformio.ini index 124c982..ca02814 100644 --- a/platformio.ini +++ b/platformio.ini @@ -103,7 +103,7 @@ lib_deps = board = ${common_env_data.board} build_type = release board_build.filesystem = littlefs -build_src_filter = +<*> - +build_src_filter = +<*> -<../test/tests*.cpp> [env:gravity-unit] upload_speed = ${common_env_data.upload_speed} @@ -122,7 +122,7 @@ lib_deps = board = ${common_env_data.board} build_type = release board_build.filesystem = littlefs -build_src_filter = +<*> - +build_src_filter = +<*> - +<../test/tests*.cpp> [env:gravity32-release] framework = ${common_env_data.framework} @@ -156,7 +156,6 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - [env:gravity32c3-release] framework = ${common_env_data.framework} @@ -190,7 +189,6 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - [env:gravity32c3v1-release] framework = ${common_env_data.framework} @@ -225,7 +223,6 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - [env:gravity32s2-release] framework = ${common_env_data.framework} @@ -258,7 +255,6 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - [env:gravity32c3-debug] framework = ${common_env_data.framework} @@ -307,7 +303,6 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - # This is a version for the floaty hardware. No DSB18 sensor and no battery measurement. [env:gravity32lite-release] @@ -342,4 +337,3 @@ board_build.embed_txtfiles = html/about.min.htm html/index.min.htm html/test.min.htm -build_src_filter = +<*> - diff --git a/src/tests/apitests.py b/src/tests/apitests.py deleted file mode 100644 index c415135..0000000 --- a/src/tests/apitests.py +++ /dev/null @@ -1,640 +0,0 @@ -import unittest, requests, json, time - -# Update these to match the IP of your device (ID will be read from the device at startup) -host = "192.168.1.212" -id = "" -ver = "1.2.0" - -def call_api_post( path, json ): - url = "http://" + host + path - return requests.post( url, data=json ) - -def call_api_get( path ): - url = "http://" + host + path - return requests.get( url ) - -class API(unittest.TestCase): - - # Do factory reset for testing - def test_factory(self): - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - r = call_api_get( "/api/factory?id=" + j["id"]) - time.sleep(4) - - # Check that all parameters exist - def test_status(self): - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["wifi-ssid"], "@home") - self.assertNotEqual(j["angle"], 0) - self.assertNotEqual(j["gravity"], 2) - self.assertNotEqual(j["temp-c"], 0) - self.assertNotEqual(j["temp-f"], 0) - self.assertNotEqual(j["battery"], 0) - self.assertNotEqual(j["temp-format"], "") - self.assertNotEqual(j["gravity-format"], "") - self.assertNotEqual(j["sleep-mode"], True) - self.assertNotEqual(j["rssi"], 0) - self.assertNotEqual(j["app-ver"], "0.0.0") - self.assertNotEqual(j["app-build"], "test") - self.assertNotEqual(j["mdns"], "") - self.assertNotEqual(j["platform"], "") - self.assertNotEqual(j["runtime-average"], -1) - - # Check that all parameters exist - def test_config_1(self): - j = { "id": id, "http-push": "https://push.me", "token": "mytoken", "token2": "mytoken2", "http-push2": "http://push.me", "http-push3": "http://push.me", "influxdb2-push": "http://influx.db", "influxdb2-org": "my-org", - "influxdb2-bucket": "my-bucket", "influxdb2-auth": "my-secret", "mqtt-push": "mqtt.com", "mqtt-port": 1883, "mqtt-user": "my-user", - "mqtt-pass": "my-pass", "http-push-h1": "header1", "http-push-h2": "header2", "http-push2-h1": "header1(2)", "http-push2-h2": "header2(2)" } - r = call_api_post( "/api/config/push", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["http-push-h1"], "header1") - self.assertEqual(j["http-push-h2"], "header2") - self.assertEqual(j["http-push2-h1"], "header1(2)") - self.assertEqual(j["http-push2-h2"], "header2(2)") - - # Check that all parameters exist - def test_config_2(self): - j = { "id": id, "mdns": "gravmon", "temp-format": "C", "sleep-interval": 300 } - r = call_api_post( "/api/config/device", j ) - self.assertEqual(r.status_code, 200) - - def test_config_3(self): - j = { "id": id, "http-push": "https://push.me", "token": "mytoken", "token2": "mytoken2", "http-push2": "http://push.me", "http-push3": "http://push.me", "influxdb2-push": "http://influx.db", "influxdb2-org": "my-org", - "influxdb2-bucket": "my-bucket", "influxdb2-auth": "my-secret", "mqtt-push": "mqtt.com", "mqtt-port": 1883, "mqtt-user": "my-user", - "mqtt-pass": "my-pass" } - r = call_api_post( "/api/config/push", j ) - self.assertEqual(r.status_code, 200) - - def test_config_4(self): - j = { "id": id, "ota-url": "http://ota.url/path", "voltage-factor": 1.55, "temp-adjustment-value": -2, "gyro-temp": "on", "ble": "color" } - r = call_api_post( "/api/config/hardware", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["ble"], "color") - self.assertEqual(j["ota-url"], "http://ota.url/path") - self.assertEqual(j["voltage-factor"], 1.55) - self.assertEqual(j["temp-adjustment-value"], -2) - self.assertEqual(j["gyro-temp"], True) - # These are read only here, just checking them. - self.assertNotEqual(j["gyro-calibration-data"]["ax"], 0.0001) - self.assertNotEqual(j["gyro-calibration-data"]["ay"], 0.0001) - self.assertNotEqual(j["gyro-calibration-data"]["az"], 0.0001) - self.assertNotEqual(j["gyro-calibration-data"]["gx"], 0.0001) - self.assertNotEqual(j["gyro-calibration-data"]["gy"], 0.0001) - self.assertNotEqual(j["gyro-calibration-data"]["gz"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a1"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a2"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a3"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a4"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a5"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a6"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a7"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a8"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a9"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["a10"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g1"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g2"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g3"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g4"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g5"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g6"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g7"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g8"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g9"], 0.0001) - self.assertNotEqual(j["formula-calculation-data"]["g10"], 0.0001) - self.assertNotEqual(j["angle"], 0) - self.assertNotEqual(j["gravity"], -10) - self.assertNotEqual(j["battery"], 0) - - def test_config_5(self): - j = { "id": id, "gravity-formula": "my-formula", "gravity-temp-adjustment": "on", "gravity-format": "G" } - r = call_api_post( "/api/config/gravity", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["gravity-format"], "G") - self.assertEqual(j["gravity-formula"], "my-formula") - self.assertEqual(j["gravity-temp-adjustment"], True) - - def test_config_6(self): - j = { "id": id, "mdns": "gravmon", "temp-format": "F", "sleep-interval": 300 } - r = call_api_post( "/api/config/device", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["mdns"], "gravmon") - self.assertEqual(j["wifi-ssid"], "@home") - self.assertEqual(j["wifi-pass"], "") # Should not be displayed in API - self.assertEqual(j["temp-format"], "F") - self.assertEqual(j["sleep-interval"], 300) - - def test_config_7(self): - j = { "id": id, "ota-url": "", "voltage-factor": 1.55, "temp-adjustment-value": -2, "gyro-temp": "off", "ble": "blue" } - r = call_api_post( "/api/config/hardware", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["ble"], "blue") - self.assertEqual(j["ota-url"], "") - self.assertEqual(j["voltage-factor"], 1.55) - self.assertEqual(j["temp-adjustment-value"], -2) - self.assertEqual(j["gyro-temp"], False) - - def test_config_8(self): - j = { "id": id, "gravity-formula": "", "gravity-temp-adjustment": "off", "gravity-format": "P" } - r = call_api_post( "/api/config/gravity", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-format"], "P") - self.assertEqual(j["gravity-temp-adjustment"], False) - self.assertEqual(j["gravity-formula"], "") - - def test_config_9(self): - j = { "id": id, "gravity-temp-adjustment": "on" } - r = call_api_post( "/api/config/gravity", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-temp-adjustment"], True) - - j = { "id": id } # No checkbox tag should set it to false. - r = call_api_post( "/api/config/gravity", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-temp-adjustment"], False) - - def test_config_A(self): - j = { "id": id, "gyro-temp": "on" } - r = call_api_post( "/api/config/hardware", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gyro-temp"], True) - - j = { "id": id } # No checkbox tag should set it to false. - r = call_api_post( "/api/config/hardware", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gyro-temp"], False) - - # Check formula api (sg mode) - def test_formula_sg_1(self): - # Ensure we have SG defined as gravity - j = { "id": id, "gravity-formula": "", "gravity-temp-adjustment": "off", "gravity-format": "G" } - r = call_api_post("/api/config/gravity", j) - self.assertEqual(r.status_code, 200) - - def test_formula_sg_2(self): - # Fails due to wrong id - j = { "id": "wrong", "g1": 0, "g2": 1, "g3": 1.02, "g4": 1.0333, "g5": 1.00011, "g6": 1, "g7": 1, "g8": 1, "g9": 1, "g10": 1, "a1": 0, "a2": 25, "a3": 25.5, "a4": 25.55, "a5": 25.555, "a6": 0, "a7": 0, "a8": 0, "a9": 0, "a10": 0, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertNotEqual(r.status_code, 200) - - # Fails due to to few values - j = { "id": id, "g1": 0, "g2": 1, "g3": 1.02, "g4": 1.0333, "g5": 1.00011, "g6": 1, "g7": 1, "g8": 1, "g9": 1, "g10": 1, "a1": 0, "a2": 25, "a3": 0, "a4": 0, "a5": 0, "a6": 0, "a7": 0, "a8": 0, "a9": 0, "a10": 0, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - # Checks that values from last call was stored - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - #print(j) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-formula"], "") - self.assertEqual(j["error"], "Not enough values to create formula, need at least 3 angles.") - - def test_formula_sg_3(self): - # Check a simple formula - j = { "id": id, "g1": 1.0, "g2": 1.01, "g3": 1.02, "g4": 1.03, "g5": 1.04, "g6": 1.05, "g7": 1.06, "g8": 1.07, "g9": 1.08, "g10": 1.1, "a1": 25, "a2": 30, "a3": 35, "a4": 40, "a5": 45, "a6": 50, "a7": 55, "a8": 60, "a9": 65, "a10": 70, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - #print( j ) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-formula"], "0.00000909*tilt^2+0.00124545*tilt+0.96445455") - - # Check formula api (plato mode) - def test_formula_plato_1(self): - # Ensure we have Plato defined as gravity - j = { "id": id, "gravity-formula": "", "gravity-temp-adjustment": "off", "gravity-format": "P" } - r = call_api_post("/api/config/gravity", j) - self.assertEqual(r.status_code, 200) - - def test_formula_plato_2(self): - # Fails due to to few values - j = { "id": id, "g1": 0, "g2": 3, "g3": 5.3, "g4": 7.44, "g5": 8.555, "g6": 9, "g7": 9.1, "g8": 9.2, "g9": 9.3, "g10": 9.4, "a1": 0, "a2": 25, "a3": 25.5, "a4": 25.55, "a5": 25.555, "a6": 35, "a7": 36, "a8": 37, "a9": 38, "a10": 39, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - # Checks that values from last call was stored - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - #print(j) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["g1"], 0) - self.assertEqual(j["g2"], 3) - self.assertEqual(j["g3"], 5.3) - self.assertEqual(j["g4"], 7.4) - self.assertEqual(j["g5"], 8.6) - self.assertEqual(j["g6"], 9) - self.assertEqual(j["g7"], 9.1) - self.assertEqual(j["g8"], 9.2) - self.assertEqual(j["g9"], 9.3) - self.assertEqual(j["g10"], 9.4) - self.assertEqual(j["a1"], 0) - self.assertEqual(j["a2"], 25) - self.assertEqual(j["a3"], 25.5) - self.assertEqual(j["a4"], 25.55) - self.assertEqual(j["a5"], 25.56) - self.assertEqual(j["a6"], 35) - self.assertEqual(j["a7"], 36) - self.assertEqual(j["a8"], 37) - self.assertEqual(j["a9"], 38) - self.assertEqual(j["a10"], 39) - self.assertEqual(j["gravity-format"], "P") - self.assertEqual(j["gravity-formula"], "-0.00012155*tilt^2+0.00874785*tilt+0.88003318") - self.assertEqual(j["error"], "") - - def test_formula_plato_3(self): - j = { "id": id, "g1": 0, "g2": 3, "g3": 0, "g4": 0, "g5": 0, "g6": 0, "g7": 0, "g8": 0, "g9": 0, "g10": 0, "a1": 0, "a2": 25, "a3": 0, "a4": 0, "a5": 0, "a6": 0, "a7": 0, "a8": 0, "a9": 0, "a10": 0, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - # Checks that values from last call was stored - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - #print(j) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["error"], "Not enough values to create formula, need at least 3 angles.") - - def test_formula_plato_4(self): - # Ensure we have Plato defined as gravity - j = { "id": id, "gravity-formula": "", "gravity-temp-adjustment": "off", "gravity-format": "P" } - r = call_api_post("/api/config/gravity", j) - self.assertEqual(r.status_code, 200) - - # Check a simple formula - j = { "id": id, "g1": 1.0, "g2": 1.1, "g3": 1.2, "g4": 1.3, "g5": 1.4, "g6": 1.5, "g7": 1.6, "g8": 1.7, "g9": 1.8, "g10": 1.9, "a1": 25, "a2": 30, "a3": 35, "a4": 40, "a5": 45, "a6": 50, "a7": 55, "a8": 60, "a9": 65, "a10": 70, "gravity-formula": "ThisShouldChange" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gravity-formula"], "-0.00000352*tilt^2+0.00045454*tilt+0.99231483") # 3.0 max deviation - - # Check format api - def test_pushtest_1(self): - j = { "id": id, "http-push": "http://push.me", "token": "mytoken", "token2": "mytoken2", "http-push2": "http://push.me", "http-push3": "http://push.me", "brewfather-push": "http://push.me", "influxdb2-push": "http://influx.db", "influxdb2-org": "my-org", - "influxdb2-bucket": "my-bucket", "influxdb2-auth": "my-secret", "mqtt-push": "mqtt.com", "mqtt-port": 1883, "mqtt-user": "my-user", - "mqtt-pass": "my-pass", "http-push-h1": "header1", "http-push-h2": "header2", "http-push2-h1": "header1(2)", "http-push2-h2": "header2(2)" } - r = call_api_post( "/api/config/push", j ) - self.assertEqual(r.status_code, 200) - - def test_pushtest_2(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-1" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], False) - self.assertEqual(j["enabled"], True) - self.assertEqual(j["code"], -1) - - def test_pushtest_3(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-2" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], False) - self.assertEqual(j["enabled"], True) - self.assertEqual(j["code"], -1) - - def test_pushtest_4(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-3" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], False) - self.assertEqual(j["enabled"], True) - self.assertEqual(j["code"], -1) - - def test_pushtest_5(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=influxdb" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], False) - self.assertEqual(j["enabled"], True) - self.assertEqual(j["code"], -1) - - def test_pushtest_6(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=mqtt" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], False) - self.assertEqual(j["enabled"], True) - self.assertEqual(j["code"], -3) - - # Check format api - def test_push_1(self): - r = call_api_get( "/api/factory?id=" + id) - time.sleep(4) - - # Note: The endpoint test.php does not validate the payload, it only accepts the request and return 200. - j = { "id": id, "http-push": "http://www.allerum.net/test.php", "http-push2": "http://www.allerum.net/test.php", "http-push3": "http://www.allerum.net/test.php", "mqtt-push": "192.168.1.16", "mqtt-port": 1883, "mqtt-user": "", "mqtt-pass": "" } - r = call_api_post( "/api/config/push", j ) - self.assertEqual(r.status_code, 200) - - def test_push_2(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-1" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], True) - - def test_push_3(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-2" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], True) - - def test_push_4(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=http-3" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], True) - - def test_push_5(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=mqtt" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["success"], True) - - def test_push_6(self): - r = call_api_get( "/api/test/push?id=" + id + "&format=influx" ) - # TODO: Figure out how to test the influx db setup. Create my own mockup ? - - # Check format api - def test_format_1(self): - j = { "id": id, "http-1": "one" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_2(self): - j = { "id": id, "http-2": "two" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_3(self): - j = { "id": id, "http-3": "five" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_4(self): - j = { "id": id, "influxdb": "three" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_5(self): - j = { "id": id, "mqtt": "four" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_6(self): - r = call_api_get( "/api/config/format" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - self.assertEqual(j["http-1"], "one") - self.assertEqual(j["http-2"], "two") - self.assertEqual(j["http-3"], "five") - self.assertEqual(j["influxdb"], "three") - self.assertEqual(j["mqtt"], "four") - - def test_format_7(self): - j = { "id": id, "http-1": "" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_8(self): - j = { "id": id, "http-2": "" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_9(self): - j = { "id": id, "http-3": "" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_A(self): - j = { "id": id, "influxdb": "" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_B(self): - j = { "id": id, "mqtt": "" } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - def test_format_C(self): - r = call_api_get( "/api/config/format" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["http-1"], "%7B%22name%22%20%3A%20%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%20%22%24%7Bid%7D%22%2C%20%22token%22%20%3A%20%22%24%7Btoken%7D%22%2C%20%22interval%22%3A%20%24%7Bsleep%2Dinterval%7D%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22temp%5Funits%22%3A%20%22%24%7Btemp%2Dunit%7D%22%2C%20%22gravity%22%3A%20%24%7Bgravity%7D%2C%20%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%20%24%7Bbattery%7D%2C%20%22RSSI%22%3A%20%24%7Brssi%7D%2C%20%22corr%2Dgravity%22%3A%20%24%7Bcorr%2Dgravity%7D%2C%20%22gravity%2Dunit%22%3A%20%22%24%7Bgravity%2Dunit%7D%22%2C%20%22run%2Dtime%22%3A%20%24%7Brun%2Dtime%7D%20%7D") - self.assertEqual(j["http-2"], "%7B%22name%22%20%3A%20%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%20%22%24%7Bid%7D%22%2C%20%22token%22%20%3A%20%22%24%7Btoken%7D%22%2C%20%22interval%22%3A%20%24%7Bsleep%2Dinterval%7D%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22temp%5Funits%22%3A%20%22%24%7Btemp%2Dunit%7D%22%2C%20%22gravity%22%3A%20%24%7Bgravity%7D%2C%20%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%20%24%7Bbattery%7D%2C%20%22RSSI%22%3A%20%24%7Brssi%7D%2C%20%22corr%2Dgravity%22%3A%20%24%7Bcorr%2Dgravity%7D%2C%20%22gravity%2Dunit%22%3A%20%22%24%7Bgravity%2Dunit%7D%22%2C%20%22run%2Dtime%22%3A%20%24%7Brun%2Dtime%7D%20%7D") - self.assertEqual(j["http-3"], "%3Fname%3D%24%7Bmdns%7D%26id%3D%24%7Bid%7D%26token%3D%24%7Btoken2%7D%26interval%3D%24%7Bsleep%2Dinterval%7D%26temperature%3D%24%7Btemp%7D%26temp%2Dunits%3D%24%7Btemp%2Dunit%7D%26gravity%3D%24%7Bgravity%7D%26angle%3D%24%7Bangle%7D%26battery%3D%24%7Bbattery%7D%26rssi%3D%24%7Brssi%7D%26corr%2Dgravity%3D%24%7Bcorr%2Dgravity%7D%26gravity%2Dunit%3D%24%7Bgravity%2Dunit%7D%26run%2Dtime%3D%24%7Brun%2Dtime%7D") - self.assertEqual(j["influxdb"], "measurement%2Chost%3D%24%7Bmdns%7D%2Cdevice%3D%24%7Bid%7D%2Ctemp%2Dformat%3D%24%7Btemp%2Dunit%7D%2Cgravity%2Dformat%3D%24%7Bgravity%2Dunit%7D%20gravity%3D%24%7Bgravity%7D%2Ccorr%2Dgravity%3D%24%7Bcorr%2Dgravity%7D%2Cangle%3D%24%7Bangle%7D%2Ctemp%3D%24%7Btemp%7D%2Cbattery%3D%24%7Bbattery%7D%2Crssi%3D%24%7Brssi%7D%0A") - self.assertEqual(j["mqtt"], "ispindel%2F%24%7Bmdns%7D%2Ftilt%3A%24%7Bangle%7D%7Cispindel%2F%24%7Bmdns%7D%2Ftemperature%3A%24%7Btemp%7D%7Cispindel%2F%24%7Bmdns%7D%2Ftemp%5Funits%3A%24%7Btemp%2Dunit%7D%7Cispindel%2F%24%7Bmdns%7D%2Fbattery%3A%24%7Bbattery%7D%7Cispindel%2F%24%7Bmdns%7D%2Fgravity%3A%24%7Bgravity%7D%7Cispindel%2F%24%7Bmdns%7D%2Finterval%3A%24%7Bsleep%2Dinterval%7D%7Cispindel%2F%24%7Bmdns%7D%2FRSSI%3A%24%7Brssi%7D%7C") - - # Toggle sleep mode - def toggle_sleepmode_1(self): - j = { "id": id, "sleep-mode": "on" } - r = call_api_post( "/api/status/sleepmode" ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["sleep-mode"], True) - - def toggle_sleepmode_2(self): - j = { "id": id, "sleep-mode": "off" } - r = call_api_post( "/api/status/sleepmode" ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["sleep-mode"], False) - - # Clear setting - def default_settings_1(self): - j = { "id": id, "mdns": "gravmon", "temp-format": "C", "sleep-interval": 300 } - r = call_api_post( "/api/config/device", j ) - self.assertEqual(r.status_code, 200) - - def default_settings_2(self): - j = { "id": id, "token": "", "token2": "", "http-push": "", "http-push2": "", "http-push3": "", "influxdb2-push": "", "influxdb2-org": "", "influxdb2-bucket": "", - "influxdb2-auth": "", "mqtt-push": "", "mqtt-port": 1883, "mqtt-user": "", "mqtt-pass": "" } - r = call_api_post( "/api/config/push", j ) - self.assertEqual(r.status_code, 200) - - def default_settings_3(self): - j = { "id": id, "ota-url": "", "voltage-factor": 1.55, "temp-adjustment-value": -2, "gyro-temp": "off" } - r = call_api_post( "/api/config/hardware", j ) - self.assertEqual(r.status_code, 200) - - def default_settings_4(self): - j = { "id": id, "gravity-formula": "", "gravity-temp-adjustment": "off", "gravity-format": "G" } - r = call_api_post( "/api/config/gravity", j ) - self.assertEqual(r.status_code, 200) - - # Check advanced - def test_advanced_config_1(self): - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["id"], id) - r = call_api_get( "/api/factory?id=" + j["id"]) - time.sleep(4) - - r = call_api_get( "/api/config/advanced" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gyro-read-count"], 50) - self.assertEqual(j["tempsensor-resolution"], 9) - self.assertEqual(j["gyro-moving-threashold"], 500) - self.assertEqual(j["formula-max-deviation"], 3) - self.assertEqual(j["formula-calibration-temp"], 20) - self.assertEqual(j["wifi-portal-timeout"], 120) - self.assertEqual(j["wifi-connect-timeout"], 20) - self.assertEqual(j["ignore-low-angles"], False) - self.assertEqual(j["formula-calibration-temp"], 20) - self.assertEqual(j["int-http1"], 0) - self.assertEqual(j["int-http2"], 0) - self.assertEqual(j["int-http3"], 0) - self.assertEqual(j["int-influx"], 0) - self.assertEqual(j["int-mqtt"], 0) - - def test_advanced_config_2(self): - j = { "id": id, "gyro-read-count": 51, "tempsensor-resolution": 10, "gyro-moving-threashold": 501, "formula-max-deviation": 1.7, "ignore-low-angles": "on", - "formula-calibration-temp": 21, "wifi-portal-timeout": 121, "wifi-connect-timeout": 21, "int-http1": 1, "int-http2": 2, "int-http3": 3, "int-influx": 4, "int-mqtt": 5 } - r = call_api_post( "/api/config/advanced", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config/advanced" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["gyro-read-count"], 51) - self.assertEqual(j["tempsensor-resolution"], 10) - self.assertEqual(j["gyro-moving-threashold"], 501) - self.assertEqual(j["formula-max-deviation"], 1.7) - self.assertEqual(j["formula-calibration-temp"], 21) - self.assertEqual(j["wifi-portal-timeout"], 121) - self.assertEqual(j["wifi-connect-timeout"], 21) - self.assertEqual(j["ignore-low-angles"], True) - self.assertEqual(j["int-http1"], 1) - self.assertEqual(j["int-http2"], 2) - self.assertEqual(j["int-http3"], 3) - self.assertEqual(j["int-influx"], 4) - self.assertEqual(j["int-mqtt"], 5) - - def test_advanced_config_3(self): - j = { "id": id, "ignore-low-angles": "on" } - r = call_api_post( "/api/config/advanced", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config/advanced" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["ignore-low-angles"], True) - - j = { "id": id } # Skipping checkbox variable should set it to false - r = call_api_post( "/api/config/advanced", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config/advanced" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["ignore-low-angles"], False) - - def test_bug_71(self): - format = "gm%3A%7B%22name%22%3A%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%22%24%7Bid%7D%22%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22gravity%22%3A%24%7Bgravity%7D%2C%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%24%7Bbattery%7D%2C%20%22rssi%22%3A%20%24%7Brssi%7D%7D" - j = { "id": id, "mqtt": format } - r = call_api_post( "/api/config/format", j ) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/config/format" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["mqtt"], format) - - def test_bug_79(self): - j = { "id": id, "formula-max-deviation": 1.7 } - r = call_api_post( "/api/config/advanced", j ) - self.assertEqual(r.status_code, 200) - - j = { "id": id, "g1": 1.0, "g2": 1.009, "g3": 1.014, "g4": 1.027, "g5": 1.037, "g6": 1.042, "g7": 1.051, "g8": 1.060, "g9": 1.073, "g10": 1.078, "a1": 23.52, "a2": 26.47, "a3": 29.87, "a4": 33.43, "a5": 38.16, "a6": 40.6, "a7": 45.85, "a8": 50.12, "a9": 56.55, "a10": 59.078, "gravity-formula": "" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["error"], 'Unable to find an accurate formula based on input, check error log and graph below.') - - j = { "id": id, "formula-max-deviation": 4 } - r = call_api_post( "/api/config/advanced", j ) - self.assertEqual(r.status_code, 200) - - j = { "id": id, "g1": 1.0, "g2": 1.009, "g3": 1.014, "g4": 1.027, "g5": 1.037, "g6": 1.042, "g7": 1.051, "g8": 1.060, "g9": 1.073, "g10": 1.078, "a1": 23.52, "a2": 26.47, "a3": 29.87, "a4": 33.43, "a5": 38.16, "a6": 40.6, "a7": 45.85, "a8": 50.12, "a9": 56.55, "a10": 59.078, "gravity-formula": "" } - r = call_api_post("/api/formula", j) - self.assertEqual(r.status_code, 200) - - r = call_api_get( "/api/formula" ) - j = json.loads(r.text) - self.assertEqual(r.status_code, 200) - self.assertEqual(j["error"], '') - -if __name__ == '__main__': - r = call_api_get( "/api/status" ) - j = json.loads(r.text) - id = j["id"] - print( "ID: " + id); - unittest.main() - -# EOF \ No newline at end of file diff --git a/src/tests/tests_config.cpp b/src/tests/tests_config.cpp deleted file mode 100644 index 441dfed..0000000 --- a/src/tests/tests_config.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* -MIT License - -Copyright (c) 2022 Magnus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - */ -#include -#include - -test(config_defaultValues) { - assertEqual( myConfig.getGravityFormat(), 'G' ); - assertEqual( myConfig.getTempFormat(), 'C' ); - assertEqual( myConfig.getSleepInterval(), 900); - assertEqual( myConfig.getTempSensorAdjC(), 0.0); - float f = 4.15; - assertEqual( myConfig.getVoltageConfig(), f); -} - -test(config_advDefaultValues) { - assertEqual( myAdvancedConfig.getDefaultCalibrationTemp(), 20.0 ); - assertEqual( myAdvancedConfig.getGyroReadCount(), 50 ); - assertEqual( myAdvancedConfig.getGyroReadDelay(), 3150 ); - assertEqual( myAdvancedConfig.getGyroSensorMovingThreashold(), 500 ); - assertEqual( myAdvancedConfig.getMaxFormulaCreationDeviation(), 3.0 ); - assertEqual( myAdvancedConfig.getPushIntervalHttp1(), 0 ); - assertEqual( myAdvancedConfig.getPushIntervalHttp2(), 0 ); - assertEqual( myAdvancedConfig.getPushIntervalHttp3(), 0 ); - assertEqual( myAdvancedConfig.getPushIntervalMqtt(), 0 ); - assertEqual( myAdvancedConfig.getPushIntervalInflux(), 0 ); - assertEqual( myAdvancedConfig.getPushTimeout(), 10 ); - assertEqual( myAdvancedConfig.getTempSensorResolution(), 9 ); - assertEqual( myAdvancedConfig.getWifiConnectTimeout(), 20 ); - assertEqual( myAdvancedConfig.getWifiPortalTimeout(), 120); - assertEqual( myAdvancedConfig.isIgnoreLowAnges(), false); -} - -test(config_tempFormat) { - myConfig.setTempFormat('F'); - assertEqual( myConfig.getTempFormat(), 'F' ); - myConfig.setTempFormat('C'); - assertEqual( myConfig.getTempFormat(), 'C' ); - myConfig.setTempFormat('X'); - assertEqual( myConfig.getTempFormat(), 'C' ); -} - -test(config_gravityFormat) { - myConfig.setGravityFormat('P'); - assertEqual( myConfig.getGravityFormat(), 'P' ); - myConfig.setGravityFormat('G'); - assertEqual( myConfig.getGravityFormat(), 'G' ); - myConfig.setGravityFormat('X'); - assertEqual( myConfig.getGravityFormat(), 'G' ); -} - -// EOF \ No newline at end of file diff --git a/test/apitests.py b/test/apitests.py new file mode 100644 index 0000000..bada796 --- /dev/null +++ b/test/apitests.py @@ -0,0 +1,232 @@ +import unittest, requests, json, time + +#Update these to match the IP of your device( \ + ID will be read from the device at startup) + host = "192.168.1.212" id = "" ver = "1.2.0" + + def call_api_post(path, json) :url = "http://" + host + path return requests.post(url, data = json) + + def call_api_get(path) :url = "http://" + host + path return requests.get(url) + + class API(unittest.TestCase) : + +#Do factory reset for testing + def test_factory(self) :r = call_api_get("/api/status") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) r = call_api_get("/api/factory?id=" + j["id"]) time.sleep(4) + +#Check that all parameters exist + def test_status(self) :r = call_api_get("/api/status") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["wifi-ssid"], "@home") self.assertNotEqual(j["angle"], 0) self.assertNotEqual(j["gravity"], 2) self.assertNotEqual(j["temp-c"], 0) self.assertNotEqual(j["temp-f"], 0) self.assertNotEqual(j["battery"], 0) self.assertNotEqual(j["temp-format"], "") self.assertNotEqual(j["gravity-format"], "") self.assertNotEqual(j["sleep-mode"], True) self.assertNotEqual(j["rssi"], 0) self.assertNotEqual(j["app-ver"], "0.0.0") self.assertNotEqual(j["app-build"], "test") self.assertNotEqual(j["mdns"], "") self.assertNotEqual(j["platform"], "") self.assertNotEqual(j["runtime-average"], - 1) + +#Check that all parameters exist + def test_config_1(self) :j = {"id" :id, "http-push" : "https://push.me", "token" : "mytoken", "token2" : "mytoken2", "http-push2" : "http://push.me", "http-push3" : "http://push.me", "influxdb2-push" : "http://influx.db", "influxdb2-org" : "my-org", "influxdb2-bucket" : "my-bucket", "influxdb2-auth" : "my-secret", "mqtt-push" : "mqtt.com", "mqtt-port" : 1883, "mqtt-user" : "my-user", "mqtt-pass" : "my-pass", "http-push-h1" : "header1", "http-push-h2" : "header2", "http-push2-h1" : "header1(2)", "http-push2-h2" : "header2(2)" } r = call_api_post("/api/config/push", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["http-push-h1"], "header1") self.assertEqual(j["http-push-h2"], "header2") self.assertEqual(j["http-push2-h1"], "header1(2)") self.assertEqual(j["http-push2-h2"], "header2(2)") + +#Check that all parameters exist + def test_config_2(self) :j = {"id" :id, "mdns" : "gravmon", "temp-format" : "C", "sleep-interval" : 300 } r = call_api_post("/api/config/device", j) self.assertEqual(r.status_code, 200) + + def test_config_3(self) :j = {"id" :id, "http-push" : "https://push.me", "token" : "mytoken", "token2" : "mytoken2", "http-push2" : "http://push.me", "http-push3" : "http://push.me", "influxdb2-push" : "http://influx.db", "influxdb2-org" : "my-org", "influxdb2-bucket" : "my-bucket", "influxdb2-auth" : "my-secret", "mqtt-push" : "mqtt.com", "mqtt-port" : 1883, "mqtt-user" : "my-user", "mqtt-pass" : "my-pass" } r = call_api_post("/api/config/push", j) self.assertEqual(r.status_code, 200) + + def test_config_4(self) :j = {"id" :id, "ota-url" : "http://ota.url/path", "voltage-factor" : 1.55, "temp-adjustment-value" : - 2, "gyro-temp" : "on", "ble" : "color" } r = call_api_post("/api/config/hardware", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["ble"], "color") self.assertEqual(j["ota-url"], "http://ota.url/path") self.assertEqual(j["voltage-factor"], 1.55) self.assertEqual(j["temp-adjustment-value"], - 2) self.assertEqual(j["gyro-temp"], True) +#These are read only here, just checking them. + self.assertNotEqual(j["gyro-calibration-data"]["ax"], 0.0001) self.assertNotEqual(j["gyro-calibration-data"]["ay"], 0.0001) self.assertNotEqual(j["gyro-calibration-data"]["az"], 0.0001) self.assertNotEqual(j["gyro-calibration-data"]["gx"], 0.0001) self.assertNotEqual(j["gyro-calibration-data"]["gy"], 0.0001) self.assertNotEqual(j["gyro-calibration-data"]["gz"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a1"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a2"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a3"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a4"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a5"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a6"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a7"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a8"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a9"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["a10"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g1"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g2"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g3"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g4"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g5"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g6"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g7"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g8"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g9"], 0.0001) self.assertNotEqual(j["formula-calculation-data"]["g10"], 0.0001) self.assertNotEqual(j["angle"], 0) self.assertNotEqual(j["gravity"], - 10) self.assertNotEqual(j["battery"], 0) + + def test_config_5(self) :j = {"id" :id, "gravity-formula" : "my-formula", "gravity-temp-adjustment" : "on", "gravity-format" : "G" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["gravity-format"], "G") self.assertEqual(j["gravity-formula"], "my-formula") self.assertEqual(j["gravity-temp-adjustment"], True) + + def test_config_6(self) :j = {"id" :id, "mdns" : "gravmon", "temp-format" : "F", "sleep-interval" : 300 } r = call_api_post("/api/config/device", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["mdns"], "gravmon") self.assertEqual(j["wifi-ssid"], "@home") self.assertEqual(j["wifi-pass"], "") #Should not be displayed in API self.assertEqual(j["temp-format"], "F") self.assertEqual(j["sleep-interval"], 300) + + def test_config_7(self) :j = {"id" :id, "ota-url" : "", "voltage-factor" : 1.55, "temp-adjustment-value" : - 2, "gyro-temp" : "off", "ble" : "blue" } r = call_api_post("/api/config/hardware", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["ble"], "blue") self.assertEqual(j["ota-url"], "") self.assertEqual(j["voltage-factor"], 1.55) self.assertEqual(j["temp-adjustment-value"], - 2) self.assertEqual(j["gyro-temp"], False) + + def test_config_8(self) :j = {"id" :id, "gravity-formula" : "", "gravity-temp-adjustment" : "off", "gravity-format" : "P" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-format"], "P") self.assertEqual(j["gravity-temp-adjustment"], False) self.assertEqual(j["gravity-formula"], "") + + def test_config_9(self) :j = {"id" :id, "gravity-temp-adjustment" : "on" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-temp-adjustment"], True) + + j = {"id" :id } #No checkbox tag should set it to false.r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-temp-adjustment"], False) + + def test_config_A(self) :j = {"id" :id, "gyro-temp" : "on" } r = call_api_post("/api/config/hardware", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gyro-temp"], True) + + j = {"id" :id } #No checkbox tag should set it to false.r = call_api_post("/api/config/hardware", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gyro-temp"], False) + +#Check formula api(sg mode) + def test_formula_sg_1(self) : +#Ensure we have SG defined as gravity + j = {"id" :id, "gravity-formula" : "", "gravity-temp-adjustment" : "off", "gravity-format" : "G" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + def test_formula_sg_2(self) : +#Fails due to wrong id + j = {"id" : "wrong", "g1" : 0, "g2" : 1, "g3" : 1.02, "g4" : 1.0333, "g5" : 1.00011, "g6" : 1, "g7" : 1, "g8" : 1, "g9" : 1, "g10" : 1, "a1" : 0, "a2" : 25, "a3" : 25.5, "a4" : 25.55, "a5" : 25.555, "a6" : 0, "a7" : 0, "a8" : 0, "a9" : 0, "a10" : 0, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertNotEqual(r.status_code, 200) + +#Fails due to to few values + j = {"id" :id, "g1" : 0, "g2" : 1, "g3" : 1.02, "g4" : 1.0333, "g5" : 1.00011, "g6" : 1, "g7" : 1, "g8" : 1, "g9" : 1, "g10" : 1, "a1" : 0, "a2" : 25, "a3" : 0, "a4" : 0, "a5" : 0, "a6" : 0, "a7" : 0, "a8" : 0, "a9" : 0, "a10" : 0, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + +#Checks that values from last call was stored + r = call_api_get("/api/formula") j = json.loads(r.text) +#print(j) + self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-formula"], "") self.assertEqual(j["error"], "Not enough values to create formula, need at least 3 angles.") + + def test_formula_sg_3(self) : +#Check a simple formula + j = {"id" :id, "g1" : 1.0, "g2" : 1.01, "g3" : 1.02, "g4" : 1.03, "g5" : 1.04, "g6" : 1.05, "g7" : 1.06, "g8" : 1.07, "g9" : 1.08, "g10" : 1.1, "a1" : 25, "a2" : 30, "a3" : 35, "a4" : 40, "a5" : 45, "a6" : 50, "a7" : 55, "a8" : 60, "a9" : 65, "a10" : 70, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/formula") j = json.loads(r.text) +#print(j) + self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-formula"], "0.00000909*tilt^2+0.00124545*tilt+0.96445455") + +#Check formula api(plato mode) + def test_formula_plato_1(self) : +#Ensure we have Plato defined as gravity + j = {"id" :id, "gravity-formula" : "", "gravity-temp-adjustment" : "off", "gravity-format" : "P" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + + def test_formula_plato_2(self) : +#Fails due to to few values + j = {"id" :id, "g1" : 0, "g2" : 3, "g3" : 5.3, "g4" : 7.44, "g5" : 8.555, "g6" : 9, "g7" : 9.1, "g8" : 9.2, "g9" : 9.3, "g10" : 9.4, "a1" : 0, "a2" : 25, "a3" : 25.5, "a4" : 25.55, "a5" : 25.555, "a6" : 35, "a7" : 36, "a8" : 37, "a9" : 38, "a10" : 39, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + +#Checks that values from last call was stored + r = call_api_get("/api/formula") j = json.loads(r.text) +#print(j) + self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["g1"], 0) self.assertEqual(j["g2"], 3) self.assertEqual(j["g3"], 5.3) self.assertEqual(j["g4"], 7.4) self.assertEqual(j["g5"], 8.6) self.assertEqual(j["g6"], 9) self.assertEqual(j["g7"], 9.1) self.assertEqual(j["g8"], 9.2) self.assertEqual(j["g9"], 9.3) self.assertEqual(j["g10"], 9.4) self.assertEqual(j["a1"], 0) self.assertEqual(j["a2"], 25) self.assertEqual(j["a3"], 25.5) self.assertEqual(j["a4"], 25.55) self.assertEqual(j["a5"], 25.56) self.assertEqual(j["a6"], 35) self.assertEqual(j["a7"], 36) self.assertEqual(j["a8"], 37) self.assertEqual(j["a9"], 38) self.assertEqual(j["a10"], 39) self.assertEqual(j["gravity-format"], "P") self.assertEqual(j["gravity-formula"], "-0.00012155*tilt^2+0.00874785*tilt+0.88003318") self.assertEqual(j["error"], "") + + def test_formula_plato_3(self) :j = {"id" :id, "g1" : 0, "g2" : 3, "g3" : 0, "g4" : 0, "g5" : 0, "g6" : 0, "g7" : 0, "g8" : 0, "g9" : 0, "g10" : 0, "a1" : 0, "a2" : 25, "a3" : 0, "a4" : 0, "a5" : 0, "a6" : 0, "a7" : 0, "a8" : 0, "a9" : 0, "a10" : 0, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + +#Checks that values from last call was stored + r = call_api_get("/api/formula") j = json.loads(r.text) +#print(j) + self.assertEqual(r.status_code, 200) self.assertEqual(j["error"], "Not enough values to create formula, need at least 3 angles.") + + def test_formula_plato_4(self) : +#Ensure we have Plato defined as gravity + j = {"id" :id, "gravity-formula" : "", "gravity-temp-adjustment" : "off", "gravity-format" : "P" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + +#Check a simple formula + j = {"id" :id, "g1" : 1.0, "g2" : 1.1, "g3" : 1.2, "g4" : 1.3, "g5" : 1.4, "g6" : 1.5, "g7" : 1.6, "g8" : 1.7, "g9" : 1.8, "g10" : 1.9, "a1" : 25, "a2" : 30, "a3" : 35, "a4" : 40, "a5" : 45, "a6" : 50, "a7" : 55, "a8" : 60, "a9" : 65, "a10" : 70, "gravity-formula" : "ThisShouldChange" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/formula") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gravity-formula"], "-0.00000352*tilt^2+0.00045454*tilt+0.99231483") #3.0 max deviation + +#Check format api + def test_pushtest_1(self) :j = {"id" :id, "http-push" : "http://push.me", "token" : "mytoken", "token2" : "mytoken2", "http-push2" : "http://push.me", "http-push3" : "http://push.me", "brewfather-push" : "http://push.me", "influxdb2-push" : "http://influx.db", "influxdb2-org" : "my-org", "influxdb2-bucket" : "my-bucket", "influxdb2-auth" : "my-secret", "mqtt-push" : "mqtt.com", "mqtt-port" : 1883, "mqtt-user" : "my-user", "mqtt-pass" : "my-pass", "http-push-h1" : "header1", "http-push-h2" : "header2", "http-push2-h1" : "header1(2)", "http-push2-h2" : "header2(2)" } r = call_api_post("/api/config/push", j) self.assertEqual(r.status_code, 200) + + def test_pushtest_2(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-1") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], False) self.assertEqual(j["enabled"], True) self.assertEqual(j["code"], - 1) + + def test_pushtest_3(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-2") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], False) self.assertEqual(j["enabled"], True) self.assertEqual(j["code"], - 1) + + def test_pushtest_4(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-3") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], False) self.assertEqual(j["enabled"], True) self.assertEqual(j["code"], - 1) + + def test_pushtest_5(self) :r = call_api_get("/api/test/push?id=" + id + "&format=influxdb") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], False) self.assertEqual(j["enabled"], True) self.assertEqual(j["code"], - 1) + + def test_pushtest_6(self) :r = call_api_get("/api/test/push?id=" + id + "&format=mqtt") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], False) self.assertEqual(j["enabled"], True) self.assertEqual(j["code"], - 3) + +#Check format api + def test_push_1(self) :r = call_api_get("/api/factory?id=" + id) time.sleep(4) + +#Note : The endpoint test.php does not validate the payload, \ + it only accepts the request and return 200. + j = {"id" :id, "http-push" : "http://www.allerum.net/test.php", "http-push2" : "http://www.allerum.net/test.php", "http-push3" : "http://www.allerum.net/test.php", "mqtt-push" : "192.168.1.16", "mqtt-port" : 1883, "mqtt-user" : "", "mqtt-pass" : "" } r = call_api_post("/api/config/push", j) self.assertEqual(r.status_code, 200) + + def test_push_2(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-1") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], True) + + def test_push_3(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-2") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], True) + + def test_push_4(self) :r = call_api_get("/api/test/push?id=" + id + "&format=http-3") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], True) + + def test_push_5(self) :r = call_api_get("/api/test/push?id=" + id + "&format=mqtt") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["success"], True) + + def test_push_6(self) :r = call_api_get("/api/test/push?id=" + id + "&format=influx") +#TODO : Figure out how to test the influx db setup.Create my own mockup ? + +#Check format api + def test_format_1(self) :j = {"id" :id, "http-1" : "one" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_2(self) :j = {"id" :id, "http-2" : "two" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_3(self) :j = {"id" :id, "http-3" : "five" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_4(self) :j = {"id" :id, "influxdb" : "three" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_5(self) :j = {"id" :id, "mqtt" : "four" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_6(self) :r = call_api_get("/api/config/format") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) self.assertEqual(j["http-1"], "one") self.assertEqual(j["http-2"], "two") self.assertEqual(j["http-3"], "five") self.assertEqual(j["influxdb"], "three") self.assertEqual(j["mqtt"], "four") + + def test_format_7(self) :j = {"id" :id, "http-1" : "" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_8(self) :j = {"id" :id, "http-2" : "" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_9(self) :j = {"id" :id, "http-3" : "" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_A(self) :j = {"id" :id, "influxdb" : "" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_B(self) :j = {"id" :id, "mqtt" : "" } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + def test_format_C(self) :r = call_api_get("/api/config/format") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["http-1"], "%7B%22name%22%20%3A%20%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%20%22%24%7Bid%7D%22%2C%20%22token%22%20%3A%20%22%24%7Btoken%7D%22%2C%20%22interval%22%3A%20%24%7Bsleep%2Dinterval%7D%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22temp%5Funits%22%3A%20%22%24%7Btemp%2Dunit%7D%22%2C%20%22gravity%22%3A%20%24%7Bgravity%7D%2C%20%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%20%24%7Bbattery%7D%2C%20%22RSSI%22%3A%20%24%7Brssi%7D%2C%20%22corr%2Dgravity%22%3A%20%24%7Bcorr%2Dgravity%7D%2C%20%22gravity%2Dunit%22%3A%20%22%24%7Bgravity%2Dunit%7D%22%2C%20%22run%2Dtime%22%3A%20%24%7Brun%2Dtime%7D%20%7D") self.assertEqual(j["http-2"], "%7B%22name%22%20%3A%20%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%20%22%24%7Bid%7D%22%2C%20%22token%22%20%3A%20%22%24%7Btoken%7D%22%2C%20%22interval%22%3A%20%24%7Bsleep%2Dinterval%7D%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22temp%5Funits%22%3A%20%22%24%7Btemp%2Dunit%7D%22%2C%20%22gravity%22%3A%20%24%7Bgravity%7D%2C%20%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%20%24%7Bbattery%7D%2C%20%22RSSI%22%3A%20%24%7Brssi%7D%2C%20%22corr%2Dgravity%22%3A%20%24%7Bcorr%2Dgravity%7D%2C%20%22gravity%2Dunit%22%3A%20%22%24%7Bgravity%2Dunit%7D%22%2C%20%22run%2Dtime%22%3A%20%24%7Brun%2Dtime%7D%20%7D") self.assertEqual(j["http-3"], "%3Fname%3D%24%7Bmdns%7D%26id%3D%24%7Bid%7D%26token%3D%24%7Btoken2%7D%26interval%3D%24%7Bsleep%2Dinterval%7D%26temperature%3D%24%7Btemp%7D%26temp%2Dunits%3D%24%7Btemp%2Dunit%7D%26gravity%3D%24%7Bgravity%7D%26angle%3D%24%7Bangle%7D%26battery%3D%24%7Bbattery%7D%26rssi%3D%24%7Brssi%7D%26corr%2Dgravity%3D%24%7Bcorr%2Dgravity%7D%26gravity%2Dunit%3D%24%7Bgravity%2Dunit%7D%26run%2Dtime%3D%24%7Brun%2Dtime%7D") self.assertEqual(j["influxdb"], "measurement%2Chost%3D%24%7Bmdns%7D%2Cdevice%3D%24%7Bid%7D%2Ctemp%2Dformat%3D%24%7Btemp%2Dunit%7D%2Cgravity%2Dformat%3D%24%7Bgravity%2Dunit%7D%20gravity%3D%24%7Bgravity%7D%2Ccorr%2Dgravity%3D%24%7Bcorr%2Dgravity%7D%2Cangle%3D%24%7Bangle%7D%2Ctemp%3D%24%7Btemp%7D%2Cbattery%3D%24%7Bbattery%7D%2Crssi%3D%24%7Brssi%7D%0A") self.assertEqual(j["mqtt"], "ispindel%2F%24%7Bmdns%7D%2Ftilt%3A%24%7Bangle%7D%7Cispindel%2F%24%7Bmdns%7D%2Ftemperature%3A%24%7Btemp%7D%7Cispindel%2F%24%7Bmdns%7D%2Ftemp%5Funits%3A%24%7Btemp%2Dunit%7D%7Cispindel%2F%24%7Bmdns%7D%2Fbattery%3A%24%7Bbattery%7D%7Cispindel%2F%24%7Bmdns%7D%2Fgravity%3A%24%7Bgravity%7D%7Cispindel%2F%24%7Bmdns%7D%2Finterval%3A%24%7Bsleep%2Dinterval%7D%7Cispindel%2F%24%7Bmdns%7D%2FRSSI%3A%24%7Brssi%7D%7C") + +#Toggle sleep mode + def toggle_sleepmode_1(self) :j = {"id" :id, "sleep-mode" : "on" } r = call_api_post("/api/status/sleepmode") self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/status") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["sleep-mode"], True) + + def toggle_sleepmode_2(self) :j = {"id" :id, "sleep-mode" : "off" } r = call_api_post("/api/status/sleepmode") self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/status") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["sleep-mode"], False) + +#Clear setting + def default_settings_1(self) :j = {"id" :id, "mdns" : "gravmon", "temp-format" : "C", "sleep-interval" : 300 } r = call_api_post("/api/config/device", j) self.assertEqual(r.status_code, 200) + + def default_settings_2(self) :j = {"id" :id, "token" : "", "token2" : "", "http-push" : "", "http-push2" : "", "http-push3" : "", "influxdb2-push" : "", "influxdb2-org" : "", "influxdb2-bucket" : "", "influxdb2-auth" : "", "mqtt-push" : "", "mqtt-port" : 1883, "mqtt-user" : "", "mqtt-pass" : "" } r = call_api_post("/api/config/push", j) self.assertEqual(r.status_code, 200) + + def default_settings_3(self) :j = {"id" :id, "ota-url" : "", "voltage-factor" : 1.55, "temp-adjustment-value" : - 2, "gyro-temp" : "off" } r = call_api_post("/api/config/hardware", j) self.assertEqual(r.status_code, 200) + + def default_settings_4(self) :j = {"id" :id, "gravity-formula" : "", "gravity-temp-adjustment" : "off", "gravity-format" : "G" } r = call_api_post("/api/config/gravity", j) self.assertEqual(r.status_code, 200) + +#Check advanced + def test_advanced_config_1(self) :r = call_api_get("/api/status") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["id"], id) r = call_api_get("/api/factory?id=" + j["id"]) time.sleep(4) + + r = call_api_get("/api/config/advanced") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gyro-read-count"], 50) self.assertEqual(j["tempsensor-resolution"], 9) self.assertEqual(j["gyro-moving-threashold"], 500) self.assertEqual(j["formula-max-deviation"], 3) self.assertEqual(j["formula-calibration-temp"], 20) self.assertEqual(j["wifi-portal-timeout"], 120) self.assertEqual(j["wifi-connect-timeout"], 20) self.assertEqual(j["ignore-low-angles"], False) self.assertEqual(j["formula-calibration-temp"], 20) self.assertEqual(j["int-http1"], 0) self.assertEqual(j["int-http2"], 0) self.assertEqual(j["int-http3"], 0) self.assertEqual(j["int-influx"], 0) self.assertEqual(j["int-mqtt"], 0) + + def test_advanced_config_2(self) :j = {"id" :id, "gyro-read-count" : 51, "tempsensor-resolution" : 10, "gyro-moving-threashold" : 501, "formula-max-deviation" : 1.7, "ignore-low-angles" : "on", "formula-calibration-temp" : 21, "wifi-portal-timeout" : 121, "wifi-connect-timeout" : 21, "int-http1" : 1, "int-http2" : 2, "int-http3" : 3, "int-influx" : 4, "int-mqtt" : 5 } r = call_api_post("/api/config/advanced", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config/advanced") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["gyro-read-count"], 51) self.assertEqual(j["tempsensor-resolution"], 10) self.assertEqual(j["gyro-moving-threashold"], 501) self.assertEqual(j["formula-max-deviation"], 1.7) self.assertEqual(j["formula-calibration-temp"], 21) self.assertEqual(j["wifi-portal-timeout"], 121) self.assertEqual(j["wifi-connect-timeout"], 21) self.assertEqual(j["ignore-low-angles"], True) self.assertEqual(j["int-http1"], 1) self.assertEqual(j["int-http2"], 2) self.assertEqual(j["int-http3"], 3) self.assertEqual(j["int-influx"], 4) self.assertEqual(j["int-mqtt"], 5) + + def test_advanced_config_3(self) :j = {"id" :id, "ignore-low-angles" : "on" } r = call_api_post("/api/config/advanced", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config/advanced") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["ignore-low-angles"], True) + + j = {"id" :id } #Skipping checkbox variable should set it to false r = call_api_post("/api/config/advanced", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config/advanced") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["ignore-low-angles"], False) + + def test_bug_71(self) :format = "gm%3A%7B%22name%22%3A%22%24%7Bmdns%7D%22%2C%20%22ID%22%3A%22%24%7Bid%7D%22%2C%20%22temperature%22%3A%20%24%7Btemp%7D%2C%20%22gravity%22%3A%24%7Bgravity%7D%2C%22angle%22%3A%20%24%7Bangle%7D%2C%20%22battery%22%3A%24%7Bbattery%7D%2C%20%22rssi%22%3A%20%24%7Brssi%7D%7D" j = {"id" :id, "mqtt" :format } r = call_api_post("/api/config/format", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/config/format") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["mqtt"], format) + + def test_bug_79(self) :j = {"id" :id, "formula-max-deviation" : 1.7 } r = call_api_post("/api/config/advanced", j) self.assertEqual(r.status_code, 200) + + j = {"id" :id, "g1" : 1.0, "g2" : 1.009, "g3" : 1.014, "g4" : 1.027, "g5" : 1.037, "g6" : 1.042, "g7" : 1.051, "g8" : 1.060, "g9" : 1.073, "g10" : 1.078, "a1" : 23.52, "a2" : 26.47, "a3" : 29.87, "a4" : 33.43, "a5" : 38.16, "a6" : 40.6, "a7" : 45.85, "a8" : 50.12, "a9" : 56.55, "a10" : 59.078, "gravity-formula" : "" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/formula") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["error"], 'Unable to find an accurate formula based on input, check error log and graph below.') + + j = {"id" :id, "formula-max-deviation" : 4 } r = call_api_post("/api/config/advanced", j) self.assertEqual(r.status_code, 200) + + j = {"id" :id, "g1" : 1.0, "g2" : 1.009, "g3" : 1.014, "g4" : 1.027, "g5" : 1.037, "g6" : 1.042, "g7" : 1.051, "g8" : 1.060, "g9" : 1.073, "g10" : 1.078, "a1" : 23.52, "a2" : 26.47, "a3" : 29.87, "a4" : 33.43, "a5" : 38.16, "a6" : 40.6, "a7" : 45.85, "a8" : 50.12, "a9" : 56.55, "a10" : 59.078, "gravity-formula" : "" } r = call_api_post("/api/formula", j) self.assertEqual(r.status_code, 200) + + r = call_api_get("/api/formula") j = json.loads(r.text) self.assertEqual(r.status_code, 200) self.assertEqual(j["error"], '') + + if __name__ == '__main__' :r = call_api_get("/api/status") j = json.loads(r.text) id = j["id"] print("ID: " + id); +unittest.main() + +#EOF \ No newline at end of file diff --git a/src/tests/tests.cpp b/test/tests.cpp similarity index 97% rename from src/tests/tests.cpp rename to test/tests.cpp index 3eb81a6..441fc1c 100644 --- a/src/tests/tests.cpp +++ b/test/tests.cpp @@ -21,12 +21,13 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include + +#include -using aunit::TestRunner; using aunit::Printer; +using aunit::TestRunner; using aunit::Verbosity; /* @@ -70,7 +71,7 @@ void setup() { Serial.println("Gravitymon - Unit Test Build"); delay(2000); Printer::setPrinter(&Serial); - //TestRunner::setVerbosity(Verbosity::kAll); + // TestRunner::setVerbosity(Verbosity::kAll); } void loop() { @@ -78,4 +79,4 @@ void loop() { delay(10); } -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_ble.cpp b/test/tests_ble.cpp similarity index 99% rename from src/tests/tests_ble.cpp rename to test/tests_ble.cpp index 2bb49e2..fbfabe4 100644 --- a/src/tests/tests_ble.cpp +++ b/test/tests_ble.cpp @@ -21,10 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include + +#include // No unit testing for the BLE module. -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_calc.cpp b/test/tests_calc.cpp similarity index 76% rename from src/tests/tests_calc.cpp rename to test/tests_calc.cpp index c0321ab..87945ab 100644 --- a/src/tests/tests_calc.cpp +++ b/test/tests_calc.cpp @@ -21,26 +21,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include -// TODO: Add more test cases to explore formula creation error conditions when values are out of bounds +#include +#include + +// TODO: Add more test cases to explore formula creation error conditions when +// values are out of bounds // TODO: Add more test cases to check order 3 + 4 formula creation as well. test(calc_createFormula1) { char buffer[100]; - RawFormulaData fd = { { 0.0, 25.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 1.02, 1.033, 1.00011, 1.0, 1.0, 1.0, 1.0, 1.0} }; + RawFormulaData fd = { + {0.0, 25.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 1.02, 1.033, 1.00011, 1.0, 1.0, 1.0, 1.0, 1.0}}; int i = createFormula(fd, &buffer[0], sizeof(buffer), 2); - assertEqual( i, ERR_FORMULA_NOTENOUGHVALUES ); + assertEqual(i, ERR_FORMULA_NOTENOUGHVALUES); } test(calc_createFormula2) { char buffer[100]; - RawFormulaData fd = { { 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0}, {1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.1} }; + RawFormulaData fd = { + {25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0}, + {1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.1}}; int i = createFormula(fd, &buffer[0], sizeof(buffer), 2); - assertEqual( i, 0 ); - assertEqual( &buffer[0], "0.00000909*tilt^2+0.00124545*tilt+0.96445455"); + assertEqual(i, 0); + assertEqual(&buffer[0], "0.00000909*tilt^2+0.00124545*tilt+0.96445455"); } test(calc_calculateGravity) { @@ -52,10 +58,10 @@ test(calc_calculateGravity) { } test(calc_gravityTemperatureCorrectionC) { - double g = gravityTemperatureCorrectionC( 1.02, 45.0, 20.0); + double g = gravityTemperatureCorrectionC(1.02, 45.0, 20.0); float v1 = reduceFloatPrecision(g, 2); float v2 = 1.03; assertEqual(v1, v2); } -// EOF \ No newline at end of file +// EOF diff --git a/test/tests_config.cpp b/test/tests_config.cpp new file mode 100644 index 0000000..65d65c3 --- /dev/null +++ b/test/tests_config.cpp @@ -0,0 +1,73 @@ +/* +MIT License + +Copyright (c) 2022 Magnus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +#include + +#include + +test(config_defaultValues) { + assertEqual(myConfig.getGravityFormat(), 'G'); + assertEqual(myConfig.getTempFormat(), 'C'); + assertEqual(myConfig.getSleepInterval(), 900); + assertEqual(myConfig.getTempSensorAdjC(), 0.0); + float f = 4.15; + assertEqual(myConfig.getVoltageConfig(), f); +} + +test(config_advDefaultValues) { + assertEqual(myAdvancedConfig.getDefaultCalibrationTemp(), 20.0); + assertEqual(myAdvancedConfig.getGyroReadCount(), 50); + assertEqual(myAdvancedConfig.getGyroReadDelay(), 3150); + assertEqual(myAdvancedConfig.getGyroSensorMovingThreashold(), 500); + assertEqual(myAdvancedConfig.getMaxFormulaCreationDeviation(), 3.0); + assertEqual(myAdvancedConfig.getPushIntervalHttp1(), 0); + assertEqual(myAdvancedConfig.getPushIntervalHttp2(), 0); + assertEqual(myAdvancedConfig.getPushIntervalHttp3(), 0); + assertEqual(myAdvancedConfig.getPushIntervalMqtt(), 0); + assertEqual(myAdvancedConfig.getPushIntervalInflux(), 0); + assertEqual(myAdvancedConfig.getPushTimeout(), 10); + assertEqual(myAdvancedConfig.getTempSensorResolution(), 9); + assertEqual(myAdvancedConfig.getWifiConnectTimeout(), 20); + assertEqual(myAdvancedConfig.getWifiPortalTimeout(), 120); + assertEqual(myAdvancedConfig.isIgnoreLowAnges(), false); +} + +test(config_tempFormat) { + myConfig.setTempFormat('F'); + assertEqual(myConfig.getTempFormat(), 'F'); + myConfig.setTempFormat('C'); + assertEqual(myConfig.getTempFormat(), 'C'); + myConfig.setTempFormat('X'); + assertEqual(myConfig.getTempFormat(), 'C'); +} + +test(config_gravityFormat) { + myConfig.setGravityFormat('P'); + assertEqual(myConfig.getGravityFormat(), 'P'); + myConfig.setGravityFormat('G'); + assertEqual(myConfig.getGravityFormat(), 'G'); + myConfig.setGravityFormat('X'); + assertEqual(myConfig.getGravityFormat(), 'G'); +} + +// EOF diff --git a/src/tests/tests_gyro.cpp b/test/tests_gyro.cpp similarity index 99% rename from src/tests/tests_gyro.cpp rename to test/tests_gyro.cpp index 4c15699..e1a49c0 100644 --- a/src/tests/tests_gyro.cpp +++ b/test/tests_gyro.cpp @@ -21,9 +21,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include #include +#include + test(gyro_connectGyro) { myGyro.setup(); assertEqual(myGyro.isConnected(), true); @@ -40,4 +41,4 @@ test(gyro_readGyroTemp) { assertNotEqual(myGyro.getSensorTempC(), -273.0); } -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_helper.cpp b/test/tests_helper.cpp similarity index 96% rename from src/tests/tests_helper.cpp rename to test/tests_helper.cpp index 19030c6..eaa95a0 100644 --- a/src/tests/tests_helper.cpp +++ b/test/tests_helper.cpp @@ -21,9 +21,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include #include +#include + BatteryVoltage myBatteryVoltage; test(helper_convertToPlato) { @@ -54,11 +55,11 @@ test(helper_convertFtoC) { test(helper_urlEncode) { String s = urlencode("Hello world"); - assertEqual(s, "Hello\%20world"); + assertEqual(s, "Hello%20world"); } test(helper_urlDecode) { - String s = urldecode("Hello\%20world"); + String s = urldecode("Hello%20world"); assertEqual(s, "Hello world"); } @@ -89,4 +90,4 @@ test(helper_readBatteryVoltage) { assertMoreOrEqual(f, 2.0); } -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_pushtarget.cpp b/test/tests_pushtarget.cpp similarity index 97% rename from src/tests/tests_pushtarget.cpp rename to test/tests_pushtarget.cpp index fdea04d..686a93a 100644 --- a/src/tests/tests_pushtarget.cpp +++ b/test/tests_pushtarget.cpp @@ -21,10 +21,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include -// TODO: Build some php scripts that run on gravitymon.com for testing the push data. +#include -// EOF \ No newline at end of file +// TODO: Build some php scripts that run on gravitymon.com for testing the push +// data. + +// EOF diff --git a/src/tests/tests_templating.cpp b/test/tests_templating.cpp similarity index 55% rename from src/tests/tests_templating.cpp rename to test/tests_templating.cpp index f789592..8168ea3 100644 --- a/src/tests/tests_templating.cpp +++ b/test/tests_templating.cpp @@ -21,10 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include +#include + test(template_applyTemplate1) { TemplatingEngine e; char buffer[20]; @@ -33,9 +34,16 @@ test(template_applyTemplate1) { e.initialize(45.0, 1.123, 1.223, 21.2, 2.98); String s = e.create(TemplatingEngine::TEMPLATE_HTTP1); String id = myConfig.getID(); - String batt = convertFloatToString( myBatteryVoltage.getVoltage(), &buffer[0], 2); + String batt = + convertFloatToString(myBatteryVoltage.getVoltage(), &buffer[0], 2); batt.trim(); - String v = "{\"name\" : \"gravitymon\", \"ID\": \"" + id + "\", \"token\" : \"\", \"interval\": 900, \"temperature\": 21.2, \"temp_units\": \"C\", \"gravity\": 1.1230, \"angle\": 45.00, \"battery\": " + batt + ", \"RSSI\": 31, \"corr-gravity\": 1.2230, \"gravity-unit\": \"G\", \"run-time\": 3.0 }"; + String v = "{\"name\" : \"gravitymon\", \"ID\": \"" + id + + "\", \"token\" : \"\", \"interval\": 900, \"temperature\": 21.2, " + "\"temp_units\": \"C\", \"gravity\": 1.1230, \"angle\": 45.00, " + "\"battery\": " + + batt + + ", \"RSSI\": 31, \"corr-gravity\": 1.2230, \"gravity-unit\": " + "\"G\", \"run-time\": 3.0 }"; assertEqual(s, v); } @@ -47,9 +55,16 @@ test(template_applyTemplate2) { e.initialize(45.0, 1.123, 1.223, 21.2, 2.98); String s = e.create(TemplatingEngine::TEMPLATE_HTTP2); String id = myConfig.getID(); - String batt = convertFloatToString( myBatteryVoltage.getVoltage(), &buffer[0], 2); + String batt = + convertFloatToString(myBatteryVoltage.getVoltage(), &buffer[0], 2); batt.trim(); - String v = "{\"name\" : \"gravitymon\", \"ID\": \"" + id + "\", \"token\" : \"\", \"interval\": 900, \"temperature\": 21.2, \"temp_units\": \"C\", \"gravity\": 1.1230, \"angle\": 45.00, \"battery\": " + batt + ", \"RSSI\": 31, \"corr-gravity\": 1.2230, \"gravity-unit\": \"G\", \"run-time\": 3.0 }"; + String v = "{\"name\" : \"gravitymon\", \"ID\": \"" + id + + "\", \"token\" : \"\", \"interval\": 900, \"temperature\": 21.2, " + "\"temp_units\": \"C\", \"gravity\": 1.1230, \"angle\": 45.00, " + "\"battery\": " + + batt + + ", \"RSSI\": 31, \"corr-gravity\": 1.2230, \"gravity-unit\": " + "\"G\", \"run-time\": 3.0 }"; assertEqual(s, v); } @@ -61,9 +76,13 @@ test(template_applyTemplate3) { e.initialize(45.0, 1.123, 1.223, 21.2, 2.98); String s = e.create(TemplatingEngine::TEMPLATE_HTTP3); String id = myConfig.getID(); - String batt = convertFloatToString( myBatteryVoltage.getVoltage(), &buffer[0], 2); + String batt = + convertFloatToString(myBatteryVoltage.getVoltage(), &buffer[0], 2); batt.trim(); - String v = "?name=gravitymon&id=" + id + "&token=&interval=900&temperature=21.2&temp-units=C&gravity=1.1230&angle=45.00&battery=" + batt + "&rssi=31&corr-gravity=1.2230&gravity-unit=G&run-time=3.0"; + String v = "?name=gravitymon&id=" + id + + "&token=&interval=900&temperature=21.2&temp-units=C&gravity=1." + "1230&angle=45.00&battery=" + + batt + "&rssi=31&corr-gravity=1.2230&gravity-unit=G&run-time=3.0"; assertEqual(s, v); } @@ -75,9 +94,14 @@ test(template_applyTemplate4) { e.initialize(45.0, 1.123, 1.223, 21.2, 2.98); String s = e.create(TemplatingEngine::TEMPLATE_INFLUX); String id = myConfig.getID(); - String batt = convertFloatToString( myBatteryVoltage.getVoltage(), &buffer[0], 2); + String batt = + convertFloatToString(myBatteryVoltage.getVoltage(), &buffer[0], 2); batt.trim(); - String v = "measurement,host=gravitymon,device=" + id + ",temp-format=C,gravity-format=G gravity=1.1230,corr-gravity=1.2230,angle=45.00,temp=21.2,battery=" + batt + ",rssi=31\n"; + String v = + "measurement,host=gravitymon,device=" + id + + ",temp-format=C,gravity-format=G " + "gravity=1.1230,corr-gravity=1.2230,angle=45.00,temp=21.2,battery=" + + batt + ",rssi=31\n"; assertEqual(s, v); } @@ -88,10 +112,17 @@ test(template_applyTemplate5) { e.initialize(45.0, 1.123, 1.223, 21.2, 2.98); String s = e.create(TemplatingEngine::TEMPLATE_MQTT); - String batt = convertFloatToString( myBatteryVoltage.getVoltage(), &buffer[0], 2); + String batt = + convertFloatToString(myBatteryVoltage.getVoltage(), &buffer[0], 2); batt.trim(); - String v = "ispindel/gravitymon/tilt:45.00|ispindel/gravitymon/temperature:21.2|ispindel/gravitymon/temp_units:C|ispindel/gravitymon/battery:" + batt + "|ispindel/gravitymon/gravity:1.1230|ispindel/gravitymon/interval:900|ispindel/gravitymon/RSSI:31|"; + String v = + "ispindel/gravitymon/tilt:45.00|ispindel/gravitymon/" + "temperature:21.2|ispindel/gravitymon/temp_units:C|ispindel/gravitymon/" + "battery:" + + batt + + "|ispindel/gravitymon/gravity:1.1230|ispindel/gravitymon/" + "interval:900|ispindel/gravitymon/RSSI:31|"; assertEqual(s, v); } -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_tempsensor.cpp b/test/tests_tempsensor.cpp similarity index 95% rename from src/tests/tests_tempsensor.cpp rename to test/tests_tempsensor.cpp index 2efeee1..84d4e94 100644 --- a/src/tests/tests_tempsensor.cpp +++ b/test/tests_tempsensor.cpp @@ -21,13 +21,14 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include #include +#include + test(temp_readSensor) { myTempSensor.setup(); myTempSensor.getTempC(); - assertEqual( myTempSensor.isSensorAttached(), true ); + assertEqual(myTempSensor.isSensorAttached(), true); } -// EOF \ No newline at end of file +// EOF diff --git a/src/tests/tests_webserver.cpp b/test/tests_webserver.cpp similarity index 96% rename from src/tests/tests_webserver.cpp rename to test/tests_webserver.cpp index 9160eb6..a44122d 100644 --- a/src/tests/tests_webserver.cpp +++ b/test/tests_webserver.cpp @@ -21,10 +21,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include -// No unit testing for the WEB module. These tests are done using python script and the API's +#include -// EOF \ No newline at end of file +// No unit testing for the WEB module. These tests are done using python script +// and the API's + +// EOF diff --git a/src/tests/tests_wifi.cpp b/test/tests_wifi.cpp similarity index 96% rename from src/tests/tests_wifi.cpp rename to test/tests_wifi.cpp index 9228a61..89abf5c 100644 --- a/src/tests/tests_wifi.cpp +++ b/test/tests_wifi.cpp @@ -21,10 +21,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include #include +#include -// No unit testing for the WIFI module. These tests are manual when testing the installation steps. +#include -// EOF \ No newline at end of file +// No unit testing for the WIFI module. These tests are manual when testing the +// installation steps. + +// EOF