Skip to content

Commit a32cec0

Browse files
committed
[fix] Don't save template default values in Device.config.context
1 parent ccdf7ea commit a32cec0

2 files changed

Lines changed: 53 additions & 39 deletions

File tree

openwisp_controller/config/static/config/js/widget.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,13 @@
326326
}
327327
alert(message);
328328
}
329-
329+
var contextField = $("#id_config-0-context");
330+
if (contextField.length) {
331+
var contextValue = JSON.parse(contextField.val());
332+
contextField.val(
333+
JSON.stringify(removeUnchangedDefaultValues(contextValue)),
334+
);
335+
}
330336
if ($advancedEl.is(":hidden")) {
331337
return;
332338
}

openwisp_controller/config/tests/test_selenium.py

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from django.urls.base import reverse
66
from selenium.common.exceptions import TimeoutException
77
from selenium.webdriver.common.action_chains import ActionChains
8-
from selenium.webdriver.common.alert import Alert
98
from selenium.webdriver.common.by import By
109
from selenium.webdriver.common.keys import Keys
1110
from selenium.webdriver.support import expected_conditions as EC
@@ -267,43 +266,6 @@ def test_change_config_backend(self):
267266
config_backend_select.select_by_visible_text("OpenWISP Firmware 1.x")
268267
self.wait_for_invisibility(By.XPATH, f'//*[@value="{template.id}"]')
269268

270-
def test_template_context_variables(self):
271-
self._create_template(
272-
name="Template1", default_values={"vni": "1"}, required=True
273-
)
274-
self._create_template(
275-
name="Template2", default_values={"vni": "2"}, required=True
276-
)
277-
device = self._create_config(organization=self._get_org()).device
278-
self.login()
279-
self.open(
280-
reverse("admin:config_device_change", args=[device.id]) + "#config-group"
281-
)
282-
self.hide_loading_overlay()
283-
try:
284-
WebDriverWait(self.web_driver, 2).until(
285-
EC.text_to_be_present_in_element_value(
286-
(
287-
By.XPATH,
288-
'//*[@id="flat-json-config-0-context"]/div[2]/div/div/input[1]',
289-
),
290-
"vni",
291-
)
292-
)
293-
except TimeoutException:
294-
self.fail("Timed out wating for configuration variabled to get loaded")
295-
self.find_element(
296-
by=By.XPATH, value='//*[@id="main-content"]/div[2]/a[3]'
297-
).click()
298-
try:
299-
WebDriverWait(self.web_driver, 2).until(EC.alert_is_present())
300-
except TimeoutException:
301-
pass
302-
else:
303-
alert = Alert(self.web_driver)
304-
alert.accept()
305-
self.fail("Unsaved changes alert displayed without any change")
306-
307269
def test_force_delete_device_with_deactivating_config(self):
308270
self._create_template(default=True)
309271
config = self._create_config(organization=self._get_org())
@@ -579,6 +541,52 @@ def test_unsaved_changes(self):
579541
if not self._is_unsaved_changes_alert_present():
580542
self.fail("Unsaved changes code was not executed.")
581543

544+
def test_template_context_variables(self):
545+
self._create_template(
546+
name="Template1", default_values={"vni": "1"}, required=True
547+
)
548+
self._create_template(
549+
name="Template2", default_values={"vni": "2"}, required=True
550+
)
551+
device = self._create_config(organization=self._get_org()).device
552+
self.login()
553+
self.open(
554+
reverse("admin:config_device_change", args=[device.id]) + "#config-group"
555+
)
556+
self.hide_loading_overlay()
557+
try:
558+
WebDriverWait(self.web_driver, 2).until(
559+
EC.text_to_be_present_in_element_value(
560+
(
561+
By.XPATH,
562+
'//*[@id="flat-json-config-0-context"]/div[2]/div/div/input[1]',
563+
),
564+
"vni",
565+
)
566+
)
567+
except TimeoutException:
568+
self.fail("Timed out waiting for configuration variables to get loaded")
569+
570+
with self.subTest("Navigating away from the page should not show alert"):
571+
self._override_unsaved_changes_alert()
572+
# Simulate navigating away from the page
573+
self.find_element(
574+
by=By.XPATH, value='//*[@id="main-content"]/div[2]/a[3]'
575+
).click()
576+
if self._is_unsaved_changes_alert_present():
577+
self.fail("Unsaved changes alert displayed without any change")
578+
579+
with self.subTest("Saving the objects should not save context variables"):
580+
self.open(reverse("admin:config_device_change", args=[device.id]))
581+
self.web_driver.execute_script(
582+
"window.scrollTo(0, document.body.scrollHeight);"
583+
)
584+
self.find_element(
585+
by=By.CSS_SELECTOR, value='input[name="_continue"]'
586+
).click()
587+
device.refresh_from_db()
588+
self.assertEqual(device.config.context, {})
589+
582590

583591
@tag("selenium_tests")
584592
class TestVpnAdmin(

0 commit comments

Comments
 (0)