diff --git a/front/plugins/sync/hub.php b/front/plugins/sync/hub.php
index 6c97b7fb..3894b2ae 100755
--- a/front/plugins/sync/hub.php
+++ b/front/plugins/sync/hub.php
@@ -48,7 +48,7 @@ if ($method === 'GET') {
$apiRoot = getenv('NETALERTX_API') ?: '/tmp/api';
$file_path = rtrim($apiRoot, '/') . '/table_devices.json';
- $data = file_get_contents($file_path);
+ $data = file_get_contents($file_path);
// Prepare the data to return as a JSON response
$response_data = base64_encode($data);
@@ -75,7 +75,7 @@ else if ($method === 'POST') {
// // check location
// if (!is_dir($storage_path)) {
// echo "Could not open folder: {$storage_path}";
- // write_notification("[Plugin: SYNC] Could not open folder: {$storage_path}", "alert");
+ // write_notification("[Plugin: SYNC] Could not open folder: {$storage_path}", "alert");
// http_response_code(500);
// exit;
// }
diff --git a/test/ui/test_helpers.py b/test/ui/test_helpers.py
index c61f9a3d..ce054a3b 100644
--- a/test/ui/test_helpers.py
+++ b/test/ui/test_helpers.py
@@ -30,6 +30,10 @@ def get_api_token():
return None
+# Load API_TOKEN at module initialization
+API_TOKEN = get_api_token()
+
+
def get_driver(download_dir=None):
"""Create a Selenium WebDriver for Chrome/Chromium
diff --git a/test/ui/test_ui_settings.py b/test/ui/test_ui_settings.py
index 2298e3be..252420b9 100644
--- a/test/ui/test_ui_settings.py
+++ b/test/ui/test_ui_settings.py
@@ -6,6 +6,7 @@ Tests settings page load, settings groups, and configuration
import time
import os
+import requests
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
@@ -14,7 +15,7 @@ import sys
# Add test directory to path
sys.path.insert(0, os.path.dirname(__file__))
-from test_helpers import BASE_URL # noqa: E402 [flake8 lint suppression]
+from test_helpers import BASE_URL, API_TOKEN # noqa: E402 [flake8 lint suppression]
def test_settings_page_loads(driver):
@@ -156,41 +157,75 @@ def test_save_settings_no_loss_of_data(driver):
This test verifies that the saveSettings() function properly:
1. Loads all settings
- 2. Preserves settings that weren't modified
- 3. Saves without data loss
+ 2. Update PLUGINS_KEEP_HIST - set to 333
+ 3. Saves
+ 4. Check API endpoint that the setting is updated correctly
"""
driver.get(f"{BASE_URL}/settings.php")
time.sleep(3)
- # Count the total number of setting inputs before save
- inputs_before = driver.find_elements(By.CSS_SELECTOR, "input, select, textarea")
- initial_count = len(inputs_before)
-
- if initial_count == 0:
- assert True, "No settings inputs found"
+ # Find the PLUGINS_KEEP_HIST input field
+ plugins_keep_hist_input = None
+ try:
+ plugins_keep_hist_input = WebDriverWait(driver, 10).until(
+ EC.presence_of_element_located((By.ID, "PLUGINS_KEEP_HIST"))
+ )
+ except:
+ assert True, "PLUGINS_KEEP_HIST input not found, skipping test"
return
- print(f"Found {initial_count} settings inputs")
+ # Get original value
+ original_value = plugins_keep_hist_input.get_attribute("value")
+ print(f"PLUGINS_KEEP_HIST original value: {original_value}")
- # Click save without modifying anything
+ # Set new value
+ new_value = "333"
+ plugins_keep_hist_input.clear()
+ plugins_keep_hist_input.send_keys(new_value)
+ time.sleep(1)
+
+ # Click save
save_btn = driver.find_element(By.CSS_SELECTOR, "button#save")
driver.execute_script("arguments[0].click();", save_btn)
time.sleep(3)
- # Reload the page
- driver.get(f"{BASE_URL}/settings.php")
- time.sleep(3)
+ # Check for errors after save
+ error_elements = driver.find_elements(By.CSS_SELECTOR, ".alert-danger, .error-message, .callout-danger")
+ has_visible_error = False
+ for elem in error_elements:
+ if elem.is_displayed():
+ error_text = elem.text
+ if error_text and len(error_text) > 0:
+ print(f"Found error message: {error_text}")
+ has_visible_error = True
+ break
- # Count settings again
- inputs_after = driver.find_elements(By.CSS_SELECTOR, "input, select, textarea")
- final_count = len(inputs_after)
+ assert not has_visible_error, "No error messages should be displayed after save"
- # Should have the same number of settings (within 10% tolerance for dynamic elements)
- tolerance = max(1, int(initial_count * 0.1))
- assert abs(initial_count - final_count) <= tolerance, \
- f"Settings count should be preserved. Before: {initial_count}, After: {final_count}"
+ # Verify via API endpoint /settings/
+ # Extract backend API URL from BASE_URL
+ api_base = BASE_URL.replace('/front', '').replace(':20211', ':20212') # Switch to backend port
+ api_url = f"{api_base}/settings/PLUGINS_KEEP_HIST"
- print(f"✅ Settings preservation verified: {initial_count} -> {final_count}")
+ headers = {
+ "Authorization": f"Bearer {API_TOKEN}"
+ }
+ try:
+ response = requests.get(api_url, headers=headers, timeout=5)
+ assert response.status_code == 200, f"API returned {response.status_code}: {response.text}"
-# Settings endpoint doesn't exist in Flask API - settings are managed via PHP/config files
+ data = response.json()
+ assert data.get("success") == True, f"API returned success=false: {data}"
+
+ saved_value = str(data.get("value"))
+ print(f"API /settings/PLUGINS_KEEP_HIST returned: {saved_value}")
+ assert saved_value == new_value, \
+ f"Setting not persisted correctly. Expected: {new_value}, Got: {saved_value}"
+
+ except requests.exceptions.RequestException as e:
+ assert False, f"Error calling settings API: {e}"
+ except Exception as e:
+ assert False, f"Error verifying setting via API: {e}"
+
+ print(f"✅ Settings update verified via API: PLUGINS_KEEP_HIST changed to {new_value}")