diff --git a/scripts/extract_mermaid.py b/scripts/extract_mermaid.py
index a134e3eed..82b47da11 100755
--- a/scripts/extract_mermaid.py
+++ b/scripts/extract_mermaid.py
@@ -27,11 +27,11 @@ Usage:
python3 scripts/extract_mermaid.py docs/implemented/ my_svgs/
"""
-import re
-import os
-import sys
-import subprocess
import argparse
+import os
+import re
+import subprocess
+import sys
# Chrome binary path discovery
PUPPETEER_CACHE = os.environ.get(
diff --git a/scripts/publish_api_documentation.py b/scripts/publish_api_documentation.py
index ab2e15704..1754d63bf 100644
--- a/scripts/publish_api_documentation.py
+++ b/scripts/publish_api_documentation.py
@@ -20,8 +20,8 @@
import json
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
-from gns3server.api.server import app
+from gns3server.api.server import app
if __name__ == "__main__":
with open("../docs/openapi.json", "w") as fd:
diff --git a/scripts/welcome.py b/scripts/welcome.py
index 277a35138..9e9dc4c84 100644
--- a/scripts/welcome.py
+++ b/scripts/welcome.py
@@ -15,15 +15,16 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import configparser
import locale
-import re
import os
+import re
+import subprocess
import sys
import time
-import subprocess
-import configparser
-from json import loads as convert
import urllib.request
+from json import loads as convert
+
from dialog import Dialog, PythonDialogBug
diff --git a/tests/agent/mcp/test_device_tools.py b/tests/agent/mcp/test_device_tools.py
index 6a7c04169..07339cb5b 100644
--- a/tests/agent/mcp/test_device_tools.py
+++ b/tests/agent/mcp/test_device_tools.py
@@ -6,9 +6,9 @@ device_config_send / device_show_run / vpcs_config_set.
"""
import json
+from unittest.mock import MagicMock, patch
import pytest
-from unittest.mock import MagicMock, patch
VPCS_MOD = "gns3server.agent.gns3_copilot.tools_v2.vpcs_tools_netmiko"
diff --git a/tests/agent/mcp/test_handlers.py b/tests/agent/mcp/test_handlers.py
index 97938a35d..9752c4422 100644
--- a/tests/agent/mcp/test_handlers.py
+++ b/tests/agent/mcp/test_handlers.py
@@ -5,9 +5,9 @@ Tests that handlers correctly transform tool parameters into HTTP calls.
"""
import json
+from unittest.mock import MagicMock, patch
import pytest
-from unittest.mock import MagicMock, patch
def _mock_conn(json_result=None):
@@ -222,6 +222,7 @@ class TestNode:
def test_create_batch_preserves_submission_order(self, ctx):
import time
+
from gns3server.agent.gns3_copilot.gns3_client.api_handlers import create_node_handler
with patch(f"{AH}._get_connector") as m:
@@ -249,6 +250,7 @@ class TestNode:
def test_create_batch_default_names_created_sequentially(self, ctx):
import threading
import time
+
from gns3server.agent.gns3_copilot.gns3_client.api_handlers import create_node_handler
def _run(nodes_param):
@@ -502,6 +504,7 @@ class TestLink:
def test_create_batch_preserves_submission_order(self, ctx):
import time
+
from gns3server.agent.gns3_copilot.gns3_client.api_handlers import create_link_handler
with patch(f"{AH}._get_connector") as m:
diff --git a/tests/agent/test_gns3_client.py b/tests/agent/test_gns3_client.py
index 36e57fd72..d04dc49a7 100644
--- a/tests/agent/test_gns3_client.py
+++ b/tests/agent/test_gns3_client.py
@@ -27,7 +27,6 @@ Tests for the shared GNS3 REST client layer (gns3_copilot.gns3_client):
import pytest
-
# ── project_inventory ────────────────────────────────────────────────────
@@ -131,8 +130,8 @@ def test_device_ports_prefer_netmiko_field_over_tag(monkeypatch):
the tag stays as fallback when the field is missing.
"""
pytest.importorskip("jwt", reason="ai-features extras not installed")
- from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
from gns3server.agent.gns3_copilot import gns3_client
+ from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
class _FakeTopology:
def _run(self, project_id=None, jwt_token=None, url=None):
@@ -164,8 +163,8 @@ def test_device_ports_prefer_netmiko_field_over_tag(monkeypatch):
def test_device_ports_error_without_any_device_type(monkeypatch):
pytest.importorskip("jwt", reason="ai-features extras not installed")
- from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
from gns3server.agent.gns3_copilot import gns3_client
+ from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
class _FakeTopology:
def _run(self, project_id=None, jwt_token=None, url=None):
@@ -193,8 +192,8 @@ def test_device_ports_inject_default_credentials(monkeypatch):
keep inheriting from the group.
"""
pytest.importorskip("jwt", reason="ai-features extras not installed")
- from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
from gns3server.agent.gns3_copilot import gns3_client
+ from gns3server.agent.gns3_copilot.utils import get_gns3_device_port
class _FakeTopology:
def _run(self, project_id=None, jwt_token=None, url=None):
diff --git a/tests/agent/test_skills_device_topics.py b/tests/agent/test_skills_device_topics.py
index 68d8371c5..6a1ca7acb 100644
--- a/tests/agent/test_skills_device_topics.py
+++ b/tests/agent/test_skills_device_topics.py
@@ -301,9 +301,9 @@ class TestReloadSkillsValidation:
"""
def test_invalid_injection_skill_is_dropped(self, tmp_path, monkeypatch):
- from gns3server.config import Config
from gns3server.agent.gns3_copilot.skills import registry
from gns3server.agent.gns3_copilot.skills.manager import SkillsManager
+ from gns3server.config import Config
# SkillsManager derives its local path from /skills
injection_dir = tmp_path / "skills" / "injection"
diff --git a/tests/conftest.py b/tests/conftest.py
index bc9f7c823..8e6e67103 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,35 +1,35 @@
+import base64
+import configparser
+import os
+import platform
+import resource
+import shutil
+import stat
+import sys
+import tempfile
+import uuid
+from pathlib import Path
+from typing import Any, AsyncGenerator
+from unittest.mock import MagicMock, patch
+
import pytest
import asyncio
import pytest_asyncio
-import tempfile
-import shutil
-import sys
-import os
-import uuid
-import configparser
-import base64
-import stat
-import resource
-import platform
-
from fastapi import FastAPI
-from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from httpx import AsyncClient
from httpx_ws.transport import ASGIWebSocketTransport
-from unittest.mock import MagicMock, patch
-from pathlib import Path
-from typing import AsyncGenerator, Any
+from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
-from gns3server.controller import Controller
-from gns3server.config import Config
+from gns3server import schemas
+from gns3server.api.routes.controller.dependencies.database import get_db_session
from gns3server.compute import MODULES
from gns3server.compute.port_manager import PortManager
from gns3server.compute.project_manager import ProjectManager
-from gns3server.db.models import Base, User, Compute
-from gns3server.db.repositories.users import UsersRepository
+from gns3server.config import Config
+from gns3server.controller import Controller
+from gns3server.db.models import Base, Compute, User
from gns3server.db.repositories.computes import ComputesRepository
-from gns3server.api.routes.controller.dependencies.database import get_db_session
-from gns3server import schemas
+from gns3server.db.repositories.users import UsersRepository
from gns3server.schemas.controller.computes import Protocol
from gns3server.services import auth_service
from gns3server.services.authentication import DEFAULT_JWT_SECRET_KEY
diff --git a/tests/stress/benchmark_running_server.py b/tests/stress/benchmark_running_server.py
index fcc5e7640..c19187a7e 100644
--- a/tests/stress/benchmark_running_server.py
+++ b/tests/stress/benchmark_running_server.py
@@ -6,10 +6,10 @@ This test connects to an already running GNS3 server and measures
the response time of the GET /projects endpoint.
"""
-import asyncio
-import time
import argparse
+import asyncio
import sys
+import time
import uuid
from pathlib import Path
diff --git a/tests/stress/telnet_race_condition_test.py b/tests/stress/telnet_race_condition_test.py
index e808d319f..be996cc4b 100644
--- a/tests/stress/telnet_race_condition_test.py
+++ b/tests/stress/telnet_race_condition_test.py
@@ -10,12 +10,12 @@ Usage:
python telnet_race_condition_test.py --host 127.0.0.1 --port 2000 --connections 10
"""
-import asyncio
import argparse
+import asyncio
import logging
+import sys
import time
from typing import List, Optional
-import sys
# Configure logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
diff --git a/tests/test_config.py b/tests/test_config.py
index fb2b08dc0..50e9318d2 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -17,13 +17,12 @@
import configparser
import os
-import pytest
-from gns3server.config import Config
-from gns3server.config import ConfigConflictError
-from gns3server.config import ServerConfig
+import pytest
from pydantic import ValidationError
+from gns3server.config import Config, ConfigConflictError, ServerConfig
+
def load_config(tmpdir, settings):
"""
diff --git a/tests/test_server.py b/tests/test_server.py
index 7cdb2cb12..95f644503 100644
--- a/tests/test_server.py
+++ b/tests/test_server.py
@@ -16,13 +16,14 @@
# along with this program. If not, see .
-import pytest
import locale
import tempfile
+import pytest
+
+from gns3server.config import Config
from gns3server.main import parse_arguments as parse
from gns3server.server import Server
-from gns3server.config import Config
def test_locale_check():
diff --git a/tests/test_topologies.py b/tests/test_topologies.py
index e763d47b9..c4320658f 100644
--- a/tests/test_topologies.py
+++ b/tests/test_topologies.py
@@ -21,13 +21,13 @@
#
# Read tests/topologies/README.rst for documentation
-import os
import json
-import pytest
+import os
import shutil
+import pytest
-from gns3server.controller.topology import load_topology, GNS3_FILE_FORMAT_REVISION
+from gns3server.controller.topology import GNS3_FILE_FORMAT_REVISION, load_topology
from gns3server.version import __version__
topologies_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "topologies")
diff --git a/tests/utils.py b/tests/utils.py
index d7212a666..a2fb8e48c 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -14,9 +14,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import asyncio
import io
import types
-import asyncio
import unittest.mock
diff --git a/tests/utils/asyncio/test_ssh_server.py b/tests/utils/asyncio/test_ssh_server.py
index 7f6d094a9..694bfd20c 100644
--- a/tests/utils/asyncio/test_ssh_server.py
+++ b/tests/utils/asyncio/test_ssh_server.py
@@ -6,7 +6,6 @@ import pytest
from gns3server.utils.asyncio.ssh_server import AsyncioSSHServer
-
# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------
diff --git a/tests/utils/test_asyncio.py b/tests/utils/test_asyncio.py
index 87def33c4..04a9e3c1c 100644
--- a/tests/utils/test_asyncio.py
+++ b/tests/utils/test_asyncio.py
@@ -16,9 +16,10 @@
import asyncio
+
import pytest
-from gns3server.utils.asyncio import wait_run_in_executor, subprocess_check_output, locking
+from gns3server.utils.asyncio import locking, subprocess_check_output, wait_run_in_executor
@pytest.mark.asyncio
diff --git a/tests/utils/test_file_watcher.py b/tests/utils/test_file_watcher.py
index 83b9761ec..80911276b 100644
--- a/tests/utils/test_file_watcher.py
+++ b/tests/utils/test_file_watcher.py
@@ -15,10 +15,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import pytest
import asyncio
from unittest.mock import MagicMock
+import pytest
from gns3server.utils.file_watcher import FileWatcher
diff --git a/tests/utils/test_images.py b/tests/utils/test_images.py
index e7d8248b0..404540337 100644
--- a/tests/utils/test_images.py
+++ b/tests/utils/test_images.py
@@ -17,12 +17,12 @@
import os
import sys
import threading
-import pytest
from unittest.mock import patch
+import pytest
from gns3server.utils import force_unix_path
-from gns3server.utils.images import md5sum, remove_checksum, images_directories, list_images
+from gns3server.utils.images import images_directories, list_images, md5sum, remove_checksum
def test_images_directories(tmpdir, config):
diff --git a/tests/utils/test_interfaces.py b/tests/utils/test_interfaces.py
index 84ac5f7c3..9c6c340c8 100644
--- a/tests/utils/test_interfaces.py
+++ b/tests/utils/test_interfaces.py
@@ -14,15 +14,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
-import socket
import collections
+import socket
+import sys
from unittest.mock import patch
import psutil
-from gns3server.utils.interfaces import interfaces, is_interface_up, has_netmask
-
+from gns3server.utils.interfaces import has_netmask, interfaces, is_interface_up
# psutil returns snicaddr namedtuples; mirror that shape for the mocks below.
snicaddr = collections.namedtuple("snicaddr", ["family", "address", "netmask", "broadcast", "ptp"])
diff --git a/tests/utils/test_notification_queue.py b/tests/utils/test_notification_queue.py
index 769a93e98..79e293fa5 100644
--- a/tests/utils/test_notification_queue.py
+++ b/tests/utils/test_notification_queue.py
@@ -14,8 +14,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import time
import asyncio
+import time
import pytest
diff --git a/tests/utils/test_packet_filter_validation.py b/tests/utils/test_packet_filter_validation.py
index a5ba0cbe8..462e23a4d 100644
--- a/tests/utils/test_packet_filter_validation.py
+++ b/tests/utils/test_packet_filter_validation.py
@@ -3,11 +3,12 @@ Unit tests for packet filter validation.
"""
import pytest
+
from gns3server.utils.packet_filter_validation import (
- validate_filter_parameters,
- validate_all_filters,
- filter_inactive_filters,
FilterValidationError,
+ filter_inactive_filters,
+ validate_all_filters,
+ validate_filter_parameters,
)
diff --git a/tests/utils/test_path.py b/tests/utils/test_path.py
index b31aeb968..454871826 100644
--- a/tests/utils/test_path.py
+++ b/tests/utils/test_path.py
@@ -16,8 +16,8 @@
# along with this program. If not, see .
import os
-import pytest
+import pytest
from fastapi import HTTPException
from gns3server.utils.path import check_path_allowed, get_default_project_directory