Skip to content

Commit 0f9b3b8

Browse files
committed
Rename ManifestBrowser.get_flattened_values, apply the same fix for _save_manifest in RemoteController, make tests more readable.
1 parent e0a73f6 commit 0f9b3b8

File tree

6 files changed

+111
-188
lines changed

6 files changed

+111
-188
lines changed

checkbox-ng/checkbox_ng/launcher/controller.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -628,24 +628,20 @@ def _save_manifest(self, interactive):
628628
if not manifest_repr:
629629
_logger.info("Skipping saving of the manifest")
630630
return
631-
if interactive:
631+
632+
if interactive and ManifestBrowser.has_visible_manifests(
633+
manifest_repr
634+
):
632635
# Ask the user the values
633636
to_save_manifest = ManifestBrowser(
634637
"System Manifest:", manifest_repr
635638
).run()
636639
else:
637-
# Use the one provided in repr
638-
# repr is question : [manifests]
639-
# manifest ex m1 is [conf_m1_1, conf_m1_2, ...]
640-
# here we recover [conf_m1_1, conf_m1_2, ..., conf_m2_1, ...]
641-
all_preconf = (
642-
conf
643-
for conf_list in manifest_repr.values()
644-
for conf in conf_list
640+
# Use the one provided in repr (either non-interactive or no visible manifests)
641+
to_save_manifest = ManifestBrowser.get_flattened_values(
642+
manifest_repr
645643
)
646-
to_save_manifest = {
647-
conf["id"]: conf["value"] for conf in all_preconf
648-
}
644+
649645
self.sa.save_manifest_json(json.dumps(to_save_manifest))
650646

651647
def select_jobs(self, all_jobs):

checkbox-ng/checkbox_ng/launcher/subcommands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ def _save_manifest(self, interactive):
702702
).run()
703703
else:
704704
# Use the one provided in repr (either non-interactive or no visible manifests)
705-
to_save_manifest = ManifestBrowser.get_default_values(
705+
to_save_manifest = ManifestBrowser.get_flattened_values(
706706
manifest_repr
707707
)
708708

checkbox-ng/checkbox_ng/launcher/test_controller.py

Lines changed: 80 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from checkbox_ng.launcher.controller import is_hostname_a_loopback
2929

3030

31-
class ControllerTests(TestCase):
31+
class TestRemoteController(TestCase):
3232
@mock.patch("checkbox_ng.launcher.controller.is_hostname_a_loopback")
3333
@mock.patch("time.time")
3434
@mock.patch("builtins.print")
@@ -1063,54 +1063,98 @@ def test_start_session_runtime_error(self):
10631063
with self.assertRaises(SystemExit) as _:
10641064
RemoteController.start_session(self_mock)
10651065

1066-
def test__save_manifest_no_repr(self):
1067-
self_mock = mock.MagicMock()
1068-
self_mock.sa.get_manifest_repr_json.return_value = "{}"
1069-
RemoteController._save_manifest(self_mock, False)
1070-
10711066
@mock.patch("checkbox_ng.launcher.controller.ManifestBrowser")
1072-
def test__save_manifest_interactive(self, manifest_browser_mock):
1073-
self_mock = mock.MagicMock()
1074-
manifest_repr = {"Question 1": [{"id": "conf1", "value": "val1"}]}
1075-
self_mock.sa.get_manifest_repr_json.return_value = json.dumps(
1076-
manifest_repr
1077-
)
1078-
to_save_manifest = {"conf1": "new_val"}
1079-
manifest_browser_mock.return_value.run.return_value = to_save_manifest
1067+
def test__save_manifest_interactive_with_visible_manifests(
1068+
self, mock_browser_class
1069+
):
1070+
controller = RemoteController()
1071+
sa_mock = mock.MagicMock()
1072+
controller._sa = sa_mock
10801073

1081-
RemoteController._save_manifest(self_mock, True)
1074+
manifest_repr = {
1075+
"section1": [
1076+
{"id": "visible1", "value": 0, "hidden": False},
1077+
{"id": "visible2", "value": False, "hidden": False},
1078+
]
1079+
}
1080+
sa_mock.get_manifest_repr_json.return_value = json.dumps(manifest_repr)
10821081

1083-
manifest_browser_mock.assert_called_once_with(
1084-
"System Manifest:", manifest_repr
1085-
)
1086-
self_mock.sa.save_manifest_json.assert_called_once_with(
1087-
json.dumps(to_save_manifest)
1082+
mock_browser = mock.MagicMock()
1083+
mock_browser.run.return_value = {
1084+
"visible1": 5,
1085+
"visible2": True,
1086+
}
1087+
mock_browser_class.return_value = mock_browser
1088+
mock_browser_class.has_visible_manifests.return_value = True
1089+
1090+
controller._save_manifest(interactive=True)
1091+
1092+
sa_mock.save_manifest_json.assert_called_with(
1093+
json.dumps({"visible1": 5, "visible2": True})
10881094
)
10891095

1090-
def test__save_manifest_non_interactive(self):
1091-
self_mock = mock.MagicMock()
1096+
@mock.patch("checkbox_ng.launcher.controller.ManifestBrowser")
1097+
def test__save_manifest_interactive_no_visible_manifests(
1098+
self, mock_browser_class
1099+
):
1100+
controller = RemoteController()
1101+
sa_mock = mock.MagicMock()
1102+
controller._sa = sa_mock
1103+
10921104
manifest_repr = {
1093-
"Question 1": [
1094-
{"id": "conf1", "value": "val1"},
1095-
{"id": "conf2", "value": "val2"},
1096-
],
1097-
"Question 2": [{"id": "conf3", "value": "val3"}],
1105+
"section1": [
1106+
{"id": "hidden1", "value": True, "hidden": True},
1107+
{"id": "hidden2", "value": 2, "hidden": True},
1108+
]
1109+
}
1110+
sa_mock.get_manifest_repr_json.return_value = json.dumps(manifest_repr)
1111+
mock_browser_class.has_visible_manifests.return_value = False
1112+
mock_browser_class.get_flattened_values.return_value = {
1113+
"hidden1": True,
1114+
"hidden2": 2,
10981115
}
1099-
self_mock.sa.get_manifest_repr_json.return_value = json.dumps(
1100-
manifest_repr
1116+
1117+
controller._save_manifest(interactive=True)
1118+
1119+
self.assertEqual(mock_browser_class.call_count, 0)
1120+
self.assertEqual(
1121+
mock_browser_class.has_visible_manifests.call_count, 1
1122+
)
1123+
self.assertEqual(mock_browser_class.get_flattened_values.call_count, 1)
1124+
self.assertEqual(sa_mock.save_manifest_json.call_count, 1)
1125+
sa_mock.save_manifest_json.assert_called_with(
1126+
json.dumps({"hidden1": True, "hidden2": 2})
11011127
)
11021128

1103-
RemoteController._save_manifest(self_mock, False)
1129+
@mock.patch("checkbox_ng.launcher.controller.ManifestBrowser")
1130+
def test__save_manifest_non_interactive(self, mock_browser_class):
1131+
controller = RemoteController()
1132+
sa_mock = mock.MagicMock()
1133+
controller._sa = sa_mock
11041134

1105-
expected_to_save = {
1106-
"conf1": "val1",
1107-
"conf2": "val2",
1108-
"conf3": "val3",
1135+
manifest_repr = {
1136+
"section1": [
1137+
{"id": "manifest1", "value": False, "hidden": False},
1138+
{"id": "manifest2", "value": 7, "hidden": True},
1139+
]
1140+
}
1141+
sa_mock.get_manifest_repr_json.return_value = json.dumps(manifest_repr)
1142+
mock_browser_class.get_flattened_values.return_value = {
1143+
"manifest1": False,
1144+
"manifest2": 7,
11091145
}
1110-
self_mock.sa.save_manifest_json.assert_called_once_with(
1111-
json.dumps(expected_to_save)
1146+
1147+
controller._save_manifest(interactive=False)
1148+
1149+
sa_mock.save_manifest_json.assert_called_with(
1150+
json.dumps({"manifest1": False, "manifest2": 7})
11121151
)
11131152

1153+
def test__save_manifest_no_repr(self):
1154+
self_mock = mock.MagicMock()
1155+
self_mock.sa.get_manifest_repr_json.return_value = "{}"
1156+
RemoteController._save_manifest(self_mock, False)
1157+
11141158
def test_select_jobs_forced_with_manifest(self):
11151159
self_mock = mock.MagicMock()
11161160
self_mock.launcher.get_value.return_value = True

checkbox-ng/checkbox_ng/launcher/test_subcommands.py

Lines changed: 17 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -808,26 +808,24 @@ def test__save_manifest_interactive_with_visible_manifests(
808808

809809
manifest_repr = {
810810
"section1": [
811-
{"id": "visible1", "value": "default1", "hidden": False},
812-
{"id": "visible2", "value": "default2", "hidden": False},
811+
{"id": "visible1", "value": 0, "hidden": False},
812+
{"id": "visible2", "value": False, "hidden": False},
813813
]
814814
}
815815
ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
816816

817817
mock_browser = MagicMock()
818818
mock_browser.run.return_value = {
819-
"visible1": "user_value1",
820-
"visible2": "user_value2",
819+
"visible1": 5,
820+
"visible2": True,
821821
}
822822
mock_browser_class.return_value = mock_browser
823823
mock_browser_class.has_visible_manifests.return_value = True
824824

825825
launcher._save_manifest(interactive=True)
826826

827-
self.assertEqual(mock_browser.run.call_count, 1)
828-
self.assertEqual(ctx_mock.sa.save_manifest.call_count, 1)
829827
ctx_mock.sa.save_manifest.assert_called_with(
830-
{"visible1": "user_value1", "visible2": "user_value2"}
828+
{"visible1": 5, "visible2": True}
831829
)
832830

833831
@patch("checkbox_ng.launcher.subcommands.ManifestBrowser")
@@ -840,27 +838,21 @@ def test__save_manifest_interactive_no_visible_manifests(
840838

841839
manifest_repr = {
842840
"section1": [
843-
{"id": "hidden1", "value": "default1", "hidden": True},
844-
{"id": "hidden2", "value": "default2", "hidden": True},
841+
{"id": "hidden1", "value": True, "hidden": True},
842+
{"id": "hidden2", "value": 2, "hidden": True},
845843
]
846844
}
847845
ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
848846
mock_browser_class.has_visible_manifests.return_value = False
849-
mock_browser_class.get_default_values.return_value = {
850-
"hidden1": "default1",
851-
"hidden2": "default2",
847+
mock_browser_class.get_flattened_values.return_value = {
848+
"hidden1": True,
849+
"hidden2": 2,
852850
}
853851

854852
launcher._save_manifest(interactive=True)
855853

856-
self.assertEqual(mock_browser_class.call_count, 0)
857-
self.assertEqual(
858-
mock_browser_class.has_visible_manifests.call_count, 1
859-
)
860-
self.assertEqual(mock_browser_class.get_default_values.call_count, 1)
861-
self.assertEqual(ctx_mock.sa.save_manifest.call_count, 1)
862854
ctx_mock.sa.save_manifest.assert_called_with(
863-
{"hidden1": "default1", "hidden2": "default2"}
855+
{"hidden1": True, "hidden2": 2}
864856
)
865857

866858
@patch("checkbox_ng.launcher.subcommands.ManifestBrowser")
@@ -871,27 +863,20 @@ def test__save_manifest_non_interactive(self, mock_browser_class):
871863

872864
manifest_repr = {
873865
"section1": [
874-
{"id": "manifest1", "value": "default1", "hidden": False},
875-
{"id": "manifest2", "value": "default2", "hidden": True},
866+
{"id": "manifest1", "value": False, "hidden": False},
867+
{"id": "manifest2", "value": 7, "hidden": True},
876868
]
877869
}
878870
ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
879-
mock_browser_class.get_default_values.return_value = {
880-
"manifest1": "default1",
881-
"manifest2": "default2",
871+
mock_browser_class.get_flattened_values.return_value = {
872+
"manifest1": False,
873+
"manifest2": 7,
882874
}
883875

884876
launcher._save_manifest(interactive=False)
885877

886-
self.assertEqual(mock_browser_class.call_count, 0)
887-
self.assertEqual(
888-
mock_browser_class.has_visible_manifests.call_count, 0
889-
)
890-
self.assertEqual(mock_browser_class.get_default_values.call_count, 1)
891-
mock_browser_class.get_default_values.assert_called_with(manifest_repr)
892-
self.assertEqual(ctx_mock.sa.save_manifest.call_count, 1)
893878
ctx_mock.sa.save_manifest.assert_called_with(
894-
{"manifest1": "default1", "manifest2": "default2"}
879+
{"manifest1": False, "manifest2": 7}
895880
)
896881

897882

@@ -1291,107 +1276,3 @@ def find_children_by_name(pattern):
12911276
# we expect the relevant unit function to leave unfound values the same
12921277
# and all in the same order
12931278
self.assertEqual(found_ids, ["other2.*", *should_find, "other1.*"])
1294-
1295-
1296-
def setUp(self):
1297-
self.launcher = Launcher()
1298-
self.ctx_mock = MagicMock()
1299-
self.launcher.ctx = self.ctx_mock
1300-
1301-
def test__save_manifest_no_or_empty_manifest_repr(self):
1302-
1303-
cases = [
1304-
("None", None),
1305-
("Empty", {}),
1306-
]
1307-
1308-
for case_name, manifest_repr in cases:
1309-
with self.subTest(case=case_name):
1310-
self.ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
1311-
self.launcher._save_manifest(interactive=True)
1312-
self.assertEqual(self.ctx_mock.sa.save_manifest.call_count, 0)
1313-
1314-
@patch("checkbox_ng.launcher.subcommands.ManifestBrowser")
1315-
def test__save_manifest_interactive_with_visible_manifests(
1316-
self, mock_browser_class
1317-
):
1318-
manifest_repr = {
1319-
"section1": [
1320-
{"id": "visible1", "value": "default1", "hidden": False},
1321-
{"id": "visible2", "value": "default2", "hidden": False},
1322-
]
1323-
}
1324-
self.ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
1325-
1326-
mock_browser = MagicMock()
1327-
mock_browser.run.return_value = {
1328-
"visible1": "user_value1",
1329-
"visible2": "user_value2",
1330-
}
1331-
mock_browser_class.return_value = mock_browser
1332-
mock_browser_class.has_visible_manifests.return_value = True
1333-
1334-
self.launcher._save_manifest(interactive=True)
1335-
1336-
self.assertEqual(mock_browser.run.call_count, 1)
1337-
self.assertEqual(self.ctx_mock.sa.save_manifest.call_count, 1)
1338-
self.ctx_mock.sa.save_manifest.assert_called_with(
1339-
{"visible1": "user_value1", "visible2": "user_value2"}
1340-
)
1341-
1342-
@patch("checkbox_ng.launcher.subcommands.ManifestBrowser")
1343-
def test__save_manifest_interactive_no_visible_manifests(
1344-
self, mock_browser_class
1345-
):
1346-
manifest_repr = {
1347-
"section1": [
1348-
{"id": "hidden1", "value": "default1", "hidden": True},
1349-
{"id": "hidden2", "value": "default2", "hidden": True},
1350-
]
1351-
}
1352-
self.ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
1353-
mock_browser_class.has_visible_manifests.return_value = False
1354-
mock_browser_class.get_default_values.return_value = {
1355-
"hidden1": "default1",
1356-
"hidden2": "default2",
1357-
}
1358-
1359-
self.launcher._save_manifest(interactive=True)
1360-
1361-
self.assertEqual(mock_browser_class.call_count, 0)
1362-
self.assertEqual(
1363-
mock_browser_class.has_visible_manifests.call_count, 1
1364-
)
1365-
self.assertEqual(mock_browser_class.get_default_values.call_count, 1)
1366-
self.assertEqual(self.ctx_mock.sa.save_manifest.call_count, 1)
1367-
self.ctx_mock.sa.save_manifest.assert_called_with(
1368-
{"hidden1": "default1", "hidden2": "default2"}
1369-
)
1370-
1371-
@patch("checkbox_ng.launcher.subcommands.ManifestBrowser")
1372-
def test__save_manifest_non_interactive(self, mock_browser_class):
1373-
"""Test _save_manifest in non-interactive mode."""
1374-
manifest_repr = {
1375-
"section1": [
1376-
{"id": "manifest1", "value": "default1", "hidden": False},
1377-
{"id": "manifest2", "value": "default2", "hidden": True},
1378-
]
1379-
}
1380-
self.ctx_mock.sa.get_manifest_repr.return_value = manifest_repr
1381-
mock_browser_class.get_default_values.return_value = {
1382-
"manifest1": "default1",
1383-
"manifest2": "default2",
1384-
}
1385-
1386-
self.launcher._save_manifest(interactive=False)
1387-
1388-
self.assertEqual(mock_browser_class.call_count, 0)
1389-
self.assertEqual(
1390-
mock_browser_class.has_visible_manifests.call_count, 0
1391-
)
1392-
self.assertEqual(mock_browser_class.get_default_values.call_count, 1)
1393-
mock_browser_class.get_default_values.assert_called_with(manifest_repr)
1394-
self.assertEqual(self.ctx_mock.sa.save_manifest.call_count, 1)
1395-
self.ctx_mock.sa.save_manifest.assert_called_with(
1396-
{"manifest1": "default1", "manifest2": "default2"}
1397-
)

0 commit comments

Comments
 (0)