mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 14:01:15 +02:00
fix: repair imports lost in the 3.1 rebase and meet the new lint baseline
The rebase onto upstream 3.1 (mypy + ruff I001/F401 waves) left the tree short of the newly enforced baselines in three ways: * contextlib / UbridgeError imports dropped as false duplicates during conflict resolution left NameErrors in iou_vm and qemu_vm (F821); the Dynamips router grabbed the compute-level NIOTAP instead of the hypervisor one, breaking TAP anchoring (test failure). * unused imports (KERNEL_UNSUPPORTED_FILTERS, UbridgeError, List) and unsorted blocks left behind where the stack's later commits moved the last usage elsewhere — ruff I001/F401/RUF022 now enforce these. * mypy, now baseline-free: cache dict annotations in tc_probe, the locators candidate list, the resolved-params None branch in the MCP runner, and validate_bpf_syntax keeps the upstream Dict[str, Any] return (the strict Optional[str] was wrong for the "valid" bool entry). The e2e raw-frame probe resolves its compiler via shutil.which (S607) and zips with strict= (B905); the remaining subprocess call is S603 by nature and gets a per-file ignore like other test files. ruff check/format clean, mypy at upstream parity (no new errors), full unit suite 2167 passed.
This commit is contained in:
35 files changed
+165
-136
No files matched your search
@@ -246,7 +246,9 @@ class TestDuplicateDeviceMerging:
|
||||
nornir = MagicMock()
|
||||
nornir.run.return_value = _aggregated_result({"R1": "merged output"})
|
||||
with (
|
||||
patch(f"{CONFIG_MOD}.get_device_ports_from_topology", return_value={"R1": {"port": 5000, "node_type": "iou"}}),
|
||||
patch(
|
||||
f"{CONFIG_MOD}.get_device_ports_from_topology", return_value={"R1": {"port": 5000, "node_type": "iou"}}
|
||||
),
|
||||
patch.object(ExecuteMultipleDeviceConfigCommands, "_initialize_nornir", return_value=nornir),
|
||||
):
|
||||
result = ExecuteMultipleDeviceConfigCommands()._run(
|
||||
@@ -310,7 +312,9 @@ class TestDuplicateDeviceMerging:
|
||||
nornir = MagicMock()
|
||||
nornir.run.return_value = _aggregated_result({"R1": "ok"})
|
||||
with (
|
||||
patch(f"{DISPLAY_MOD}.get_device_ports_from_topology", return_value={"R1": {"port": 5000, "node_type": "iou"}}),
|
||||
patch(
|
||||
f"{DISPLAY_MOD}.get_device_ports_from_topology", return_value={"R1": {"port": 5000, "node_type": "iou"}}
|
||||
),
|
||||
patch.object(ExecuteMultipleDeviceCommands, "_initialize_nornir", return_value=nornir),
|
||||
patch(f"{DISPLAY_MOD}.filter_forbidden_commands", side_effect=fake_filter),
|
||||
):
|
||||
|
||||
@@ -69,8 +69,12 @@ def test_uuid_params_pass_through_without_calls():
|
||||
def test_project_name_resolved():
|
||||
"""A name-shaped project_id becomes the project's UUID."""
|
||||
|
||||
run, calls = _run_factory(projects=[{"project_id": "11111111-1111-1111-1111-111111111111", "name": "other"},
|
||||
{"project_id": PROJECT_ID, "name": "my-lab"}])
|
||||
run, calls = _run_factory(
|
||||
projects=[
|
||||
{"project_id": "11111111-1111-1111-1111-111111111111", "name": "other"},
|
||||
{"project_id": PROJECT_ID, "name": "my-lab"},
|
||||
]
|
||||
)
|
||||
params, error = resolve_locators({"project_id": "my-lab"}, run)
|
||||
assert error is None
|
||||
assert params["project_id"] == PROJECT_ID
|
||||
@@ -88,8 +92,9 @@ def test_project_name_not_found_lists_known_names():
|
||||
|
||||
def test_node_name_resolved_within_project():
|
||||
|
||||
run, calls = _run_factory(projects=[{"project_id": PROJECT_ID, "name": "my-lab"}],
|
||||
nodes=[{"node_id": NODE_ID, "name": "FRRDocker-4"}])
|
||||
run, calls = _run_factory(
|
||||
projects=[{"project_id": PROJECT_ID, "name": "my-lab"}], nodes=[{"node_id": NODE_ID, "name": "FRRDocker-4"}]
|
||||
)
|
||||
params, error = resolve_locators({"project_id": "my-lab", "node_id": "FRRDocker-4"}, run)
|
||||
assert error is None
|
||||
assert params["project_id"] == PROJECT_ID
|
||||
@@ -125,11 +130,10 @@ def test_handler_failure_during_resolution_is_reported():
|
||||
def test_did_you_mean_appended_for_transcription_slip():
|
||||
"""The 2c9e -> 3b9e class of typo earns exactly one hint."""
|
||||
|
||||
run, _calls = _run_factory(projects=[{"project_id": PROJECT_ID, "name": "my-lab"}],
|
||||
nodes=[{"node_id": NODE_ID, "name": "FRRDocker-4"}])
|
||||
result = add_did_you_mean(
|
||||
{"error": f"Node ID {NODE_ID_TYPO} doesn't exist"}, {"project_id": PROJECT_ID}, run
|
||||
run, _calls = _run_factory(
|
||||
projects=[{"project_id": PROJECT_ID, "name": "my-lab"}], nodes=[{"node_id": NODE_ID, "name": "FRRDocker-4"}]
|
||||
)
|
||||
result = add_did_you_mean({"error": f"Node ID {NODE_ID_TYPO} doesn't exist"}, {"project_id": PROJECT_ID}, run)
|
||||
assert f"Did you mean node 'FRRDocker-4' ({NODE_ID})" in result["error"]
|
||||
# original message preserved
|
||||
assert NODE_ID_TYPO in result["error"]
|
||||
@@ -144,9 +148,7 @@ def test_no_hint_when_too_far_or_ambiguous():
|
||||
|
||||
two = [NODE_ID, "b78a2630-2b9e-4b43-9397-c855c8053d1a"] # both within distance 2 of the typo
|
||||
run2, _calls2 = _run_factory(nodes=[{"node_id": i, "name": f"n{i}"} for i in two])
|
||||
result2 = add_did_you_mean(
|
||||
{"error": f"Node ID {NODE_ID_TYPO} doesn't exist"}, {"project_id": PROJECT_ID}, run2
|
||||
)
|
||||
result2 = add_did_you_mean({"error": f"Node ID {NODE_ID_TYPO} doesn't exist"}, {"project_id": PROJECT_ID}, run2)
|
||||
assert "Did you mean" not in result2["error"]
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user