From 0a836c700171f3f84d84cdb837230122242492fb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 1 Jul 2025 16:06:31 -0500 Subject: [PATCH] tweak --- .../web_server/ota/ota_web_server.cpp | 5 +- .../ota/test_web_server_ota.py | 98 +++++++++++++++++++ .../ota/test_web_server_ota.yaml | 15 +++ .../ota/test_web_server_ota_arduino.yaml | 18 ++++ .../ota/test_web_server_ota_callbacks.yaml | 31 ++++++ .../ota/test_web_server_ota_esp8266.yaml | 15 +++ .../ota/test_web_server_ota_idf.yaml | 17 ++++ .../ota/test_web_server_ota_multi.yaml | 21 ++++ .../web_server/test_ota_migration.py | 37 +++++++ .../web_server/test_no_ota.esp32-idf.yaml | 9 +- .../web_server/test_ota.esp32-idf.yaml | 8 +- .../test_ota_disabled.esp32-idf.yaml | 11 ++- 12 files changed, 273 insertions(+), 12 deletions(-) create mode 100644 tests/component_tests/ota/test_web_server_ota.py create mode 100644 tests/component_tests/ota/test_web_server_ota.yaml create mode 100644 tests/component_tests/ota/test_web_server_ota_arduino.yaml create mode 100644 tests/component_tests/ota/test_web_server_ota_callbacks.yaml create mode 100644 tests/component_tests/ota/test_web_server_ota_esp8266.yaml create mode 100644 tests/component_tests/ota/test_web_server_ota_idf.yaml create mode 100644 tests/component_tests/ota/test_web_server_ota_multi.yaml create mode 100644 tests/component_tests/web_server/test_ota_migration.py diff --git a/esphome/components/web_server/ota/ota_web_server.cpp b/esphome/components/web_server/ota/ota_web_server.cpp index b5c80a0fe6..f8dcc4d8b1 100644 --- a/esphome/components/web_server/ota/ota_web_server.cpp +++ b/esphome/components/web_server/ota/ota_web_server.cpp @@ -2,7 +2,6 @@ #ifdef USE_WEBSERVER_OTA #include "esphome/components/ota/ota_backend.h" -#include "esphome/components/web_server_base/web_server_base.h" #include "esphome/core/application.h" #include "esphome/core/log.h" @@ -194,9 +193,7 @@ void WebServerOTAComponent::setup() { #endif } -void WebServerOTAComponent::dump_config() { - ESP_LOGCONFIG(TAG, "Web Server OTA"); -} +void WebServerOTAComponent::dump_config() { ESP_LOGCONFIG(TAG, "Web Server OTA"); } } // namespace web_server } // namespace esphome diff --git a/tests/component_tests/ota/test_web_server_ota.py b/tests/component_tests/ota/test_web_server_ota.py new file mode 100644 index 0000000000..f8addc6a52 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota.py @@ -0,0 +1,98 @@ +"""Tests for the web_server OTA platform.""" + + +def test_web_server_ota_generated(generate_main): + """Test that web_server OTA platform generates correct code.""" + main_cpp = generate_main("tests/component_tests/ota/test_web_server_ota.yaml") + + # Check that the web server OTA component is included + assert "WebServerOTAComponent" in main_cpp + assert "web_server::WebServerOTAComponent" in main_cpp + + # Check that global web server base is referenced + assert "global_web_server_base" in main_cpp + + # Check component is registered + assert "App.register_component(web_server_webserverotacomponent_id)" in main_cpp + + +def test_web_server_ota_with_callbacks(generate_main): + """Test web_server OTA with state callbacks.""" + main_cpp = generate_main( + "tests/component_tests/ota/test_web_server_ota_callbacks.yaml" + ) + + # Check that web server OTA component is present + assert "WebServerOTAComponent" in main_cpp + + # Check that callbacks are configured + # The actual callback code is in the component implementation, not main.cpp + # But we can check that logger.log statements are present from the callbacks + assert "logger.log" in main_cpp + assert "OTA started" in main_cpp + assert "OTA completed" in main_cpp + assert "OTA error" in main_cpp + + +def test_web_server_ota_idf_multipart(generate_main): + """Test that ESP-IDF builds include multipart parser dependency.""" + main_cpp = generate_main("tests/component_tests/ota/test_web_server_ota_idf.yaml") + + # Check that web server OTA component is present + assert "WebServerOTAComponent" in main_cpp + + # For ESP-IDF builds, the framework type is esp-idf + # The multipart parser dependency is added by web_server_idf + assert "web_server::WebServerOTAComponent" in main_cpp + + +def test_web_server_ota_without_web_server_fails(generate_main): + """Test that web_server OTA requires web_server component.""" + # This should fail during validation since web_server_base is required + # but we can't test validation failures with generate_main + # Instead, verify that both components are needed in valid config + main_cpp = generate_main("tests/component_tests/ota/test_web_server_ota.yaml") + + # Both web server and OTA components should be present + assert "WebServer" in main_cpp + assert "WebServerOTAComponent" in main_cpp + + +def test_multiple_ota_platforms(generate_main): + """Test multiple OTA platforms can coexist.""" + main_cpp = generate_main("tests/component_tests/ota/test_web_server_ota_multi.yaml") + + # Check all OTA platforms are included + assert "WebServerOTAComponent" in main_cpp + assert "ESPHomeOTAComponent" in main_cpp + assert "OtaHttpRequestComponent" in main_cpp + + # Check components are from correct namespaces + assert "web_server::WebServerOTAComponent" in main_cpp + assert "esphome::ESPHomeOTAComponent" in main_cpp + assert "http_request::OtaHttpRequestComponent" in main_cpp + + +def test_web_server_ota_arduino_with_auth(generate_main): + """Test web_server OTA with Arduino framework and authentication.""" + main_cpp = generate_main( + "tests/component_tests/ota/test_web_server_ota_arduino.yaml" + ) + + # Check web server OTA component is present + assert "WebServerOTAComponent" in main_cpp + + # Check authentication is set up for web server + assert "set_auth_username" in main_cpp + assert "set_auth_password" in main_cpp + + +def test_web_server_ota_esp8266(generate_main): + """Test web_server OTA on ESP8266 platform.""" + main_cpp = generate_main( + "tests/component_tests/ota/test_web_server_ota_esp8266.yaml" + ) + + # Check web server OTA component is present + assert "WebServerOTAComponent" in main_cpp + assert "web_server::WebServerOTAComponent" in main_cpp diff --git a/tests/component_tests/ota/test_web_server_ota.yaml b/tests/component_tests/ota/test_web_server_ota.yaml new file mode 100644 index 0000000000..e0fda3d0b5 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota.yaml @@ -0,0 +1,15 @@ +esphome: + name: test_web_server_ota + +esp32: + board: esp32dev + +wifi: + ssid: MySSID + password: password1 + +web_server: + port: 80 + +ota: + - platform: web_server diff --git a/tests/component_tests/ota/test_web_server_ota_arduino.yaml b/tests/component_tests/ota/test_web_server_ota_arduino.yaml new file mode 100644 index 0000000000..9462548cc8 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota_arduino.yaml @@ -0,0 +1,18 @@ +esphome: + name: test_web_server_ota_arduino + +esp32: + board: esp32dev + +wifi: + ssid: MySSID + password: password1 + +web_server: + port: 80 + auth: + username: admin + password: admin + +ota: + - platform: web_server diff --git a/tests/component_tests/ota/test_web_server_ota_callbacks.yaml b/tests/component_tests/ota/test_web_server_ota_callbacks.yaml new file mode 100644 index 0000000000..c2fd9e0f19 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota_callbacks.yaml @@ -0,0 +1,31 @@ +esphome: + name: test_web_server_ota_callbacks + +esp32: + board: esp32dev + +wifi: + ssid: MySSID + password: password1 + +logger: + +web_server: + port: 80 + +ota: + - platform: web_server + on_begin: + - logger.log: "OTA started" + on_progress: + - logger.log: + format: "OTA progress: %.1f%%" + args: ["x"] + on_end: + - logger.log: "OTA completed" + on_error: + - logger.log: + format: "OTA error: %d" + args: ["x"] + on_state_change: + - logger.log: "OTA state changed" diff --git a/tests/component_tests/ota/test_web_server_ota_esp8266.yaml b/tests/component_tests/ota/test_web_server_ota_esp8266.yaml new file mode 100644 index 0000000000..a1b66a5b53 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota_esp8266.yaml @@ -0,0 +1,15 @@ +esphome: + name: test_web_server_ota_esp8266 + +esp8266: + board: nodemcuv2 + +wifi: + ssid: MySSID + password: password1 + +web_server: + port: 80 + +ota: + - platform: web_server diff --git a/tests/component_tests/ota/test_web_server_ota_idf.yaml b/tests/component_tests/ota/test_web_server_ota_idf.yaml new file mode 100644 index 0000000000..18b639347c --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota_idf.yaml @@ -0,0 +1,17 @@ +esphome: + name: test_web_server_ota_idf + +esp32: + board: esp32dev + framework: + type: esp-idf + +wifi: + ssid: MySSID + password: password1 + +web_server: + port: 80 + +ota: + - platform: web_server diff --git a/tests/component_tests/ota/test_web_server_ota_multi.yaml b/tests/component_tests/ota/test_web_server_ota_multi.yaml new file mode 100644 index 0000000000..7926b09c71 --- /dev/null +++ b/tests/component_tests/ota/test_web_server_ota_multi.yaml @@ -0,0 +1,21 @@ +esphome: + name: test_web_server_ota_multi + +esp32: + board: esp32dev + +wifi: + ssid: MySSID + password: password1 + +web_server: + port: 80 + +http_request: + verify_ssl: false + +ota: + - platform: esphome + password: "test_password" + - platform: web_server + - platform: http_request diff --git a/tests/component_tests/web_server/test_ota_migration.py b/tests/component_tests/web_server/test_ota_migration.py new file mode 100644 index 0000000000..7f122e72a7 --- /dev/null +++ b/tests/component_tests/web_server/test_ota_migration.py @@ -0,0 +1,37 @@ +"""Tests for web_server OTA migration validation.""" + +import pytest + +from esphome import config_validation as cv + + +def test_web_server_ota_true_fails_validation(): + """Test that web_server with ota: true fails validation with helpful message.""" + from esphome.components.web_server import validate_ota_removed + + # Config with ota: true should fail + config = {"ota": True} + + with pytest.raises(cv.Invalid) as exc_info: + validate_ota_removed(config) + + # Check error message contains migration instructions + error_msg = str(exc_info.value) + assert "has been removed from 'web_server'" in error_msg + assert "platform: web_server" in error_msg + assert "ota:" in error_msg + + +def test_web_server_ota_false_passes_validation(): + """Test that web_server with ota: false passes validation.""" + from esphome.components.web_server import validate_ota_removed + + # Config with ota: false should pass + config = {"ota": False} + result = validate_ota_removed(config) + assert result == config + + # Config without ota should also pass + config = {} + result = validate_ota_removed(config) + assert result == config diff --git a/tests/components/web_server/test_no_ota.esp32-idf.yaml b/tests/components/web_server/test_no_ota.esp32-idf.yaml index 1f677fb948..4064f518cf 100644 --- a/tests/components/web_server/test_no_ota.esp32-idf.yaml +++ b/tests/components/web_server/test_no_ota.esp32-idf.yaml @@ -1,3 +1,11 @@ +esphome: + name: test-web-server-no-ota-idf + +esp32: + board: esp32dev + framework: + type: esp-idf + packages: device_base: !include common.yaml @@ -6,4 +14,3 @@ packages: web_server: port: 8080 version: 2 - ota: false diff --git a/tests/components/web_server/test_ota.esp32-idf.yaml b/tests/components/web_server/test_ota.esp32-idf.yaml index 294e7f862e..37838b3d34 100644 --- a/tests/components/web_server/test_ota.esp32-idf.yaml +++ b/tests/components/web_server/test_ota.esp32-idf.yaml @@ -1,8 +1,6 @@ -# Test configuration for ESP-IDF web server with OTA enabled esphome: name: test-web-server-ota-idf -# Force ESP-IDF framework esp32: board: esp32dev framework: @@ -15,17 +13,17 @@ packages: ota: - platform: esphome password: "test_ota_password" + - platform: web_server -# Web server with OTA enabled +# Web server configuration web_server: port: 8080 version: 2 - ota: true include_internal: true # Enable debug logging for OTA logger: - level: DEBUG + level: VERBOSE logs: web_server: VERBOSE web_server_idf: VERBOSE diff --git a/tests/components/web_server/test_ota_disabled.esp32-idf.yaml b/tests/components/web_server/test_ota_disabled.esp32-idf.yaml index c7c7574e3b..b88b845db7 100644 --- a/tests/components/web_server/test_ota_disabled.esp32-idf.yaml +++ b/tests/components/web_server/test_ota_disabled.esp32-idf.yaml @@ -1,11 +1,18 @@ +esphome: + name: test-ws-ota-disabled-idf + +esp32: + board: esp32dev + framework: + type: esp-idf + packages: device_base: !include common.yaml -# OTA is configured but web_server OTA is disabled +# OTA is configured but web_server OTA is NOT included ota: - platform: esphome web_server: port: 8080 version: 2 - ota: false