From 57f42da56522761f715b5a21ed62968489cdaec0 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Wed, 4 Oct 2023 17:32:58 +0200
Subject: [PATCH 01/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py                    |  72 +++++++++++++++-
 tests/_data/__init__.py              |  18 ++++
 tests/{data.py => _data/models.py}   | 103 +++++++++++------------
 tests/_data/own/.gitattributes       |   5 +-
 tests/_data/own/README.md            |  12 ---
 tests/_data/snapshots/.gitattributes |   3 +
 tests/_data/snapshots/README.md      |  13 +++
 tests/base.py                        | 121 ---------------------------
 tests/test_component.py              |  10 +--
 tests/test_model.py                  |   2 +-
 tests/test_model_bom.py              |   2 +-
 11 files changed, 161 insertions(+), 200 deletions(-)
 create mode 100644 tests/_data/__init__.py
 rename tests/{data.py => _data/models.py} (91%)
 create mode 100644 tests/_data/snapshots/.gitattributes
 create mode 100644 tests/_data/snapshots/README.md
 delete mode 100644 tests/base.py

diff --git a/tests/__init__.py b/tests/__init__.py
index ff33a2b8e..7d100d413 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -16,9 +16,77 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 from os import getenv, path
+from os.path import join
+from typing import Union, Any, Optional, TypeVar, List
+from unittest import TestCase
 
-TESTDATA_DIRECTORY = path.join(path.dirname(__file__), '_data')
+from sortedcontainers import SortedSet
 
-RECREATE_SNAPSHOTS = bool(getenv('CDX_TEST_RECREATE_SNAPSHOTS'))
+_T = TypeVar('_T')
+
+_TESTDATA_DIRECTORY = path.join(path.dirname(__file__), '_data')
+
+SCHEMA_TESTDATA_DIRECTORY = path.join(_TESTDATA_DIRECTORY, 'schemaTestData')
+OWN_DATA_DIRECTORY = path.join(_TESTDATA_DIRECTORY, 'own')
+SNAPSHOTS_DIRECTORY = path.join(_TESTDATA_DIRECTORY, 'snapshots')
+
+RECREATE_SNAPSHOTS = '1' == getenv('CDX_TEST_RECREATE_SNAPSHOTS')
 if RECREATE_SNAPSHOTS:
     print('!!! WILL RECREATE ALL SNAPSHOTS !!!')
+
+
+class SnapshotCompareMixin:
+
+    @staticmethod
+    def getSnapshotFile(snapshot_name: str) -> str:
+        return join(SNAPSHOTS_DIRECTORY, f'{snapshot_name}.bin')
+
+    @classmethod
+    def writeSnapshot(cls, snapshot_name: str, data: str):
+        with open(cls.getSnapshotFile(snapshot_name), 'w') as s:
+            s.write(data)
+
+    @classmethod
+    def readSnapshot(cls, snapshot_name: str) -> str:
+        with open(cls.getSnapshotFile(snapshot_name), 'r') as s:
+            return s.read()
+
+    def assertEqualSnapshot(self: Union[TestCase, 'SnapshotCompareMixin'], actual: str, snapshot_name: str) -> None:
+        if RECREATE_SNAPSHOTS:
+            self.writeSnapshot(snapshot_name, actual)
+        self.assertEqual(actual, self.readSnapshot(snapshot_name))
+
+
+class DeepCompareMixin:
+    def assertDeepEqual(self: Union[TestCase, 'DeepCompareMixin'], first: Any, second: Any,
+                        msg: Optional[str] = None) -> None:
+        """costly compare, but very verbose"""
+        _omd = self.maxDiff
+        try:
+            self.maxDiff = None
+            dd1 = self.__deepDict(first)
+            dd2 = self.__deepDict(second)
+            self.assertDictEqual(dd1, dd2, msg)
+        finally:
+            self.maxDiff = _omd
+
+    def __deepDict(self, o: Any) -> Any:
+        if isinstance(o, (list, tuple)):
+            return tuple(self.__deepDict(i) for i in o)
+        if isinstance(o, dict):
+            return {k: self.__deepDict(v) for k, v in o}
+        if isinstance(o, (set, SortedSet)):
+            return tuple(sorted((self.__deepDict(i) for i in o), key=repr))
+        if hasattr(o, '__dict__'):
+            return {k: self.__deepDict(v) for k, v in vars(o).items() if not (k.startswith('__') and k.endswith('__'))}
+        return o
+
+
+def reorder(items: List[_T], indexes: List[int]) -> List[_T]:
+    """
+    Return list of items in the order indicated by indexes.
+    """
+    reordered_items = []
+    for i in range(len(items)):
+        reordered_items.append(items[indexes[i]])
+    return reordered_items
diff --git a/tests/_data/__init__.py b/tests/_data/__init__.py
new file mode 100644
index 000000000..308d97e7c
--- /dev/null
+++ b/tests/_data/__init__.py
@@ -0,0 +1,18 @@
+# encoding: utf-8
+
+# This file is part of CycloneDX Python Lib
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# Copyright (c) OWASP Foundation. All Rights Reserved.
diff --git a/tests/data.py b/tests/_data/models.py
similarity index 91%
rename from tests/data.py
rename to tests/_data/models.py
index 3d8829318..65b3f5dc0 100644
--- a/tests/data.py
+++ b/tests/_data/models.py
@@ -77,49 +77,62 @@
     VulnerabilitySource,
 )
 
-MOCK_TIMESTAMP: datetime = datetime(2021, 12, 31, 10, 0, 0, 0).replace(tzinfo=timezone.utc)
-MOCK_UUID_1 = 'be2c6502-7e9a-47db-9a66-e34f729810a3'
-MOCK_UUID_2 = '17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda'
-MOCK_UUID_3 = '0b049d09-64c0-4490-a0f5-c84d9aacf857'
-MOCK_UUID_4 = 'cd3e9c95-9d41-49e7-9924-8cf0465ae789'
-MOCK_UUID_5 = 'bb5911d6-1a1d-41c9-b6e0-46e848d16655'
-MOCK_UUID_6 = 'df70b5f1-8f53-47a4-be48-669ae78795e6'
-MOCK_UUID_7 = UUID('6f266d1c-760f-4552-ae3b-41a9b74232fa')
-MOCK_UUID_8 = UUID('77d15ab9-5602-4cca-8ed2-59ae579aafd3')
-MOCK_UUID_9 = UUID('859ff614-35a7-4d37-803b-d89130cb2577')
-MOCK_UUID_10 = UUID('0afa65bc-4acd-428b-9e17-8e97b1969745')
-MOCK_BOM_UUID_1 = UUID('3e671687-395b-41f5-a30f-a58921a69b79')
-MOCK_BOM_UUID_2 = UUID('d0b24ba4-102b-497e-b31f-4fdc3f0a3005')
-
-TEST_UUIDS = [
-    UUID(MOCK_UUID_1), UUID(MOCK_UUID_2), UUID(MOCK_UUID_3), UUID(MOCK_UUID_4), UUID(MOCK_UUID_5), UUID(MOCK_UUID_6)
-]
+MOCK_UUID = (
+    'be2c6502-7e9a-47db-9a66-e34f729810a3',
+    '17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda',
+    '0b049d09-64c0-4490-a0f5-c84d9aacf857',
+    'cd3e9c95-9d41-49e7-9924-8cf0465ae789',
+    'bb5911d6-1a1d-41c9-b6e0-46e848d16655',
+    'df70b5f1-8f53-47a4-be48-669ae78795e6',
+    '6f266d1c-760f-4552-ae3b-41a9b74232fa',
+    '77d15ab9-5602-4cca-8ed2-59ae579aafd3',
+    '859ff614-35a7-4d37-803b-d89130cb2577',
+    '0afa65bc-4acd-428b-9e17-8e97b1969745',
+    '3e671687-395b-41f5-a30f-a58921a69b79',
+    'd0b24ba4-102b-497e-b31f-4fdc3f0a3005',
+    'd0e0a795-6177-478b-b293-b0d19e4469f4',
+    '7b2a7a2c-66d5-4b30-8ee2-df966a41024e',
+    '68f7b744-84c2-4f0d-ac8b-c14bd48c37ff',
+    '1a2f9dfc-3c86-48c7-8ca7-1db488d5c2a0',
+    'a3f4096d-4211-4d68-9d2b-13973c86aca9',
+)
+TEST_UUIDS = tuple(map(UUID, MOCK_UUID))
+
+BOM_SERIAL_NUMBER = UUID('1441d33a-e0fc-45b5-af3b-61ee52a88bac')
+BOM_TIMESTAMP = datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
+
+
+def _makeBom(*args, **kwargs) -> Bom:
+    bom = Bom(*args, **kwargs)
+    bom.serial_number = BOM_SERIAL_NUMBER
+    bom.metadata.timestamp = BOM_TIMESTAMP
+    return bom
 
 
 def get_bom_with_component_setuptools_basic() -> Bom:
-    return Bom(components=[get_component_setuptools_simple()])
+    return _makeBom(components=[get_component_setuptools_simple()])
 
 
 def get_bom_with_component_setuptools_with_cpe() -> Bom:
     component = get_component_setuptools_simple()
     component.cpe = 'cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*'
-    return Bom(components=[component])
+    return _makeBom(components=[component])
 
 
 def get_bom_with_component_setuptools_no_component_version() -> Bom:
-    return Bom(components=[get_component_setuptools_simple_no_version()])
+    return _makeBom(components=[get_component_setuptools_simple_no_version()])
 
 
 def get_bom_with_component_setuptools_with_release_notes() -> Bom:
     component = get_component_setuptools_simple()
     component.release_notes = get_release_notes()
-    return Bom(components=[component])
+    return _makeBom(components=[component])
 
 
 def get_bom_with_dependencies_valid() -> Bom:
     c1 = get_component_setuptools_simple()
     c2 = get_component_toml_with_hashes_with_references()
-    return Bom(
+    return _makeBom(
         components=[c1, c2], dependencies=[
             Dependency(ref=c1.bom_ref, dependencies=[
                 Dependency(ref=c2.bom_ref)
@@ -136,8 +149,7 @@ def get_bom_with_dependencies_hanging() -> Bom:
     """
     c1 = get_component_setuptools_simple('setuptools')
     c2 = get_component_toml_with_hashes_with_references('toml')
-    bom = Bom(
-        serial_number=UUID(hex='12345678395b41f5a30f1234567890ab'),
+    bom = _makeBom(
         version=23,
         metadata=BomMetaData(
             component=Component(name='rootComponent', type=ComponentType.APPLICATION, bom_ref='root-component'),
@@ -151,20 +163,16 @@ def get_bom_with_dependencies_hanging() -> Bom:
         ]
     )
     bom.metadata.tools.clear()
-    bom.metadata.timestamp = datetime(
-        year=2023, month=6, day=1,
-        hour=3, minute=3, second=7, microsecond=0,
-        tzinfo=timezone.utc)
     return bom
 
 
 def get_bom_with_dependencies_invalid() -> Bom:
     c1 = get_component_setuptools_simple()
-    return Bom(components=[c1], dependencies=[Dependency(ref=c1.bom_ref)])
+    return _makeBom(components=[c1], dependencies=[Dependency(ref=c1.bom_ref)])
 
 
 def get_bom_with_metadata_component_and_dependencies() -> Bom:
-    bom = Bom(components=[get_component_toml_with_hashes_with_references()])
+    bom = _makeBom(components=[get_component_toml_with_hashes_with_references()])
     bom.metadata.component = get_component_setuptools_simple()
     bom.dependencies.add(
         Dependency(ref=bom.metadata.component.bom_ref, dependencies=[
@@ -175,11 +183,11 @@ def get_bom_with_metadata_component_and_dependencies() -> Bom:
 
 
 def get_bom_with_component_setuptools_complete() -> Bom:
-    return Bom(components=[get_component_setuptools_complete()])
+    return _makeBom(components=[get_component_setuptools_complete()])
 
 
 def get_bom_with_component_setuptools_with_vulnerability() -> Bom:
-    bom = Bom()
+    bom = _makeBom()
     component = get_component_setuptools_simple()
     bom.components.add(component)
     bom.vulnerabilities.add(Vulnerability(
@@ -240,11 +248,11 @@ def get_bom_with_component_setuptools_with_vulnerability() -> Bom:
 
 
 def get_bom_with_component_toml_1() -> Bom:
-    return Bom(components=[get_component_toml_with_hashes_with_references()])
+    return _makeBom(components=[get_component_toml_with_hashes_with_references()])
 
 
 def get_bom_just_complete_metadata() -> Bom:
-    bom = Bom()
+    bom = _makeBom()
     bom.metadata.authors = [get_org_contact_1(), get_org_contact_2()]
     bom.metadata.component = get_component_setuptools_complete()
     bom.metadata.manufacture = get_org_entity_1()
@@ -259,14 +267,14 @@ def get_bom_just_complete_metadata() -> Bom:
 
 
 def get_bom_with_external_references() -> Bom:
-    bom = Bom(external_references=[
+    bom = _makeBom(external_references=[
         get_external_reference_1(), get_external_reference_2()
     ])
     return bom
 
 
 def get_bom_with_services_simple() -> Bom:
-    bom = Bom(services=[
+    bom = _makeBom(services=[
         Service(name='my-first-service'),
         Service(name='my-second-service')
     ])
@@ -277,7 +285,7 @@ def get_bom_with_services_simple() -> Bom:
 
 
 def get_bom_with_services_complex() -> Bom:
-    bom = Bom(services=[
+    bom = _makeBom(services=[
         Service(
             name='my-first-service', bom_ref='my-specific-bom-ref-for-my-first-service',
             provider=get_org_entity_1(), group='a-group', version='1.2.3',
@@ -306,7 +314,7 @@ def get_bom_with_services_complex() -> Bom:
 
 
 def get_bom_with_nested_services() -> Bom:
-    bom = Bom(services=[
+    bom = _makeBom(services=[
         Service(
             name='my-first-service', bom_ref='my-specific-bom-ref-for-my-first-service',
             provider=get_org_entity_1(), group='a-group', version='1.2.3',
@@ -372,7 +380,7 @@ def get_bom_for_issue_275_components() -> Bom:
     # app.dependencies.add(comp_a.bom_ref)
     # app.dependencies.add(comp_b.bom_ref)
 
-    bom = Bom(components=libs)
+    bom = _makeBom(components=libs)
     bom.metadata.component = app
     bom.register_dependency(target=app, depends_on=[comp_a, comp_b])
     bom.register_dependency(target=comp_b, depends_on=[comp_c])
@@ -391,7 +399,7 @@ def get_bom_for_issue_275_components() -> Bom:
 #    serv_b.services.add(serv_c)
 #    serv_b.dependencies.add(serv_c.bom_ref)
 #
-#    bom = Bom(services=[serv_a, serv_b])
+#    bom = _makeBom(services=[serv_a, serv_b])
 #    bom.metadata.component = app
 #    return bom
 
@@ -414,7 +422,7 @@ def get_bom_for_issue_328_components() -> Bom:
     comp_a.dependencies = [comp_b.bom_ref]
     comp_b.dependencies = [comp_c.bom_ref]
 
-    bom = Bom()
+    bom = _makeBom()
     bom.metadata.component = comp_root
     comp_root.dependencies = [comp_a.bom_ref]
     bom.components = [comp_a]
@@ -689,16 +697,3 @@ def get_bom_service_licenses_invalid() -> Bom:
     return Bom(services=[
         Service(name='foo', licenses=get_invalid_license_repository())
     ])
-
-
-T = TypeVar('T')
-
-
-def reorder(items: List[T], indexes: List[int]) -> List[T]:
-    """
-    Return list of items in the order indicated by indexes.
-    """
-    reordered_items = []
-    for i in range(len(items)):
-        reordered_items.append(items[indexes[i]])
-    return reordered_items
diff --git a/tests/_data/own/.gitattributes b/tests/_data/own/.gitattributes
index 759d4136b..2b6ec797a 100644
--- a/tests/_data/own/.gitattributes
+++ b/tests/_data/own/.gitattributes
@@ -1,3 +1,2 @@
-*               binary
-xml/*/*.xml     linguist-generated diff=xml
-json/*/*.json   linguist-generated diff=json
+xml/*/*.xml     linguist-generated
+json/*/*.json   linguist-generated
diff --git a/tests/_data/own/README.md b/tests/_data/own/README.md
index f97432444..ad527e194 100644
--- a/tests/_data/own/README.md
+++ b/tests/_data/own/README.md
@@ -1,13 +1 @@
 # TEST FIXTURES
-
-## RE-CREATION
-
-Some assets here can be (re-)created automatically, by setting the env var `CDX_TEST_RECREATE_SNAPSHOTS=1`.  
-It might also help to set `PYTHONHASHSEED=0`!  
-As a shortcut just run:
-
-```shell
-CDX_TEST_RECREATE_SNAPSHOTS=1 poetry run tox -e py
-```
-
-The files will be written as is, which might not be human-readable. feel free to reformat the files manually.
diff --git a/tests/_data/snapshots/.gitattributes b/tests/_data/snapshots/.gitattributes
new file mode 100644
index 000000000..cb164e3db
--- /dev/null
+++ b/tests/_data/snapshots/.gitattributes
@@ -0,0 +1,3 @@
+# files are compared bype-wise, so they need to be treated as binary
+xml/**      linguist-generated binary diff=xml
+json/**     linguist-generated binary diff=json
diff --git a/tests/_data/snapshots/README.md b/tests/_data/snapshots/README.md
new file mode 100644
index 000000000..f97432444
--- /dev/null
+++ b/tests/_data/snapshots/README.md
@@ -0,0 +1,13 @@
+# TEST FIXTURES
+
+## RE-CREATION
+
+Some assets here can be (re-)created automatically, by setting the env var `CDX_TEST_RECREATE_SNAPSHOTS=1`.  
+It might also help to set `PYTHONHASHSEED=0`!  
+As a shortcut just run:
+
+```shell
+CDX_TEST_RECREATE_SNAPSHOTS=1 poetry run tox -e py
+```
+
+The files will be written as is, which might not be human-readable. feel free to reformat the files manually.
diff --git a/tests/base.py b/tests/base.py
deleted file mode 100644
index 371b53c63..000000000
--- a/tests/base.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# This file is part of CycloneDX Python Lib
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
-# Copyright (c) OWASP Foundation. All Rights Reserved.
-
-import json
-import xml.etree.ElementTree
-from datetime import datetime, timezone
-from typing import Any
-from unittest import TestCase
-from uuid import uuid4
-
-from lxml import etree
-from xmldiff import main
-from xmldiff.actions import MoveNode
-
-from cyclonedx.exception import MissingOptionalDependencyException
-from cyclonedx.output import SchemaVersion
-from cyclonedx.validation.json import JsonStrictValidator
-from cyclonedx.validation.xml import XmlValidator
-
-single_uuid: str = 'urn:uuid:{}'.format(uuid4())
-
-
-class BaseJsonTestCase(TestCase):
-
-    def assertValidAgainstSchema(self, bom_json: str, schema_version: SchemaVersion) -> None:
-        try:
-            validation_error = JsonStrictValidator(schema_version).validate_str(bom_json)
-        except MissingOptionalDependencyException:
-            return  # some deps are missing - skip the validation
-        self.assertIsNone(validation_error,
-                          f'Failed to validate SBOM against JSON schema: {str(validation_error)}')
-
-    @staticmethod
-    def _sort_json_dict(item: object) -> Any:
-        if isinstance(item, dict):
-            return sorted((key, BaseJsonTestCase._sort_json_dict(values)) for key, values in item.items())
-        if isinstance(item, list):
-            return sorted(BaseJsonTestCase._sort_json_dict(x) for x in item)
-        else:
-            return item
-
-    def assertEqualJson(self, a: str, b: str) -> None:
-        self.assertEqual(
-            BaseJsonTestCase._sort_json_dict(json.loads(a)),
-            BaseJsonTestCase._sort_json_dict(json.loads(b))
-        )
-
-    def assertEqualJsonBom(self, a: str, b: str) -> None:
-        """
-        Remove UUID before comparison as this will be unique to each generation
-        """
-        ab = json.loads(a)
-        bb = json.loads(b)
-
-        # Null serialNumbers
-        ab['serialNumber'] = single_uuid
-        bb['serialNumber'] = single_uuid
-
-        # Unify timestamps to ensure they will compare
-        now = datetime.now(tz=timezone.utc)
-        if 'metadata' in ab.keys():
-            ab['metadata']['timestamp'] = now.isoformat()
-        if 'metadata' in bb.keys():
-            bb['metadata']['timestamp'] = now.isoformat()
-
-        self.assertEqualJson(json.dumps(ab), json.dumps(bb))
-
-
-class BaseXmlTestCase(TestCase):
-
-    def assertValidAgainstSchema(self, bom_xml: str, schema_version: SchemaVersion) -> None:
-        try:
-            validation_error = XmlValidator(schema_version).validate_str(bom_xml)
-        except MissingOptionalDependencyException:
-            return  # some deps are missing - skip the validation
-        self.assertIsNone(validation_error,
-                          f'Failed to validate Generated SBOM against XSD Schema: {str(validation_error)}')
-
-    def assertEqualXml(self, a: str, b: str) -> None:
-        diff_results = main.diff_texts(a, b, diff_options={'F': 0.5})
-        diff_results = list(filter(lambda o: not isinstance(o, MoveNode), diff_results))
-        self.assertEqual(len(diff_results), 0, f'There are XML differences: {diff_results}\n- {a}\n+ {b}')
-
-    def assertEqualXmlBom(self, a: str, b: str, namespace: str) -> None:
-        """
-        Sanitise some fields such as timestamps which cannot have their values directly compared for equality.
-        """
-        ba = xml.etree.ElementTree.fromstring(a, etree.XMLParser(remove_blank_text=True, remove_comments=True))
-        bb = xml.etree.ElementTree.fromstring(b, etree.XMLParser(remove_blank_text=True, remove_comments=True))
-
-        # Align serialNumbers
-        ba.set('serialNumber', single_uuid)
-        bb.set('serialNumber', single_uuid)
-
-        # Align timestamps in metadata
-        now = datetime.now(tz=timezone.utc)
-        metadata_ts_a = ba.find('./{{{}}}metadata/{{{}}}timestamp'.format(namespace, namespace))
-        if metadata_ts_a is not None:
-            metadata_ts_a.text = now.isoformat()
-        metadata_ts_b = bb.find('./{{{}}}metadata/{{{}}}timestamp'.format(namespace, namespace))
-        if metadata_ts_b is not None:
-            metadata_ts_b.text = now.isoformat()
-
-        self.assertEqualXml(
-            xml.etree.ElementTree.tostring(ba, 'unicode'),
-            xml.etree.ElementTree.tostring(bb, 'unicode')
-        )
diff --git a/tests/test_component.py b/tests/test_component.py
index a344d880c..e89d42364 100644
--- a/tests/test_component.py
+++ b/tests/test_component.py
@@ -21,12 +21,10 @@
 # See https://github.com/package-url/packageurl-python/issues/65
 from packageurl import PackageURL
 
+from tests._data.models import get_component_setuptools_simple
 from cyclonedx.model import sha1sum
 from cyclonedx.model.component import Component
-from tests import TESTDATA_DIRECTORY
-from tests.data import get_component_setuptools_simple
-
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml', '1.4')
+from tests import OWN_DATA_DIRECTORY
 
 
 class TestComponent(TestCase):
@@ -64,8 +62,8 @@ def test_purl_incorrect_name(self) -> None:
         self.assertEqual(purl.version, '50.3.2')
         self.assertEqual(purl.qualifiers, {'extension': 'tar.gz'})
 
-    def test_from_file_with_path_for_bom(self) -> None:
-        test_file = join(RELEVANT_TESTDATA_DIRECTORY, 'bom_setuptools.xml')
+    def test_from_xml_file_with_path_for_bom(self) -> None:
+        test_file = join(OWN_DATA_DIRECTORY, 'xml', '1.4', 'bom_setuptools.xml')
         c = Component.for_file(absolute_file_path=test_file, path_for_bom='fixtures/bom_setuptools.xml')
         sha1_hash: str = sha1sum(filename=test_file)
         expected_version = '0.0.0-{}'.format(sha1_hash[0:12])
diff --git a/tests/test_model.py b/tests/test_model.py
index 8459af3bd..af4e8ae81 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -45,7 +45,7 @@
     XsUri,
 )
 from cyclonedx.model.issue import IssueClassification, IssueType, IssueTypeSource
-from tests.data import reorder
+from tests import reorder
 
 
 class DummyStringEnum(str, Enum):
diff --git a/tests/test_model_bom.py b/tests/test_model_bom.py
index 50897ef42..0eb62d6c5 100644
--- a/tests/test_model_bom.py
+++ b/tests/test_model_bom.py
@@ -35,7 +35,7 @@
 from cyclonedx.model.bom import Bom, BomMetaData
 from cyclonedx.model.bom_ref import BomRef
 from cyclonedx.model.component import Component, ComponentType
-from tests.data import (
+from tests._data.models import (
     get_bom_component_licenses_invalid,
     get_bom_component_nested_licenses_invalid,
     get_bom_for_issue_275_components,

From 069e69d6343b44d8d9d39c15eb68cd847340665d Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 5 Oct 2023 13:07:24 +0200
Subject: [PATCH 02/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/_data/models.py | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/tests/_data/models.py b/tests/_data/models.py
index 65b3f5dc0..a80f9d94b 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -18,7 +18,7 @@
 import base64
 from datetime import datetime, timezone
 from decimal import Decimal
-from typing import List, Optional, TypeVar
+from typing import List, Optional, TypeVar, Any, Dict, ParamSpec
 from uuid import UUID
 
 # See https://github.com/package-url/packageurl-python/issues/65
@@ -41,6 +41,7 @@
     Property,
     Tool,
     XsUri,
+    Copyright,
 )
 from cyclonedx.model.bom import Bom, BomMetaData
 from cyclonedx.model.component import (
@@ -49,7 +50,6 @@
     ComponentEvidence,
     ComponentScope,
     ComponentType,
-    Copyright,
     Patch,
     PatchClassification,
     Pedigree,
@@ -59,13 +59,15 @@
 from cyclonedx.model.issue import IssueClassification, IssueType, IssueTypeSource
 from cyclonedx.model.release_note import ReleaseNotes
 from cyclonedx.model.service import Service
-from cyclonedx.model.vulnerability import (
-    BomTarget,
-    BomTargetVersionRange,
+from cyclonedx.model.impact_analysis import (
     ImpactAnalysisAffectedStatus,
     ImpactAnalysisJustification,
     ImpactAnalysisResponse,
     ImpactAnalysisState,
+)
+from cyclonedx.model.vulnerability import (
+    BomTarget,
+    BomTargetVersionRange,
     Vulnerability,
     VulnerabilityAdvisory,
     VulnerabilityAnalysis,
@@ -77,6 +79,8 @@
     VulnerabilitySource,
 )
 
+MOCK_TIMESTAMP = datetime.fromisoformat('2023-08-15 01:23:45.678900+00:00')
+
 MOCK_UUID = (
     'be2c6502-7e9a-47db-9a66-e34f729810a3',
     '17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda',
@@ -102,8 +106,8 @@
 BOM_TIMESTAMP = datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
 
 
-def _makeBom(*args, **kwargs) -> Bom:
-    bom = Bom(*args, **kwargs)
+def _makeBom(**kwargs: Any) -> Bom:
+    bom = Bom(**kwargs)
     bom.serial_number = BOM_SERIAL_NUMBER
     bom.metadata.timestamp = BOM_TIMESTAMP
     return bom
@@ -189,6 +193,8 @@ def get_bom_with_component_setuptools_complete() -> Bom:
 def get_bom_with_component_setuptools_with_vulnerability() -> Bom:
     bom = _makeBom()
     component = get_component_setuptools_simple()
+    if not component.purl:
+        raise ValueError('purl is required here')
     bom.components.add(component)
     bom.vulnerabilities.add(Vulnerability(
         bom_ref='my-vuln-ref-1', id='CVE-2018-7489', source=get_vulnerability_source_nvd(),
@@ -236,7 +242,7 @@ def get_bom_with_component_setuptools_with_vulnerability() -> Bom:
         ),
         affects=[
             BomTarget(
-                ref=component.purl.to_string() if component.purl else None,
+                ref=component.purl.to_string(),
                 versions=[BomTargetVersionRange(
                     range='49.0.0 - 54.0.0', status=ImpactAnalysisAffectedStatus.AFFECTED
                 )]
@@ -368,10 +374,10 @@ def get_bom_for_issue_275_components() -> Bom:
     see https://github.com/CycloneDX/cyclonedx-python-lib/issues/275
     """
 
-    app = Component(bom_ref=MOCK_UUID_1, name="app", version="1.0.0")
-    comp_a = Component(bom_ref=MOCK_UUID_2, name="comp_a", version="1.0.0")
-    comp_b = Component(bom_ref=MOCK_UUID_3, name="comp_b", version="1.0.0")
-    comp_c = Component(bom_ref=MOCK_UUID_4, name="comp_c", version="1.0.0")
+    app = Component(bom_ref=MOCK_UUID[0], name="app", version="1.0.0")
+    comp_a = Component(bom_ref=MOCK_UUID[1], name="comp_a", version="1.0.0")
+    comp_b = Component(bom_ref=MOCK_UUID[2], name="comp_b", version="1.0.0")
+    comp_c = Component(bom_ref=MOCK_UUID[3], name="comp_c", version="1.0.0")
 
     comp_b.components.add(comp_c)
     # comp_b.dependencies.add(comp_c.bom_ref)

From baaddb36f5b146994bd215578b8ff06f85254fa1 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 6 Oct 2023 22:14:33 +0200
Subject: [PATCH 03/22] snapshots

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/_data/models.py                         |   9 +
 ..._bom_for_issue_275_components-1.2.json.bin |  66 +++
 ..._bom_for_issue_275_components-1.3.json.bin |  66 +++
 ..._bom_for_issue_275_components-1.4.json.bin | 100 ++++
 ..._bom_for_issue_328_components-1.2.json.bin |  55 +++
 ..._bom_for_issue_328_components-1.3.json.bin |  55 +++
 ..._bom_for_issue_328_components-1.4.json.bin |  89 ++++
 ...et_bom_just_complete_metadata-1.2.json.bin | 262 +++++++++++
 ...et_bom_just_complete_metadata-1.3.json.bin | 329 +++++++++++++
 ...et_bom_just_complete_metadata-1.4.json.bin | 420 +++++++++++++++++
 ...th_component_setuptools_basic-1.2.json.bin |  37 ++
 ...th_component_setuptools_basic-1.3.json.bin |  37 ++
 ...th_component_setuptools_basic-1.4.json.bin |  71 +++
 ...component_setuptools_complete-1.2.json.bin | 223 +++++++++
 ...component_setuptools_complete-1.3.json.bin | 267 +++++++++++
 ...component_setuptools_complete-1.4.json.bin | 358 +++++++++++++++
 ...tuptools_no_component_version-1.2.json.bin |  37 ++
 ...tuptools_no_component_version-1.3.json.bin |  37 ++
 ...tuptools_no_component_version-1.4.json.bin |  70 +++
 ...component_setuptools_with_cpe-1.2.json.bin |  38 ++
 ...component_setuptools_with_cpe-1.3.json.bin |  38 ++
 ...component_setuptools_with_cpe-1.4.json.bin |  72 +++
 ...setuptools_with_release_notes-1.2.json.bin |  37 ++
 ...setuptools_with_release_notes-1.3.json.bin |  37 ++
 ...setuptools_with_release_notes-1.4.json.bin | 130 ++++++
 ...setuptools_with_vulnerability-1.2.json.bin |  37 ++
 ...setuptools_with_vulnerability-1.3.json.bin |  37 ++
 ...setuptools_with_vulnerability-1.4.json.bin | 195 ++++++++
 ...get_bom_with_component_toml_1-1.2.json.bin |  44 ++
 ...get_bom_with_component_toml_1-1.3.json.bin |  50 ++
 ...get_bom_with_component_toml_1-1.4.json.bin |  84 ++++
 ...bom_with_dependencies_hanging-1.2.json.bin |  65 +++
 ...bom_with_dependencies_hanging-1.3.json.bin |  71 +++
 ...bom_with_dependencies_hanging-1.4.json.bin |  70 +++
 ...t_bom_with_dependencies_valid-1.2.json.bin |  63 +++
 ...t_bom_with_dependencies_valid-1.3.json.bin |  69 +++
 ...t_bom_with_dependencies_valid-1.4.json.bin | 103 +++++
 ..._bom_with_external_references-1.2.json.bin |  28 ++
 ..._bom_with_external_references-1.3.json.bin |  34 ++
 ..._bom_with_external_references-1.4.json.bin |  68 +++
 ...ta_component_and_dependencies-1.2.json.bin |  63 +++
 ...ta_component_and_dependencies-1.3.json.bin |  69 +++
 ...ta_component_and_dependencies-1.4.json.bin | 103 +++++
 ...-get_bom_with_nested_services-1.2.json.bin | 148 ++++++
 ...-get_bom_with_nested_services-1.3.json.bin | 164 +++++++
 ...-get_bom_with_nested_services-1.4.json.bin | 257 +++++++++++
 ...get_bom_with_services_complex-1.2.json.bin |  85 ++++
 ...get_bom_with_services_complex-1.3.json.bin | 101 ++++
 ...get_bom_with_services_complex-1.4.json.bin | 194 ++++++++
 ...-get_bom_with_services_simple-1.2.json.bin |  41 ++
 ...-get_bom_with_services_simple-1.3.json.bin |  41 ++
 ...-get_bom_with_services_simple-1.4.json.bin |  75 +++
 tests/test_output_json.py                     | 434 +-----------------
 53 files changed, 5322 insertions(+), 411 deletions(-)
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin

diff --git a/tests/_data/models.py b/tests/_data/models.py
index a80f9d94b..8f9a1f660 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -703,3 +703,12 @@ def get_bom_service_licenses_invalid() -> Bom:
     return Bom(services=[
         Service(name='foo', licenses=get_invalid_license_repository())
     ])
+
+from inspect import isfunction, getmembers
+import sys
+
+
+all_get_bom_funct_valid = tuple(
+    (n,f) for n,f in getmembers(sys.modules[__name__], isfunction)
+    if n.startswith('get_bom_') and not n.endswith('_invalid')
+)
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin
new file mode 100644
index 000000000..b4eef0f9f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin
@@ -0,0 +1,66 @@
+{
+  "components": [
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "comp_a",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "components": [
+        {
+          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
+          "name": "comp_c",
+          "type": "library",
+          "version": "1.0.0"
+        }
+      ],
+      "name": "comp_b",
+      "type": "library",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+      ],
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "dependsOn": [
+        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      ],
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "app",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin
new file mode 100644
index 000000000..b57b1676b
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin
@@ -0,0 +1,66 @@
+{
+  "components": [
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "comp_a",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "components": [
+        {
+          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
+          "name": "comp_c",
+          "type": "library",
+          "version": "1.0.0"
+        }
+      ],
+      "name": "comp_b",
+      "type": "library",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+      ],
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "dependsOn": [
+        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      ],
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "app",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin
new file mode 100644
index 000000000..32f27cdd8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin
@@ -0,0 +1,100 @@
+{
+  "components": [
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "comp_a",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "components": [
+        {
+          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
+          "name": "comp_c",
+          "type": "library",
+          "version": "1.0.0"
+        }
+      ],
+      "name": "comp_b",
+      "type": "library",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+      ],
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "dependsOn": [
+        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      ],
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "app",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin
new file mode 100644
index 000000000..39c7b2cd9
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin
@@ -0,0 +1,55 @@
+{
+  "components": [
+    {
+      "bom-ref": "component-A",
+      "components": [
+        {
+          "bom-ref": "component-B",
+          "components": [
+            {
+              "bom-ref": "component-C",
+              "name": "C",
+              "type": "library",
+              "version": "1.0"
+            }
+          ],
+          "name": "B",
+          "type": "library",
+          "version": "1.0"
+        }
+      ],
+      "name": "A",
+      "type": "library",
+      "version": "0.1"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "component-A"
+    },
+    {
+      "ref": "my-project"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "my-project",
+      "name": "my-project",
+      "type": "application",
+      "version": "1"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin
new file mode 100644
index 000000000..038380bc6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin
@@ -0,0 +1,55 @@
+{
+  "components": [
+    {
+      "bom-ref": "component-A",
+      "components": [
+        {
+          "bom-ref": "component-B",
+          "components": [
+            {
+              "bom-ref": "component-C",
+              "name": "C",
+              "type": "library",
+              "version": "1.0"
+            }
+          ],
+          "name": "B",
+          "type": "library",
+          "version": "1.0"
+        }
+      ],
+      "name": "A",
+      "type": "library",
+      "version": "0.1"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "component-A"
+    },
+    {
+      "ref": "my-project"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "my-project",
+      "name": "my-project",
+      "type": "application",
+      "version": "1"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin
new file mode 100644
index 000000000..13322afd4
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin
@@ -0,0 +1,89 @@
+{
+  "components": [
+    {
+      "bom-ref": "component-A",
+      "components": [
+        {
+          "bom-ref": "component-B",
+          "components": [
+            {
+              "bom-ref": "component-C",
+              "name": "C",
+              "type": "library",
+              "version": "1.0"
+            }
+          ],
+          "name": "B",
+          "type": "library",
+          "version": "1.0"
+        }
+      ],
+      "name": "A",
+      "type": "library",
+      "version": "0.1"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "component-A"
+    },
+    {
+      "ref": "my-project"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "my-project",
+      "name": "my-project",
+      "type": "application",
+      "version": "1"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
new file mode 100644
index 000000000..7e4efac68
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
@@ -0,0 +1,262 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "authors": [
+      {
+        "email": "someone@somewhere.tld",
+        "name": "A N Other",
+        "phone": "+44 (0)1234 567890"
+      },
+      {
+        "email": "paul.horton@owasp.org",
+        "name": "Paul Horton"
+      }
+    ],
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "manufacture": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        },
+        {
+          "email": "paul.horton@owasp.org",
+          "name": "Paul Horton"
+        }
+      ],
+      "name": "CycloneDX",
+      "url": [
+        "https://cyclonedx.org"
+      ]
+    },
+    "supplier": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        }
+      ],
+      "name": "Cyclone DX",
+      "url": [
+        "https://cyclonedx.org/"
+      ]
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
new file mode 100644
index 000000000..3292dfaac
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
@@ -0,0 +1,329 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "authors": [
+      {
+        "email": "someone@somewhere.tld",
+        "name": "A N Other",
+        "phone": "+44 (0)1234 567890"
+      },
+      {
+        "email": "paul.horton@owasp.org",
+        "name": "Paul Horton"
+      }
+    ],
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "hashes": [
+                {
+                  "alg": "SHA-256",
+                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                }
+              ],
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "evidence": {
+        "copyright": [
+          {
+            "text": "Commercial"
+          },
+          {
+            "text": "Commercial 2"
+          }
+        ]
+      },
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2.0",
+          "text": {
+            "content": "VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=",
+            "contentType": "text/plain",
+            "encoding": "base64"
+          },
+          "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+        }
+      }
+    ],
+    "manufacture": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        },
+        {
+          "email": "paul.horton@owasp.org",
+          "name": "Paul Horton"
+        }
+      ],
+      "name": "CycloneDX",
+      "url": [
+        "https://cyclonedx.org"
+      ]
+    },
+    "properties": [
+      {
+        "name": "key1",
+        "value": "val1"
+      },
+      {
+        "name": "key2",
+        "value": "val2"
+      }
+    ],
+    "supplier": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        }
+      ],
+      "name": "Cyclone DX",
+      "url": [
+        "https://cyclonedx.org/"
+      ]
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
new file mode 100644
index 000000000..44e8b3b85
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
@@ -0,0 +1,420 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "authors": [
+      {
+        "email": "someone@somewhere.tld",
+        "name": "A N Other",
+        "phone": "+44 (0)1234 567890"
+      },
+      {
+        "email": "paul.horton@owasp.org",
+        "name": "Paul Horton"
+      }
+    ],
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "hashes": [
+                {
+                  "alg": "SHA-256",
+                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                }
+              ],
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "evidence": {
+        "copyright": [
+          {
+            "text": "Commercial"
+          },
+          {
+            "text": "Commercial 2"
+          }
+        ]
+      },
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library"
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library"
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "releaseNotes": {
+        "aliases": [
+          "First Test Release"
+        ],
+        "description": "This release is a test release",
+        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
+        "notes": [
+          {
+            "locale": "en-GB",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          },
+          {
+            "locale": "en-US",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          }
+        ],
+        "properties": [
+          {
+            "name": "key1",
+            "value": "val1"
+          },
+          {
+            "name": "key2",
+            "value": "val2"
+          }
+        ],
+        "resolves": [
+          {
+            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
+            "id": "CVE-2021-44228",
+            "name": "Apache Log3Shell",
+            "references": [
+              "https://central.sonatype.org/news/20211213_log4shell_help",
+              "https://logging.apache.org/log4j/2.x/security.html"
+            ],
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
+            },
+            "type": "security"
+          }
+        ],
+        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
+        "tags": [
+          "alpha",
+          "test"
+        ],
+        "timestamp": "2023-08-15T01:23:45.678900+00:00",
+        "title": "Release Notes Title",
+        "type": "major"
+      },
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2.0",
+          "text": {
+            "content": "VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=",
+            "contentType": "text/plain",
+            "encoding": "base64"
+          },
+          "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+        }
+      }
+    ],
+    "manufacture": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        },
+        {
+          "email": "paul.horton@owasp.org",
+          "name": "Paul Horton"
+        }
+      ],
+      "name": "CycloneDX",
+      "url": [
+        "https://cyclonedx.org"
+      ]
+    },
+    "properties": [
+      {
+        "name": "key1",
+        "value": "val1"
+      },
+      {
+        "name": "key2",
+        "value": "val2"
+      }
+    ],
+    "supplier": {
+      "contact": [
+        {
+          "email": "someone@somewhere.tld",
+          "name": "A N Other",
+          "phone": "+44 (0)1234 567890"
+        }
+      ],
+      "name": "Cyclone DX",
+      "url": [
+        "https://cyclonedx.org/"
+      ]
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin
new file mode 100644
index 000000000..9d0993c87
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin
new file mode 100644
index 000000000..6e2f630e8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin
new file mode 100644
index 000000000..d3c70bb7b
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin
@@ -0,0 +1,71 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
new file mode 100644
index 000000000..8dd1577d9
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
@@ -0,0 +1,223 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
new file mode 100644
index 000000000..76b810cf0
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
@@ -0,0 +1,267 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "hashes": [
+                {
+                  "alg": "SHA-256",
+                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                }
+              ],
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "evidence": {
+        "copyright": [
+          {
+            "text": "Commercial"
+          },
+          {
+            "text": "Commercial 2"
+          }
+        ]
+      },
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library",
+            "version": ""
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
new file mode 100644
index 000000000..9574394e2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
@@ -0,0 +1,358 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "components": [
+        {
+          "author": "Test Author",
+          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "licenses": [
+            {
+              "expression": "MIT License"
+            }
+          ],
+          "name": "setuptools",
+          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "type": "library",
+          "version": "50.3.2"
+        },
+        {
+          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "externalReferences": [
+            {
+              "comment": "No comment",
+              "hashes": [
+                {
+                  "alg": "SHA-256",
+                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                }
+              ],
+              "type": "distribution",
+              "url": "https://cyclonedx.org"
+            }
+          ],
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "name": "toml",
+          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+          "type": "library",
+          "version": "0.10.2"
+        }
+      ],
+      "copyright": "Apache 2.0 baby!",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "description": "This component is awesome",
+      "evidence": {
+        "copyright": [
+          {
+            "text": "Commercial"
+          },
+          {
+            "text": "Commercial 2"
+          }
+        ]
+      },
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "pedigree": {
+        "ancestors": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "author": "Test Author",
+            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library"
+          }
+        ],
+        "commits": [
+          {
+            "message": "A commit message",
+            "uid": "a-random-uid"
+          }
+        ],
+        "descendants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools?extension=tar.gz",
+            "type": "library"
+          },
+          {
+            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ],
+        "notes": "Some notes here please",
+        "patches": [
+          {
+            "type": "backport"
+          }
+        ],
+        "variants": [
+          {
+            "author": "Test Author",
+            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
+            "licenses": [
+              {
+                "expression": "MIT License"
+              }
+            ],
+            "name": "setuptools",
+            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+            "type": "library",
+            "version": "50.3.2"
+          },
+          {
+            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
+            "externalReferences": [
+              {
+                "comment": "No comment",
+                "hashes": [
+                  {
+                    "alg": "SHA-256",
+                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+                  }
+                ],
+                "type": "distribution",
+                "url": "https://cyclonedx.org"
+              }
+            ],
+            "hashes": [
+              {
+                "alg": "SHA-256",
+                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+              }
+            ],
+            "name": "toml",
+            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+            "type": "library",
+            "version": "0.10.2"
+          }
+        ]
+      },
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "publisher": "CycloneDX",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "releaseNotes": {
+        "aliases": [
+          "First Test Release"
+        ],
+        "description": "This release is a test release",
+        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
+        "notes": [
+          {
+            "locale": "en-GB",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          },
+          {
+            "locale": "en-US",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          }
+        ],
+        "properties": [
+          {
+            "name": "key1",
+            "value": "val1"
+          },
+          {
+            "name": "key2",
+            "value": "val2"
+          }
+        ],
+        "resolves": [
+          {
+            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
+            "id": "CVE-2021-44228",
+            "name": "Apache Log3Shell",
+            "references": [
+              "https://central.sonatype.org/news/20211213_log4shell_help",
+              "https://logging.apache.org/log4j/2.x/security.html"
+            ],
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
+            },
+            "type": "security"
+          }
+        ],
+        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
+        "tags": [
+          "alpha",
+          "test"
+        ],
+        "timestamp": "2023-08-15T01:23:45.678900+00:00",
+        "title": "Release Notes Title",
+        "type": "major"
+      },
+      "scope": "required",
+      "supplier": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "swid": {
+        "name": "Test Application",
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "text": {
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==",
+          "contentType": "text/xml",
+          "encoding": "base64"
+        },
+        "version": "3.4.5"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin
new file mode 100644
index 000000000..7bb0d1e15
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools?extension=tar.gz",
+      "type": "library",
+      "version": ""
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin
new file mode 100644
index 000000000..1fb453b4a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools?extension=tar.gz",
+      "type": "library",
+      "version": ""
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin
new file mode 100644
index 000000000..ac80eda9a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin
@@ -0,0 +1,70 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools?extension=tar.gz",
+      "type": "library"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin
new file mode 100644
index 000000000..2dd754f8f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin
@@ -0,0 +1,38 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin
new file mode 100644
index 000000000..077f8b253
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin
@@ -0,0 +1,38 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin
new file mode 100644
index 000000000..66f999c5f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin
@@ -0,0 +1,72 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
new file mode 100644
index 000000000..9d0993c87
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
new file mode 100644
index 000000000..6e2f630e8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
new file mode 100644
index 000000000..6eed4f13c
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
@@ -0,0 +1,130 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "releaseNotes": {
+        "aliases": [
+          "First Test Release"
+        ],
+        "description": "This release is a test release",
+        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
+        "notes": [
+          {
+            "locale": "en-GB",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          },
+          {
+            "locale": "en-US",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          }
+        ],
+        "properties": [
+          {
+            "name": "key1",
+            "value": "val1"
+          },
+          {
+            "name": "key2",
+            "value": "val2"
+          }
+        ],
+        "resolves": [
+          {
+            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
+            "id": "CVE-2021-44228",
+            "name": "Apache Log3Shell",
+            "references": [
+              "https://central.sonatype.org/news/20211213_log4shell_help",
+              "https://logging.apache.org/log4j/2.x/security.html"
+            ],
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
+            },
+            "type": "security"
+          }
+        ],
+        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
+        "tags": [
+          "alpha",
+          "test"
+        ],
+        "timestamp": "2023-08-15T01:23:45.678900+00:00",
+        "title": "Release Notes Title",
+        "type": "major"
+      },
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
new file mode 100644
index 000000000..9d0993c87
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
new file mode 100644
index 000000000..6e2f630e8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
@@ -0,0 +1,37 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
new file mode 100644
index 000000000..296520bee
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
@@ -0,0 +1,195 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "vulnerabilities": [
+    {
+      "advisories": [
+        {
+          "url": "http://www.securitytracker.com/id/1040693"
+        },
+        {
+          "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
+        }
+      ],
+      "affects": [
+        {
+          "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+          "versions": [
+            {
+              "range": "49.0.0 - 54.0.0",
+              "status": "affected"
+            }
+          ]
+        }
+      ],
+      "analysis": {
+        "detail": "Some extra detail",
+        "justification": "requires_environment",
+        "response": [
+          "can_not_fix"
+        ],
+        "state": "exploitable"
+      },
+      "bom-ref": "my-vuln-ref-1",
+      "created": "2021-09-01T10:50:42.051979+00:00",
+      "credits": {
+        "individuals": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          }
+        ],
+        "organizations": [
+          {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          }
+        ]
+      },
+      "cwes": [
+        22,
+        33
+      ],
+      "description": "A description here",
+      "detail": "Some detail here",
+      "id": "CVE-2018-7489",
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "published": "2021-09-02T10:50:42.051979+00:00",
+      "ratings": [
+        {
+          "justification": "Some justification",
+          "method": "CVSSv3",
+          "score": 9.8,
+          "severity": "critical",
+          "source": {
+            "name": "NVD",
+            "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
+          },
+          "vector": "AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
+        },
+        {
+          "justification": "Some other justification",
+          "method": "CVSSv3",
+          "score": 2.7,
+          "severity": "low",
+          "source": {
+            "name": "OWASP",
+            "url": "https://owasp.org"
+          },
+          "vector": "AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N"
+        }
+      ],
+      "recommendation": "Upgrade",
+      "references": [
+        {
+          "id": "SOME-OTHER-ID",
+          "source": {
+            "name": "OSS Index",
+            "url": "https://ossindex.sonatype.org/component/pkg:pypi/setuptools"
+          }
+        }
+      ],
+      "source": {
+        "name": "NVD",
+        "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
+      },
+      "tools": [
+        {
+          "name": "cyclonedx-python-lib",
+          "vendor": "CycloneDX"
+        }
+      ],
+      "updated": "2021-09-03T10:50:42.051979+00:00"
+    }
+  ],
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin
new file mode 100644
index 000000000..8e170b991
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin
@@ -0,0 +1,44 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin
new file mode 100644
index 000000000..aefb94a14
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin
@@ -0,0 +1,50 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin
new file mode 100644
index 000000000..1b8835591
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin
@@ -0,0 +1,84 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin
new file mode 100644
index 000000000..e9bf6c643
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin
@@ -0,0 +1,65 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "setuptools",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "toml",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "root-component"
+    },
+    {
+      "dependsOn": [
+        "toml"
+      ],
+      "ref": "setuptools"
+    },
+    {
+      "ref": "toml"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "root-component",
+      "name": "rootComponent",
+      "type": "application",
+      "version": ""
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 23,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin
new file mode 100644
index 000000000..9f84818bd
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin
@@ -0,0 +1,71 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "setuptools",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "toml",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "root-component"
+    },
+    {
+      "dependsOn": [
+        "toml"
+      ],
+      "ref": "setuptools"
+    },
+    {
+      "ref": "toml"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "root-component",
+      "name": "rootComponent",
+      "type": "application",
+      "version": ""
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 23,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin
new file mode 100644
index 000000000..5bfe6f285
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin
@@ -0,0 +1,70 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "setuptools",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "toml",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "root-component"
+    },
+    {
+      "dependsOn": [
+        "toml"
+      ],
+      "ref": "setuptools"
+    },
+    {
+      "ref": "toml"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "root-component",
+      "name": "rootComponent",
+      "type": "application"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 23,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin
new file mode 100644
index 000000000..a9874292d
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin
@@ -0,0 +1,63 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin
new file mode 100644
index 000000000..a44b69b8c
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin
@@ -0,0 +1,69 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin
new file mode 100644
index 000000000..19e76581e
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin
@@ -0,0 +1,103 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin
new file mode 100644
index 000000000..0808ac139
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin
@@ -0,0 +1,28 @@
+{
+  "externalReferences": [
+    {
+      "comment": "No comment",
+      "type": "distribution",
+      "url": "https://cyclonedx.org"
+    },
+    {
+      "type": "website",
+      "url": "https://cyclonedx.org"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin
new file mode 100644
index 000000000..4f4556622
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin
@@ -0,0 +1,34 @@
+{
+  "externalReferences": [
+    {
+      "comment": "No comment",
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "type": "distribution",
+      "url": "https://cyclonedx.org"
+    },
+    {
+      "type": "website",
+      "url": "https://cyclonedx.org"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin
new file mode 100644
index 000000000..6608b6373
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin
@@ -0,0 +1,68 @@
+{
+  "externalReferences": [
+    {
+      "comment": "No comment",
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "type": "distribution",
+      "url": "https://cyclonedx.org"
+    },
+    {
+      "type": "website",
+      "url": "https://cyclonedx.org"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin
new file mode 100644
index 000000000..522592fa2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin
@@ -0,0 +1,63 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin
new file mode 100644
index 000000000..2aae8fac7
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin
@@ -0,0 +1,69 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin
new file mode 100644
index 000000000..531d42fcf
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin
@@ -0,0 +1,103 @@
+{
+  "components": [
+    {
+      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "hashes": [
+        {
+          "alg": "SHA-256",
+          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+        }
+      ],
+      "name": "toml",
+      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
+      "type": "library",
+      "version": "0.10.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": [
+        "pkg:pypi/toml@0.10.2?extension=tar.gz"
+      ],
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    },
+    {
+      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
new file mode 100644
index 000000000..a63db1288
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
@@ -0,0 +1,148 @@
+{
+  "dependencies": [
+    {
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "services": [
+        {
+          "authenticated": true,
+          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
+          "group": "no-group",
+          "name": "second-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "3.2.1",
+          "x-trust-boundary": false
+        },
+        {
+          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "name": "first-nested-service"
+        }
+      ],
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "name": "my-second-service",
+      "services": [
+        {
+          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "group": "what-group",
+          "name": "yet-another-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "6.5.4"
+        },
+        {
+          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
+          "name": "another-nested-service"
+        }
+      ]
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
new file mode 100644
index 000000000..3f553374e
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
@@ -0,0 +1,164 @@
+{
+  "dependencies": [
+    {
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "services": [
+        {
+          "authenticated": true,
+          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
+          "group": "no-group",
+          "name": "second-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "3.2.1",
+          "x-trust-boundary": false
+        },
+        {
+          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "name": "first-nested-service"
+        }
+      ],
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "name": "my-second-service",
+      "services": [
+        {
+          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "group": "what-group",
+          "name": "yet-another-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "6.5.4"
+        },
+        {
+          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
+          "name": "another-nested-service"
+        }
+      ]
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
new file mode 100644
index 000000000..91d91e35e
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
@@ -0,0 +1,257 @@
+{
+  "dependencies": [
+    {
+      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "releaseNotes": {
+        "aliases": [
+          "First Test Release"
+        ],
+        "description": "This release is a test release",
+        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
+        "notes": [
+          {
+            "locale": "en-GB",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          },
+          {
+            "locale": "en-US",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          }
+        ],
+        "properties": [
+          {
+            "name": "key1",
+            "value": "val1"
+          },
+          {
+            "name": "key2",
+            "value": "val2"
+          }
+        ],
+        "resolves": [
+          {
+            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
+            "id": "CVE-2021-44228",
+            "name": "Apache Log3Shell",
+            "references": [
+              "https://central.sonatype.org/news/20211213_log4shell_help",
+              "https://logging.apache.org/log4j/2.x/security.html"
+            ],
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
+            },
+            "type": "security"
+          }
+        ],
+        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
+        "tags": [
+          "alpha",
+          "test"
+        ],
+        "timestamp": "2023-08-15T01:23:45.678900+00:00",
+        "title": "Release Notes Title",
+        "type": "major"
+      },
+      "services": [
+        {
+          "authenticated": true,
+          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
+          "group": "no-group",
+          "name": "second-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "3.2.1",
+          "x-trust-boundary": false
+        },
+        {
+          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "name": "first-nested-service"
+        }
+      ],
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "name": "my-second-service",
+      "services": [
+        {
+          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "group": "what-group",
+          "name": "yet-another-nested-service",
+          "provider": {
+            "contact": [
+              {
+                "email": "someone@somewhere.tld",
+                "name": "A N Other",
+                "phone": "+44 (0)1234 567890"
+              },
+              {
+                "email": "paul.horton@owasp.org",
+                "name": "Paul Horton"
+              }
+            ],
+            "name": "CycloneDX",
+            "url": [
+              "https://cyclonedx.org"
+            ]
+          },
+          "version": "6.5.4"
+        },
+        {
+          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
+          "name": "another-nested-service"
+        }
+      ]
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
new file mode 100644
index 000000000..b94e63f23
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
@@ -0,0 +1,85 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
new file mode 100644
index 000000000..c350dc6aa
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
@@ -0,0 +1,101 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
new file mode 100644
index 000000000..a3d0d17b1
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
@@ -0,0 +1,194 @@
+{
+  "dependencies": [
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    },
+    {
+      "ref": "my-specific-bom-ref-for-my-first-service"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "authenticated": false,
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
+      "data": [
+        {
+          "classification": "public",
+          "flow": "outbound"
+        }
+      ],
+      "description": "Description goes here",
+      "endpoints": [
+        "/api/thing/1",
+        "/api/thing/2"
+      ],
+      "externalReferences": [
+        {
+          "comment": "No comment",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
+            }
+          ],
+          "type": "distribution",
+          "url": "https://cyclonedx.org"
+        }
+      ],
+      "group": "a-group",
+      "licenses": [
+        {
+          "expression": "Commercial"
+        }
+      ],
+      "name": "my-first-service",
+      "properties": [
+        {
+          "name": "key1",
+          "value": "val1"
+        },
+        {
+          "name": "key2",
+          "value": "val2"
+        }
+      ],
+      "provider": {
+        "contact": [
+          {
+            "email": "someone@somewhere.tld",
+            "name": "A N Other",
+            "phone": "+44 (0)1234 567890"
+          },
+          {
+            "email": "paul.horton@owasp.org",
+            "name": "Paul Horton"
+          }
+        ],
+        "name": "CycloneDX",
+        "url": [
+          "https://cyclonedx.org"
+        ]
+      },
+      "releaseNotes": {
+        "aliases": [
+          "First Test Release"
+        ],
+        "description": "This release is a test release",
+        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
+        "notes": [
+          {
+            "locale": "en-GB",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          },
+          {
+            "locale": "en-US",
+            "text": {
+              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
+              "contentType": "text/plain; charset=UTF-8",
+              "encoding": "base64"
+            }
+          }
+        ],
+        "properties": [
+          {
+            "name": "key1",
+            "value": "val1"
+          },
+          {
+            "name": "key2",
+            "value": "val2"
+          }
+        ],
+        "resolves": [
+          {
+            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
+            "id": "CVE-2021-44228",
+            "name": "Apache Log3Shell",
+            "references": [
+              "https://central.sonatype.org/news/20211213_log4shell_help",
+              "https://logging.apache.org/log4j/2.x/security.html"
+            ],
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
+            },
+            "type": "security"
+          }
+        ],
+        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
+        "tags": [
+          "alpha",
+          "test"
+        ],
+        "timestamp": "2023-08-15T01:23:45.678900+00:00",
+        "title": "Release Notes Title",
+        "type": "major"
+      },
+      "version": "1.2.3",
+      "x-trust-boundary": true
+    },
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
new file mode 100644
index 000000000..10a7d7a7f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
@@ -0,0 +1,41 @@
+{
+  "dependencies": [
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-first-service"
+    },
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
new file mode 100644
index 000000000..49d39a117
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
@@ -0,0 +1,41 @@
+{
+  "dependencies": [
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-first-service"
+    },
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
new file mode 100644
index 000000000..c10407dec
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
@@ -0,0 +1,75 @@
+{
+  "dependencies": [
+    {
+      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+    },
+    {
+      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+    }
+  ],
+  "metadata": {
+    "component": {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "cyclonedx-python-lib",
+      "type": "library",
+      "version": "1.0.0"
+    },
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "services": [
+    {
+      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "name": "my-first-service"
+    },
+    {
+      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "name": "my-second-service"
+    }
+  ],
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index f40802625..bc52f95a1 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -14,428 +14,40 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
-from os.path import join
-from typing import Optional, Union
+from typing import Callable
 from unittest import TestCase
 from unittest.mock import Mock, patch
-from uuid import UUID
 
-from ddt import ddt, idata, named_data
+from ddt import ddt, idata, named_data, unpack
 
-from cyclonedx.exception.output import FormatNotSupportedException
 from cyclonedx.model.bom import Bom
-from cyclonedx.output import get_instance as get_outputter
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
-from cyclonedx.schema import OutputFormat, SchemaVersion
-from tests import TESTDATA_DIRECTORY
-from tests.base import BaseJsonTestCase
-from tests.data import (
-    MOCK_BOM_UUID_1,
-    MOCK_TIMESTAMP,
-    MOCK_UUID_1,
-    MOCK_UUID_2,
-    MOCK_UUID_3,
-    MOCK_UUID_4,
-    MOCK_UUID_5,
-    MOCK_UUID_6,
-    TEST_UUIDS,
-    get_bom_for_issue_275_components,
-    get_bom_just_complete_metadata,
-    get_bom_with_component_setuptools_basic,
-    get_bom_with_component_setuptools_complete,
-    get_bom_with_component_setuptools_no_component_version,
-    get_bom_with_component_setuptools_with_cpe,
-    get_bom_with_component_setuptools_with_release_notes,
-    get_bom_with_component_setuptools_with_vulnerability,
-    get_bom_with_component_toml_1,
-    get_bom_with_dependencies_hanging,
-    get_bom_with_dependencies_valid,
-    get_bom_with_external_references,
-    get_bom_with_metadata_component_and_dependencies,
-    get_bom_with_nested_services,
-    get_bom_with_services_complex,
-    get_bom_with_services_simple,
-)
+from cyclonedx.schema import SchemaVersion, OutputFormat
 
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'json')
+from tests import SnapshotCompareMixin
+from tests._data.models import all_get_bom_funct_valid, TEST_UUIDS
+
+from cyclonedx.validation.json import JsonStrictValidator
 
 
 @ddt
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-class TestOutputJson(BaseJsonTestCase):
-
-    def test_bom_external_references_v1_4(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_external_references.json'
-        )
-
-    def test_bom_external_references_v1_3(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_external_references.json'
-        )
-
-    def test_bom_external_references_v1_2(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_external_references.json'
-        )
-
-    def test_simple_bom_v1_4(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools.json'
-        )
-
-    def test_simple_bom_v1_3(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-
-    def test_simple_bom_v1_2(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools.json'
-        )
-
-    def test_simple_bom_v1_1(self) -> None:
-        self._validate_json_bom_not_supported(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_1
-        )
-
-    def test_simple_bom_v1_0(self) -> None:
-        self._validate_json_bom_not_supported(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_0
-        )
-
-    def test_simple_bom_v1_4_with_cpe(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-
-    def test_simple_bom_v1_3_with_cpe(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-
-    def test_simple_bom_v1_2_with_cpe(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_4_full_component(self, mock: Mock) -> None:
-        self.maxDiff = None
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_3_full_component(self, mock: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_2_full_component(self, mock: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock.assert_called()
-
-    def test_bom_v1_4_component_hashes_external_references(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_toml_1.json'
-        )
-
-    def test_bom_v1_3_component_hashes_external_references(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_toml_1.json'
-        )
-
-    def test_bom_v1_2_component_hashes_external_references(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_toml_1.json'
-        )
-
-    def test_bom_v1_1_component_hashes_external_references(self) -> None:
-        self._validate_json_bom_not_supported(bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_1)
-
-    def test_bom_v1_0_component_hashes_external_references(self) -> None:
-        self._validate_json_bom_not_supported(bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_0)
-
-    def test_bom_v1_4_no_component_version(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_no_version.json'
-        )
-
-    def test_bom_v1_3_no_component_version(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_no_version.json'
-        )
-
-    def test_bom_v1_4_component_with_release_notes(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_release_notes.json'
-        )
-
-    def test_bom_v1_3_component_with_release_notes(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-
-    def test_bom_v1_4_component_with_vulnerability(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_vulnerabilities.json'
-        )
-
-    def test_bom_v1_3_component_with_vulnerability(self) -> None:
-        # Vulnerabilities not support in JSON < 1.4
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_1))
-    def test_bom_v1_4_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_2))
-    def test_bom_v1_3_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    def test_bom_v1_2_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    def test_bom_v1_4_dependencies(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies.json'
-        )
-
-    def test_bom_v1_3_dependencies(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies.json'
-        )
-
-    def test_bom_v1_2_dependencies(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies.json'
-        )
-
-    def test_bom_v1_4_dependencies_for_bom_component(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies_component.json'
-        )
-
-    def test_bom_v1_3_dependencies_for_bom_component(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies_component.json'
-        )
-
-    def test_bom_v1_2_dependencies_for_bom_component(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies_component.json'
-        )
-
-    def test_bom_v1_4_issue_275_components(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_issue_275_components.json'
-        )
-
-    def test_bom_v1_3_issue_275_components(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_issue_275_components.json'
-        )
-
-    def test_bom_v1_2_issue_275_components(self) -> None:
-        self._validate_json_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_issue_275_components.json'
-        )
-
-    def test_bom_v1_4_warn_dependencies(self) -> None:
-        with self.assertWarns(UserWarning):
-            # this data set is expected to throw this UserWarning.
-            # that is the while point of this test!
-            self._validate_json_bom(
-                bom=get_bom_with_dependencies_hanging(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_dependencies_hanging.json'
-            )
-
-    @named_data(
-        ('None', 'None', None),
-        ('two', 'two', 2),
-        ('4spaces', '4spaces', '    '),
-        ('tab', 'tab', '\t')
-    )
-    def test_indent(self, name: str, indent: Optional[Union[str, int]]) -> None:
-        bom = get_bom_with_component_setuptools_basic()
-        bom.serial_number = MOCK_BOM_UUID_1
-        bom.metadata.timestamp = MOCK_TIMESTAMP
-        schema_version = SchemaVersion.V1_4
-        outputter = get_outputter(bom=bom, schema_version=schema_version, output_format=OutputFormat.JSON)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), f'indented_{name}.json')
-                  ) as expected_xml:
-            bom_json = outputter.output_as_string(indent=indent)
-            self.assertEqual(expected_xml.read(), bom_json)
-            self.assertValidAgainstSchema(bom_json=bom_json, schema_version=schema_version)
-
-    # region Helper methods
-
-    def _validate_json_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
-        outputter = get_outputter(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as expected_json:
-            output_as_string = outputter.output_as_string()
-            self.assertValidAgainstSchema(bom_json=output_as_string, schema_version=schema_version)
-            self.assertEqualJsonBom(expected_json.read(), output_as_string)
-
-    def _validate_json_bom_not_supported(self, bom: Bom, schema_version: SchemaVersion) -> None:
-        with self.assertRaises(FormatNotSupportedException):
-            outputter = get_outputter(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
-            outputter.output_as_string()
-
-    # endregion Helper methods
+@patch('cyclonedx.model.component.uuid4', side_effect=TEST_UUIDS)
+@patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
+class TestOutputJson(TestCase, SnapshotCompareMixin):
+
+    @named_data(*(
+        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in [
+            SchemaVersion.V1_4, SchemaVersion.V1_3, SchemaVersion.V1_2,
+        ]
+    ))
+    @unpack
+    def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+        bom = get_bom()
+        json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
+        errors = JsonStrictValidator(sv).validate_str(json)
+        self.assertIsNone(errors)
+        self.assertEqualSnapshot(json, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.json')
 
 
 @ddt

From 7c8f6c563ee0c22979d2e97a3f79ded7d70c8f2e Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 6 Oct 2023 22:46:27 +0200
Subject: [PATCH 04/22] snapshots

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/_data/models.py                         |   7 +-
 ...et_bom_just_complete_metadata-1.2.json.bin |   4 +-
 ...et_bom_just_complete_metadata-1.3.json.bin |   4 +-
 ...et_bom_just_complete_metadata-1.4.json.bin |   4 +-
 ...component_setuptools_complete-1.2.json.bin |   4 +-
 ...component_setuptools_complete-1.3.json.bin |   4 +-
 ...component_setuptools_complete-1.4.json.bin |   4 +-
 ...-get_bom_with_nested_services-1.2.json.bin |  12 +-
 ...-get_bom_with_nested_services-1.3.json.bin |  12 +-
 ...-get_bom_with_nested_services-1.4.json.bin |  12 +-
 ...get_bom_with_services_complex-1.2.json.bin |   9 +-
 ...get_bom_with_services_complex-1.3.json.bin |   9 +-
 ...get_bom_with_services_complex-1.4.json.bin |   9 +-
 ...-get_bom_with_services_simple-1.2.json.bin |  13 +-
 ...-get_bom_with_services_simple-1.3.json.bin |  13 +-
 ...-get_bom_with_services_simple-1.4.json.bin |  13 +-
 ...t_bom_for_issue_275_components-1.0.xml.bin |  22 +
 ...t_bom_for_issue_275_components-1.1.xml.bin |  19 +
 ...t_bom_for_issue_275_components-1.2.xml.bin |  44 ++
 ...t_bom_for_issue_275_components-1.3.xml.bin |  44 ++
 ...t_bom_for_issue_275_components-1.4.xml.bin |  70 +++
 ...t_bom_for_issue_328_components-1.0.xml.bin |  24 +
 ...t_bom_for_issue_328_components-1.1.xml.bin |  21 +
 ...t_bom_for_issue_328_components-1.2.xml.bin |  39 ++
 ...t_bom_for_issue_328_components-1.3.xml.bin |  39 ++
 ...t_bom_for_issue_328_components-1.4.xml.bin |  65 ++
 ...get_bom_just_complete_metadata-1.0.xml.bin |   4 +
 ...get_bom_just_complete_metadata-1.1.xml.bin |   4 +
 ...get_bom_just_complete_metadata-1.2.xml.bin | 192 ++++++
 ...get_bom_just_complete_metadata-1.3.xml.bin | 225 +++++++
 ...get_bom_just_complete_metadata-1.4.xml.bin | 293 +++++++++
 ...ith_component_setuptools_basic-1.0.xml.bin |  11 +
 ...ith_component_setuptools_basic-1.1.xml.bin |  13 +
 ...ith_component_setuptools_basic-1.2.xml.bin |  27 +
 ...ith_component_setuptools_basic-1.3.xml.bin |  27 +
 ...ith_component_setuptools_basic-1.4.xml.bin |  53 ++
 ..._component_setuptools_complete-1.0.xml.bin |  33 ++
 ..._component_setuptools_complete-1.1.xml.bin | 123 ++++
 ..._component_setuptools_complete-1.2.xml.bin | 161 +++++
 ..._component_setuptools_complete-1.3.xml.bin | 183 ++++++
 ..._component_setuptools_complete-1.4.xml.bin | 251 ++++++++
 ...etuptools_no_component_version-1.0.xml.bin |  11 +
 ...etuptools_no_component_version-1.1.xml.bin |  13 +
 ...etuptools_no_component_version-1.2.xml.bin |  27 +
 ...etuptools_no_component_version-1.3.xml.bin |  27 +
 ...etuptools_no_component_version-1.4.xml.bin |  52 ++
 ..._component_setuptools_with_cpe-1.0.xml.bin |  12 +
 ..._component_setuptools_with_cpe-1.1.xml.bin |  14 +
 ..._component_setuptools_with_cpe-1.2.xml.bin |  28 +
 ..._component_setuptools_with_cpe-1.3.xml.bin |  28 +
 ..._component_setuptools_with_cpe-1.4.xml.bin |  54 ++
 ..._setuptools_with_release_notes-1.0.xml.bin |  11 +
 ..._setuptools_with_release_notes-1.1.xml.bin |  13 +
 ..._setuptools_with_release_notes-1.2.xml.bin |  27 +
 ..._setuptools_with_release_notes-1.3.xml.bin |  27 +
 ..._setuptools_with_release_notes-1.4.xml.bin |  97 +++
 ..._setuptools_with_vulnerability-1.0.xml.bin |  11 +
 ..._setuptools_with_vulnerability-1.1.xml.bin |  13 +
 ..._setuptools_with_vulnerability-1.2.xml.bin |  27 +
 ..._setuptools_with_vulnerability-1.3.xml.bin |  27 +
 ..._setuptools_with_vulnerability-1.4.xml.bin | 166 ++++++
 ...-get_bom_with_component_toml_1-1.0.xml.bin |  14 +
 ...-get_bom_with_component_toml_1-1.1.xml.bin |  19 +
 ...-get_bom_with_component_toml_1-1.2.xml.bin |  32 +
 ...-get_bom_with_component_toml_1-1.3.xml.bin |  35 ++
 ...-get_bom_with_component_toml_1-1.4.xml.bin |  61 ++
 ..._bom_with_dependencies_hanging-1.0.xml.bin |  20 +
 ..._bom_with_dependencies_hanging-1.1.xml.bin |  27 +
 ..._bom_with_dependencies_hanging-1.2.xml.bin |  42 ++
 ..._bom_with_dependencies_hanging-1.3.xml.bin |  45 ++
 ..._bom_with_dependencies_hanging-1.4.xml.bin |  44 ++
 ...et_bom_with_dependencies_valid-1.0.xml.bin |  20 +
 ...et_bom_with_dependencies_valid-1.1.xml.bin |  27 +
 ...et_bom_with_dependencies_valid-1.2.xml.bin |  44 ++
 ...et_bom_with_dependencies_valid-1.3.xml.bin |  47 ++
 ...et_bom_with_dependencies_valid-1.4.xml.bin |  73 +++
 ...t_bom_with_external_references-1.0.xml.bin |   4 +
 ...t_bom_with_external_references-1.1.xml.bin |  13 +
 ...t_bom_with_external_references-1.2.xml.bin |  22 +
 ...t_bom_with_external_references-1.3.xml.bin |  25 +
 ...t_bom_with_external_references-1.4.xml.bin |  51 ++
 ...ata_component_and_dependencies-1.0.xml.bin |  14 +
 ...ata_component_and_dependencies-1.1.xml.bin |  19 +
 ...ata_component_and_dependencies-1.2.xml.bin |  44 ++
 ...ata_component_and_dependencies-1.3.xml.bin |  47 ++
 ...ata_component_and_dependencies-1.4.xml.bin |  73 +++
 ...l-get_bom_with_nested_services-1.0.xml.bin |   4 +
 ...l-get_bom_with_nested_services-1.1.xml.bin |   4 +
 ...l-get_bom_with_nested_services-1.2.xml.bin | 112 ++++
 ...l-get_bom_with_nested_services-1.3.xml.bin | 119 ++++
 ...l-get_bom_with_nested_services-1.4.xml.bin | 189 ++++++
 ...-get_bom_with_services_complex-1.0.xml.bin |   4 +
 ...-get_bom_with_services_complex-1.1.xml.bin |   4 +
 ...-get_bom_with_services_complex-1.2.xml.bin |  64 ++
 ...-get_bom_with_services_complex-1.3.xml.bin |  71 +++
 ...-get_bom_with_services_complex-1.4.xml.bin | 141 +++++
 ...l-get_bom_with_services_simple-1.0.xml.bin |   4 +
 ...l-get_bom_with_services_simple-1.1.xml.bin |   4 +
 ...l-get_bom_with_services_simple-1.2.xml.bin |  30 +
 ...l-get_bom_with_services_simple-1.3.xml.bin |  30 +
 ...l-get_bom_with_services_simple-1.4.xml.bin |  56 ++
 tests/test_output_json.py                     |  13 +-
 tests/test_output_xml.py                      | 559 +-----------------
 103 files changed, 4478 insertions(+), 597 deletions(-)
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin

diff --git a/tests/_data/models.py b/tests/_data/models.py
index 8f9a1f660..68dfced0a 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -100,7 +100,12 @@
     '1a2f9dfc-3c86-48c7-8ca7-1db488d5c2a0',
     'a3f4096d-4211-4d68-9d2b-13973c86aca9',
 )
-TEST_UUIDS = tuple(map(UUID, MOCK_UUID))
+
+def uuid_generator(offset:int=0, version: int=4):
+    v = offset
+    while True:
+        v += 1
+        yield UUID(int=v, version=version)
 
 BOM_SERIAL_NUMBER = UUID('1441d33a-e0fc-45b5-af3b-61ee52a88bac')
 BOM_TIMESTAMP = datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
index 7e4efac68..befd43dd3 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000003"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000003",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
index 3292dfaac..dcd010ba4 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000002"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000002",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
index 44e8b3b85..8e583aece 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000001"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000001",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
index 8dd1577d9..80594a20c 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000006",
       "components": [
         {
           "author": "Test Author",
@@ -202,7 +202,7 @@
   ],
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000006"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
index 76b810cf0..727560925 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000005",
       "components": [
         {
           "author": "Test Author",
@@ -246,7 +246,7 @@
   ],
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000005"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
index 9574394e2..b19ef072f 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000004",
       "components": [
         {
           "author": "Test Author",
@@ -303,7 +303,7 @@
   ],
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000000000004"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
index a63db1288..17e7f2060 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+      "ref": "00000000-0000-4000-8000-000000000009"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000100000009"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000009",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -100,7 +100,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "bom-ref": "00000000-0000-4000-8000-000100000007",
           "name": "first-nested-service"
         }
       ],
@@ -108,11 +108,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "bom-ref": "00000000-0000-4000-8000-000100000009",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "bom-ref": "00000000-0000-4000-8000-000100000008",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
index 3f553374e..fa0d1111d 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+      "ref": "00000000-0000-4000-8000-000000000008"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000100000006"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000008",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -116,7 +116,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "bom-ref": "00000000-0000-4000-8000-000100000004",
           "name": "first-nested-service"
         }
       ],
@@ -124,11 +124,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "bom-ref": "00000000-0000-4000-8000-000100000006",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "bom-ref": "00000000-0000-4000-8000-000100000005",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
index 91d91e35e..8976e5a4e 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
+      "ref": "00000000-0000-4000-8000-000000000007"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000100000003"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000000000007",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -209,7 +209,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+          "bom-ref": "00000000-0000-4000-8000-000100000001",
           "name": "first-nested-service"
         }
       ],
@@ -217,11 +217,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
+      "bom-ref": "00000000-0000-4000-8000-000100000003",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+          "bom-ref": "00000000-0000-4000-8000-000100000002",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
index b94e63f23..af395bff8 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
@@ -1,7 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-00000000000c"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-00010000000c"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -9,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000c",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -74,7 +77,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00010000000c",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
index c350dc6aa..907b02b0e 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
@@ -1,7 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-00000000000b"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-00010000000b"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -9,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000b",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -90,7 +93,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00010000000b",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
index a3d0d17b1..8f852ad7a 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
@@ -1,7 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-00000000000a"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-00010000000a"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -9,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000a",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -183,7 +186,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00010000000a",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
index 10a7d7a7f..c5105a7aa 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
@@ -1,15 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      "ref": "00000000-0000-4000-8000-00000000000f"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-000100000011"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-000100000012"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000f",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -26,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-000100000011",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "bom-ref": "00000000-0000-4000-8000-000100000012",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
index 49d39a117..5e176fe0e 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
@@ -1,15 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      "ref": "00000000-0000-4000-8000-00000000000e"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-00010000000f"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-000100000010"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000e",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -26,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00010000000f",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "bom-ref": "00000000-0000-4000-8000-000100000010",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
index c10407dec..5e6388258 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
@@ -1,15 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
+      "ref": "00000000-0000-4000-8000-00000000000d"
     },
     {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
+      "ref": "00000000-0000-4000-8000-00010000000d"
+    },
+    {
+      "ref": "00000000-0000-4000-8000-00010000000e"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00000000000d",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -60,11 +63,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
+      "bom-ref": "00000000-0000-4000-8000-00010000000d",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
+      "bom-ref": "00000000-0000-4000-8000-00010000000e",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin
new file mode 100644
index 000000000..9c17482c6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>comp_a</name>
+      <version>1.0.0</version>
+      <modified>false</modified>
+    </component>
+    <component type="library">
+      <name>comp_b</name>
+      <version>1.0.0</version>
+      <modified>false</modified>
+      <components>
+        <component type="library">
+          <name>comp_c</name>
+          <version>1.0.0</version>
+          <modified>false</modified>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin
new file mode 100644
index 000000000..85289a746
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
+      <name>comp_a</name>
+      <version>1.0.0</version>
+    </component>
+    <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <name>comp_b</name>
+      <version>1.0.0</version>
+      <components>
+        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
+          <name>comp_c</name>
+          <version>1.0.0</version>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin
new file mode 100644
index 000000000..e9568f560
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <name>app</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
+      <name>comp_a</name>
+      <version>1.0.0</version>
+    </component>
+    <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <name>comp_b</name>
+      <version>1.0.0</version>
+      <components>
+        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
+          <name>comp_c</name>
+          <version>1.0.0</version>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+    </dependency>
+    <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
+      <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    </dependency>
+    <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin
new file mode 100644
index 000000000..c77704fc5
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <name>app</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
+      <name>comp_a</name>
+      <version>1.0.0</version>
+    </component>
+    <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <name>comp_b</name>
+      <version>1.0.0</version>
+      <components>
+        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
+          <name>comp_c</name>
+          <version>1.0.0</version>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+    </dependency>
+    <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
+      <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    </dependency>
+    <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin
new file mode 100644
index 000000000..dcd23b6a7
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <name>app</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
+      <name>comp_a</name>
+      <version>1.0.0</version>
+    </component>
+    <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <name>comp_b</name>
+      <version>1.0.0</version>
+      <components>
+        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
+          <name>comp_c</name>
+          <version>1.0.0</version>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
+      <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+    </dependency>
+    <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
+      <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
+      <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
+    </dependency>
+    <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin
new file mode 100644
index 000000000..8f2aeebc8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>A</name>
+      <version>0.1</version>
+      <modified>false</modified>
+      <components>
+        <component type="library">
+          <name>B</name>
+          <version>1.0</version>
+          <modified>false</modified>
+          <components>
+            <component type="library">
+              <name>C</name>
+              <version>1.0</version>
+              <modified>false</modified>
+            </component>
+          </components>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin
new file mode 100644
index 000000000..210e36e9f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="component-A">
+      <name>A</name>
+      <version>0.1</version>
+      <components>
+        <component type="library" bom-ref="component-B">
+          <name>B</name>
+          <version>1.0</version>
+          <components>
+            <component type="library" bom-ref="component-C">
+              <name>C</name>
+              <version>1.0</version>
+            </component>
+          </components>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin
new file mode 100644
index 000000000..629294135
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin
@@ -0,0 +1,39 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="application" bom-ref="my-project">
+      <name>my-project</name>
+      <version>1</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="component-A">
+      <name>A</name>
+      <version>0.1</version>
+      <components>
+        <component type="library" bom-ref="component-B">
+          <name>B</name>
+          <version>1.0</version>
+          <components>
+            <component type="library" bom-ref="component-C">
+              <name>C</name>
+              <version>1.0</version>
+            </component>
+          </components>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="component-A"/>
+    <dependency ref="my-project"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin
new file mode 100644
index 000000000..c3e67d2c2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin
@@ -0,0 +1,39 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="application" bom-ref="my-project">
+      <name>my-project</name>
+      <version>1</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="component-A">
+      <name>A</name>
+      <version>0.1</version>
+      <components>
+        <component type="library" bom-ref="component-B">
+          <name>B</name>
+          <version>1.0</version>
+          <components>
+            <component type="library" bom-ref="component-C">
+              <name>C</name>
+              <version>1.0</version>
+            </component>
+          </components>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="component-A"/>
+    <dependency ref="my-project"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin
new file mode 100644
index 000000000..a86555a64
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin
@@ -0,0 +1,65 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="application" bom-ref="my-project">
+      <name>my-project</name>
+      <version>1</version>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="component-A">
+      <name>A</name>
+      <version>0.1</version>
+      <components>
+        <component type="library" bom-ref="component-B">
+          <name>B</name>
+          <version>1.0</version>
+          <components>
+            <component type="library" bom-ref="component-C">
+              <name>C</name>
+              <version>1.0</version>
+            </component>
+          </components>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="component-A"/>
+    <dependency ref="my-project"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin
new file mode 100644
index 000000000..acb066124
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin
new file mode 100644
index 000000000..55ef5cda2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin
new file mode 100644
index 000000000..d39fdc714
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin
@@ -0,0 +1,192 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <authors>
+      <author>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </author>
+      <author>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </author>
+    </authors>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000003">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+    </component>
+    <manufacture>
+      <name>CycloneDX</name>
+      <url>https://cyclonedx.org</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+      <contact>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </contact>
+    </manufacture>
+    <supplier>
+      <name>Cyclone DX</name>
+      <url>https://cyclonedx.org/</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+    </supplier>
+  </metadata>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000003"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin
new file mode 100644
index 000000000..fd2e46d60
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin
@@ -0,0 +1,225 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <authors>
+      <author>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </author>
+      <author>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </author>
+    </authors>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000002">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+              <hashes>
+                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+              </hashes>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+      <evidence>
+        <copyright>
+          <text>Commercial</text>
+          <text>Commercial 2</text>
+        </copyright>
+      </evidence>
+    </component>
+    <manufacture>
+      <name>CycloneDX</name>
+      <url>https://cyclonedx.org</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+      <contact>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </contact>
+    </manufacture>
+    <supplier>
+      <name>Cyclone DX</name>
+      <url>https://cyclonedx.org/</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+    </supplier>
+    <licenses>
+      <license>
+        <id>Apache-2.0</id>
+        <text content-type="text/plain" encoding="base64">VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=</text>
+        <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      </license>
+    </licenses>
+    <properties>
+      <property name="key1">val1</property>
+      <property name="key2">val2</property>
+    </properties>
+  </metadata>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000002"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin
new file mode 100644
index 000000000..772145066
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin
@@ -0,0 +1,293 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <authors>
+      <author>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </author>
+      <author>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </author>
+    </authors>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000001">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+              <hashes>
+                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+              </hashes>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+      <evidence>
+        <copyright>
+          <text>Commercial</text>
+          <text>Commercial 2</text>
+        </copyright>
+      </evidence>
+      <releaseNotes>
+        <type>major</type>
+        <title>Release Notes Title</title>
+        <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
+        <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
+        <description>This release is a test release</description>
+        <timestamp>2023-08-15T01:23:45.678900+00:00</timestamp>
+        <aliases>
+          <alias>First Test Release</alias>
+        </aliases>
+        <tags>
+          <tag>alpha</tag>
+          <tag>test</tag>
+        </tags>
+        <resolves>
+          <issue type="security">
+            <id>CVE-2021-44228</id>
+            <name>Apache Log3Shell</name>
+            <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
+            <source>
+              <name>NVD</name>
+              <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
+            </source>
+            <references>
+              <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
+              <url>https://logging.apache.org/log4j/2.x/security.html</url>
+            </references>
+          </issue>
+        </resolves>
+        <notes>
+          <note>
+            <locale>en-GB</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+          <note>
+            <locale>en-US</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+        </notes>
+        <properties>
+          <property name="key1">val1</property>
+          <property name="key2">val2</property>
+        </properties>
+      </releaseNotes>
+    </component>
+    <manufacture>
+      <name>CycloneDX</name>
+      <url>https://cyclonedx.org</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+      <contact>
+        <name>Paul Horton</name>
+        <email>paul.horton@owasp.org</email>
+      </contact>
+    </manufacture>
+    <supplier>
+      <name>Cyclone DX</name>
+      <url>https://cyclonedx.org/</url>
+      <contact>
+        <name>A N Other</name>
+        <email>someone@somewhere.tld</email>
+        <phone>+44 (0)1234 567890</phone>
+      </contact>
+    </supplier>
+    <licenses>
+      <license>
+        <id>Apache-2.0</id>
+        <text content-type="text/plain" encoding="base64">VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=</text>
+        <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      </license>
+    </licenses>
+    <properties>
+      <property name="key1">val1</property>
+      <property name="key2">val2</property>
+    </properties>
+  </metadata>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000001"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin
new file mode 100644
index 000000000..961bb4798
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin
new file mode 100644
index 000000000..0b33bec2a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin
new file mode 100644
index 000000000..ce6f3e6c6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin
new file mode 100644
index 000000000..39cbf1d85
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin
new file mode 100644
index 000000000..bef590f2f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin
@@ -0,0 +1,53 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin
new file mode 100644
index 000000000..dc8f73327
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin
@@ -0,0 +1,33 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+      <components>
+        <component type="library">
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          <modified>false</modified>
+        </component>
+        <component type="library">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <modified>false</modified>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin
new file mode 100644
index 000000000..c20fbeed9
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin
@@ -0,0 +1,123 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000009">
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin
new file mode 100644
index 000000000..52ce835d5
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin
@@ -0,0 +1,161 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000008">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000008"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin
new file mode 100644
index 000000000..adbc02190
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin
@@ -0,0 +1,183 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000007">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version/>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+              <hashes>
+                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+              </hashes>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+      <evidence>
+        <copyright>
+          <text>Commercial</text>
+          <text>Commercial 2</text>
+        </copyright>
+      </evidence>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000007"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin
new file mode 100644
index 000000000..85f5452a4
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin
@@ -0,0 +1,251 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000006">
+      <supplier>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </supplier>
+      <author>Test Author</author>
+      <publisher>CycloneDX</publisher>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <description>This component is awesome</description>
+      <scope>required</scope>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <copyright>Apache 2.0 baby!</copyright>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
+        <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+      </swid>
+      <pedigree>
+        <ancestors>
+          <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+        </ancestors>
+        <descendants>
+          <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </descendants>
+        <variants>
+          <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
+            <author>Test Author</author>
+            <name>setuptools</name>
+            <version>50.3.2</version>
+            <licenses>
+              <expression>MIT License</expression>
+            </licenses>
+            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+          </component>
+          <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
+            <name>toml</name>
+            <version>0.10.2</version>
+            <hashes>
+              <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+            </hashes>
+            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+            <externalReferences>
+              <reference type="distribution">
+                <url>https://cyclonedx.org</url>
+                <comment>No comment</comment>
+                <hashes>
+                  <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+                </hashes>
+              </reference>
+            </externalReferences>
+          </component>
+        </variants>
+        <commits>
+          <commit>
+            <uid>a-random-uid</uid>
+            <message>A commit message</message>
+          </commit>
+        </commits>
+        <patches>
+          <patch type="backport"/>
+        </patches>
+        <notes>Some notes here please</notes>
+      </pedigree>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <components>
+        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+          <author>Test Author</author>
+          <name>setuptools</name>
+          <version>50.3.2</version>
+          <licenses>
+            <expression>MIT License</expression>
+          </licenses>
+          <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+        </component>
+        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+          <name>toml</name>
+          <version>0.10.2</version>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+          <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+          <externalReferences>
+            <reference type="distribution">
+              <url>https://cyclonedx.org</url>
+              <comment>No comment</comment>
+              <hashes>
+                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+              </hashes>
+            </reference>
+          </externalReferences>
+        </component>
+      </components>
+      <evidence>
+        <copyright>
+          <text>Commercial</text>
+          <text>Commercial 2</text>
+        </copyright>
+      </evidence>
+      <releaseNotes>
+        <type>major</type>
+        <title>Release Notes Title</title>
+        <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
+        <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
+        <description>This release is a test release</description>
+        <timestamp>2023-08-15T01:23:45.678900+00:00</timestamp>
+        <aliases>
+          <alias>First Test Release</alias>
+        </aliases>
+        <tags>
+          <tag>alpha</tag>
+          <tag>test</tag>
+        </tags>
+        <resolves>
+          <issue type="security">
+            <id>CVE-2021-44228</id>
+            <name>Apache Log3Shell</name>
+            <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
+            <source>
+              <name>NVD</name>
+              <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
+            </source>
+            <references>
+              <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
+              <url>https://logging.apache.org/log4j/2.x/security.html</url>
+            </references>
+          </issue>
+        </resolves>
+        <notes>
+          <note>
+            <locale>en-GB</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+          <note>
+            <locale>en-US</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+        </notes>
+        <properties>
+          <property name="key1">val1</property>
+          <property name="key2">val2</property>
+        </properties>
+      </releaseNotes>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000006"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
new file mode 100644
index 000000000..19b807ce8
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version/>
+      <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
new file mode 100644
index 000000000..4d6b504d4
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
+      <name>setuptools</name>
+      <version/>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
new file mode 100644
index 000000000..a993370c3
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version/>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
new file mode 100644
index 000000000..f12eaf368
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version/>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
new file mode 100644
index 000000000..a08ce14db
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
@@ -0,0 +1,52 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
new file mode 100644
index 000000000..79dbb1afc
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
new file mode 100644
index 000000000..1ac5e156d
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
new file mode 100644
index 000000000..7a23d5d11
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
@@ -0,0 +1,28 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
new file mode 100644
index 000000000..a2d699055
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
@@ -0,0 +1,28 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
new file mode 100644
index 000000000..a2c30d437
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
@@ -0,0 +1,54 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
new file mode 100644
index 000000000..961bb4798
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
new file mode 100644
index 000000000..0b33bec2a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
new file mode 100644
index 000000000..ce6f3e6c6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
new file mode 100644
index 000000000..39cbf1d85
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
new file mode 100644
index 000000000..2d067b43e
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
@@ -0,0 +1,97 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <releaseNotes>
+        <type>major</type>
+        <title>Release Notes Title</title>
+        <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
+        <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
+        <description>This release is a test release</description>
+        <timestamp>2023-08-15T01:23:45.678900+00:00</timestamp>
+        <aliases>
+          <alias>First Test Release</alias>
+        </aliases>
+        <tags>
+          <tag>alpha</tag>
+          <tag>test</tag>
+        </tags>
+        <resolves>
+          <issue type="security">
+            <id>CVE-2021-44228</id>
+            <name>Apache Log3Shell</name>
+            <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
+            <source>
+              <name>NVD</name>
+              <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
+            </source>
+            <references>
+              <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
+              <url>https://logging.apache.org/log4j/2.x/security.html</url>
+            </references>
+          </issue>
+        </resolves>
+        <notes>
+          <note>
+            <locale>en-GB</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+          <note>
+            <locale>en-US</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+        </notes>
+        <properties>
+          <property name="key1">val1</property>
+          <property name="key2">val2</property>
+        </properties>
+      </releaseNotes>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
new file mode 100644
index 000000000..961bb4798
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
new file mode 100644
index 000000000..0b33bec2a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
new file mode 100644
index 000000000..ce6f3e6c6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
new file mode 100644
index 000000000..39cbf1d85
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
new file mode 100644
index 000000000..7ccc65ebd
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
@@ -0,0 +1,166 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+  <vulnerabilities>
+    <vulnerability bom-ref="my-vuln-ref-1">
+      <id>CVE-2018-7489</id>
+      <source>
+        <name>NVD</name>
+        <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
+      </source>
+      <references>
+        <reference>
+          <id>SOME-OTHER-ID</id>
+          <source>
+            <name>OSS Index</name>
+            <url>https://ossindex.sonatype.org/component/pkg:pypi/setuptools</url>
+          </source>
+        </reference>
+      </references>
+      <ratings>
+        <rating>
+          <source>
+            <name>NVD</name>
+            <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
+          </source>
+          <score>9.8</score>
+          <severity>critical</severity>
+          <method>CVSSv3</method>
+          <vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</vector>
+          <justification>Some justification</justification>
+        </rating>
+        <rating>
+          <source>
+            <name>OWASP</name>
+            <url>https://owasp.org</url>
+          </source>
+          <score>2.7</score>
+          <severity>low</severity>
+          <method>CVSSv3</method>
+          <vector>AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N</vector>
+          <justification>Some other justification</justification>
+        </rating>
+      </ratings>
+      <cwes>
+        <cwe>22</cwe>
+        <cwe>33</cwe>
+      </cwes>
+      <description>A description here</description>
+      <detail>Some detail here</detail>
+      <recommendation>Upgrade</recommendation>
+      <advisories>
+        <advisory>
+          <url>http://www.securitytracker.com/id/1040693</url>
+        </advisory>
+        <advisory>
+          <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
+        </advisory>
+      </advisories>
+      <created>2021-09-01T10:50:42.051979+00:00</created>
+      <published>2021-09-02T10:50:42.051979+00:00</published>
+      <updated>2021-09-03T10:50:42.051979+00:00</updated>
+      <credits>
+        <organizations>
+          <organization>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </organization>
+        </organizations>
+        <individuals>
+          <individual>
+            <name>A N Other</name>
+            <email>someone@somewhere.tld</email>
+            <phone>+44 (0)1234 567890</phone>
+          </individual>
+        </individuals>
+      </credits>
+      <tools>
+        <tool>
+          <vendor>CycloneDX</vendor>
+          <name>cyclonedx-python-lib</name>
+        </tool>
+      </tools>
+      <analysis>
+        <state>exploitable</state>
+        <justification>requires_environment</justification>
+        <responses>
+          <response>can_not_fix</response>
+        </responses>
+        <detail>Some extra detail</detail>
+      </analysis>
+      <affects>
+        <target>
+          <ref>pkg:pypi/setuptools@50.3.2?extension=tar.gz</ref>
+          <versions>
+            <version>
+              <range>49.0.0 - 54.0.0</range>
+              <status>affected</status>
+            </version>
+          </versions>
+        </target>
+      </affects>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+    </vulnerability>
+  </vulnerabilities>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin
new file mode 100644
index 000000000..7355c2cac
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin
new file mode 100644
index 000000000..7f5932c19
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin
new file mode 100644
index 000000000..ef97c383d
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin
@@ -0,0 +1,32 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin
new file mode 100644
index 000000000..a9417823f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin
@@ -0,0 +1,35 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin
new file mode 100644
index 000000000..a17f8a46a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin
@@ -0,0 +1,61 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin
new file mode 100644
index 000000000..d0259a8af
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="23">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+    <component type="library">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin
new file mode 100644
index 000000000..ef886b52b
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
+  <components>
+    <component type="library" bom-ref="setuptools">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="toml">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin
new file mode 100644
index 000000000..1389c52b2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin
@@ -0,0 +1,42 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <component type="application" bom-ref="root-component">
+      <name>rootComponent</name>
+      <version/>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="setuptools">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="toml">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="root-component"/>
+    <dependency ref="setuptools">
+      <dependency ref="toml"/>
+    </dependency>
+    <dependency ref="toml"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin
new file mode 100644
index 000000000..91b049a8f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin
@@ -0,0 +1,45 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <component type="application" bom-ref="root-component">
+      <name>rootComponent</name>
+      <version/>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="setuptools">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="toml">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="root-component"/>
+    <dependency ref="setuptools">
+      <dependency ref="toml"/>
+    </dependency>
+    <dependency ref="toml"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin
new file mode 100644
index 000000000..fd73dd78c
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <component type="application" bom-ref="root-component">
+      <name>rootComponent</name>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="setuptools">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="toml">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="root-component"/>
+    <dependency ref="setuptools">
+      <dependency ref="toml"/>
+    </dependency>
+    <dependency ref="toml"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin
new file mode 100644
index 000000000..9d0e55d48
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+    <component type="library">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin
new file mode 100644
index 000000000..2f6897772
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin
new file mode 100644
index 000000000..4fd57d868
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin
new file mode 100644
index 000000000..6a5779c80
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin
new file mode 100644
index 000000000..64970d15b
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin
new file mode 100644
index 000000000..acb066124
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin
new file mode 100644
index 000000000..0a260e819
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components/>
+  <externalReferences>
+    <reference type="distribution">
+      <url>https://cyclonedx.org</url>
+      <comment>No comment</comment>
+    </reference>
+    <reference type="website">
+      <url>https://cyclonedx.org</url>
+    </reference>
+  </externalReferences>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin
new file mode 100644
index 000000000..052f94d0b
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <externalReferences>
+    <reference type="distribution">
+      <url>https://cyclonedx.org</url>
+      <comment>No comment</comment>
+    </reference>
+    <reference type="website">
+      <url>https://cyclonedx.org</url>
+    </reference>
+  </externalReferences>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin
new file mode 100644
index 000000000..b82483a08
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin
@@ -0,0 +1,25 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <externalReferences>
+    <reference type="distribution">
+      <url>https://cyclonedx.org</url>
+      <comment>No comment</comment>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+    </reference>
+    <reference type="website">
+      <url>https://cyclonedx.org</url>
+    </reference>
+  </externalReferences>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin
new file mode 100644
index 000000000..877f4c951
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin
@@ -0,0 +1,51 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <externalReferences>
+    <reference type="distribution">
+      <url>https://cyclonedx.org</url>
+      <comment>No comment</comment>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+    </reference>
+    <reference type="website">
+      <url>https://cyclonedx.org</url>
+    </reference>
+  </externalReferences>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
new file mode 100644
index 000000000..7355c2cac
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
new file mode 100644
index 000000000..7f5932c19
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
new file mode 100644
index 000000000..0370a0e36
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
new file mode 100644
index 000000000..1b6501308
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
new file mode 100644
index 000000000..1464249f6
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
+      <name>toml</name>
+      <version>0.10.2</version>
+      <hashes>
+        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+      </hashes>
+      <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+    </dependency>
+    <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin
new file mode 100644
index 000000000..acb066124
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin
new file mode 100644
index 000000000..55ef5cda2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
new file mode 100644
index 000000000..c67179618
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
@@ -0,0 +1,112 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000d">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+      <services>
+        <service bom-ref="my-specific-bom-ref-for-second-nested-service">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>no-group</group>
+          <name>second-nested-service</name>
+          <version>3.2.1</version>
+          <authenticated>true</authenticated>
+          <x-trust-boundary>false</x-trust-boundary>
+        </service>
+        <service bom-ref="00000000-0000-4000-8000-000100000007">
+          <name>first-nested-service</name>
+        </service>
+      </services>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000009">
+      <name>my-second-service</name>
+      <services>
+        <service bom-ref="00000000-0000-4000-8000-000100000008">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>what-group</group>
+          <name>yet-another-nested-service</name>
+          <version>6.5.4</version>
+        </service>
+        <service bom-ref="my-specific-bom-ref-for-another-nested-service">
+          <name>another-nested-service</name>
+        </service>
+      </services>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
+    <dependency ref="00000000-0000-4000-8000-000100000009"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
new file mode 100644
index 000000000..8bf91d24f
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
@@ -0,0 +1,119 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000c">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <services>
+        <service bom-ref="my-specific-bom-ref-for-second-nested-service">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>no-group</group>
+          <name>second-nested-service</name>
+          <version>3.2.1</version>
+          <authenticated>true</authenticated>
+          <x-trust-boundary>false</x-trust-boundary>
+        </service>
+        <service bom-ref="00000000-0000-4000-8000-000100000004">
+          <name>first-nested-service</name>
+        </service>
+      </services>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000006">
+      <name>my-second-service</name>
+      <services>
+        <service bom-ref="00000000-0000-4000-8000-000100000005">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>what-group</group>
+          <name>yet-another-nested-service</name>
+          <version>6.5.4</version>
+        </service>
+        <service bom-ref="my-specific-bom-ref-for-another-nested-service">
+          <name>another-nested-service</name>
+        </service>
+      </services>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000c"/>
+    <dependency ref="00000000-0000-4000-8000-000100000006"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
new file mode 100644
index 000000000..6ffef0d48
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
@@ -0,0 +1,189 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000b">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <services>
+        <service bom-ref="my-specific-bom-ref-for-second-nested-service">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>no-group</group>
+          <name>second-nested-service</name>
+          <version>3.2.1</version>
+          <authenticated>true</authenticated>
+          <x-trust-boundary>false</x-trust-boundary>
+        </service>
+        <service bom-ref="00000000-0000-4000-8000-000100000001">
+          <name>first-nested-service</name>
+        </service>
+      </services>
+      <releaseNotes>
+        <type>major</type>
+        <title>Release Notes Title</title>
+        <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
+        <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
+        <description>This release is a test release</description>
+        <timestamp>2023-08-15T01:23:45.678900+00:00</timestamp>
+        <aliases>
+          <alias>First Test Release</alias>
+        </aliases>
+        <tags>
+          <tag>alpha</tag>
+          <tag>test</tag>
+        </tags>
+        <resolves>
+          <issue type="security">
+            <id>CVE-2021-44228</id>
+            <name>Apache Log3Shell</name>
+            <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
+            <source>
+              <name>NVD</name>
+              <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
+            </source>
+            <references>
+              <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
+              <url>https://logging.apache.org/log4j/2.x/security.html</url>
+            </references>
+          </issue>
+        </resolves>
+        <notes>
+          <note>
+            <locale>en-GB</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+          <note>
+            <locale>en-US</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+        </notes>
+        <properties>
+          <property name="key1">val1</property>
+          <property name="key2">val2</property>
+        </properties>
+      </releaseNotes>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000003">
+      <name>my-second-service</name>
+      <services>
+        <service bom-ref="00000000-0000-4000-8000-000100000002">
+          <provider>
+            <name>CycloneDX</name>
+            <url>https://cyclonedx.org</url>
+            <contact>
+              <name>A N Other</name>
+              <email>someone@somewhere.tld</email>
+              <phone>+44 (0)1234 567890</phone>
+            </contact>
+            <contact>
+              <name>Paul Horton</name>
+              <email>paul.horton@owasp.org</email>
+            </contact>
+          </provider>
+          <group>what-group</group>
+          <name>yet-another-nested-service</name>
+          <version>6.5.4</version>
+        </service>
+        <service bom-ref="my-specific-bom-ref-for-another-nested-service">
+          <name>another-nested-service</name>
+        </service>
+      </services>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000b"/>
+    <dependency ref="00000000-0000-4000-8000-000100000003"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin
new file mode 100644
index 000000000..acb066124
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin
new file mode 100644
index 000000000..55ef5cda2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
new file mode 100644
index 000000000..d4ed97a1a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
@@ -0,0 +1,64 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000012">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+        </reference>
+      </externalReferences>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000012">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000012"/>
+    <dependency ref="00000000-0000-4000-8000-000100000012"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
new file mode 100644
index 000000000..d98d91eb5
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000011">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000011">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000011"/>
+    <dependency ref="00000000-0000-4000-8000-000100000011"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
new file mode 100644
index 000000000..968efe928
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
@@ -0,0 +1,141 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000010">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
+      <provider>
+        <name>CycloneDX</name>
+        <url>https://cyclonedx.org</url>
+        <contact>
+          <name>A N Other</name>
+          <email>someone@somewhere.tld</email>
+          <phone>+44 (0)1234 567890</phone>
+        </contact>
+        <contact>
+          <name>Paul Horton</name>
+          <email>paul.horton@owasp.org</email>
+        </contact>
+      </provider>
+      <group>a-group</group>
+      <name>my-first-service</name>
+      <version>1.2.3</version>
+      <description>Description goes here</description>
+      <endpoints>
+        <endpoint>/api/thing/1</endpoint>
+        <endpoint>/api/thing/2</endpoint>
+      </endpoints>
+      <authenticated>false</authenticated>
+      <x-trust-boundary>true</x-trust-boundary>
+      <data>
+        <classification flow="outbound">public</classification>
+      </data>
+      <licenses>
+        <expression>Commercial</expression>
+      </licenses>
+      <externalReferences>
+        <reference type="distribution">
+          <url>https://cyclonedx.org</url>
+          <comment>No comment</comment>
+          <hashes>
+            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
+          </hashes>
+        </reference>
+      </externalReferences>
+      <properties>
+        <property name="key1">val1</property>
+        <property name="key2">val2</property>
+      </properties>
+      <releaseNotes>
+        <type>major</type>
+        <title>Release Notes Title</title>
+        <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
+        <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
+        <description>This release is a test release</description>
+        <timestamp>2023-08-15T01:23:45.678900+00:00</timestamp>
+        <aliases>
+          <alias>First Test Release</alias>
+        </aliases>
+        <tags>
+          <tag>alpha</tag>
+          <tag>test</tag>
+        </tags>
+        <resolves>
+          <issue type="security">
+            <id>CVE-2021-44228</id>
+            <name>Apache Log3Shell</name>
+            <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
+            <source>
+              <name>NVD</name>
+              <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
+            </source>
+            <references>
+              <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
+              <url>https://logging.apache.org/log4j/2.x/security.html</url>
+            </references>
+          </issue>
+        </resolves>
+        <notes>
+          <note>
+            <locale>en-GB</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+          <note>
+            <locale>en-US</locale>
+            <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
+          </note>
+        </notes>
+        <properties>
+          <property name="key1">val1</property>
+          <property name="key2">val2</property>
+        </properties>
+      </releaseNotes>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000010">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000010"/>
+    <dependency ref="00000000-0000-4000-8000-000100000010"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin
new file mode 100644
index 000000000..acb066124
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin
new file mode 100644
index 000000000..55ef5cda2
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components/>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
new file mode 100644
index 000000000..e8fc11f64
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000017">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="00000000-0000-4000-8000-000100000019">
+      <name>my-first-service</name>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-00010000001a">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000017"/>
+    <dependency ref="00000000-0000-4000-8000-000100000019"/>
+    <dependency ref="00000000-0000-4000-8000-00010000001a"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
new file mode 100644
index 000000000..56bc910b1
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000016">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="00000000-0000-4000-8000-000100000017">
+      <name>my-first-service</name>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000018">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000016"/>
+    <dependency ref="00000000-0000-4000-8000-000100000017"/>
+    <dependency ref="00000000-0000-4000-8000-000100000018"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
new file mode 100644
index 000000000..870fce0e5
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
@@ -0,0 +1,56 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000015">
+      <name>cyclonedx-python-lib</name>
+      <version>1.0.0</version>
+    </component>
+  </metadata>
+  <services>
+    <service bom-ref="00000000-0000-4000-8000-000100000015">
+      <name>my-first-service</name>
+    </service>
+    <service bom-ref="00000000-0000-4000-8000-000100000016">
+      <name>my-second-service</name>
+    </service>
+  </services>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-000000000015"/>
+    <dependency ref="00000000-0000-4000-8000-000100000015"/>
+    <dependency ref="00000000-0000-4000-8000-000100000016"/>
+  </dependencies>
+</bom>
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index bc52f95a1..dba8845da 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -14,6 +14,7 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
+
 from typing import Callable
 from unittest import TestCase
 from unittest.mock import Mock, patch
@@ -25,21 +26,21 @@
 from cyclonedx.schema import SchemaVersion, OutputFormat
 
 from tests import SnapshotCompareMixin
-from tests._data.models import all_get_bom_funct_valid, TEST_UUIDS
+from tests._data.models import all_get_bom_funct_valid, uuid_generator
 
 from cyclonedx.validation.json import JsonStrictValidator
 
 
 @ddt
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.component.uuid4', side_effect=TEST_UUIDS)
-@patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
+@patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
+@patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
 class TestOutputJson(TestCase, SnapshotCompareMixin):
 
     @named_data(*(
-        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in [
-            SchemaVersion.V1_4, SchemaVersion.V1_3, SchemaVersion.V1_2,
-        ]
+        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion if sv not in [
+        SchemaVersion.V1_1, SchemaVersion.V1_0,
+    ]
     ))
     @unpack
     def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 5303cb9f0..9ed6edc05 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -14,555 +14,42 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
-from os.path import join
-from typing import Optional, Union
+
+
+from typing import Callable
 from unittest import TestCase
 from unittest.mock import Mock, patch
-from uuid import UUID
 
-from ddt import ddt, idata, named_data
+from ddt import ddt, idata, named_data, unpack
 
 from cyclonedx.model.bom import Bom
-from cyclonedx.output import get_instance as get_outputter
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
-from cyclonedx.schema import OutputFormat, SchemaVersion
-from tests import TESTDATA_DIRECTORY
-from tests.base import BaseXmlTestCase
-from tests.data import (
-    MOCK_BOM_UUID_1,
-    MOCK_TIMESTAMP,
-    MOCK_UUID_1,
-    MOCK_UUID_2,
-    MOCK_UUID_3,
-    MOCK_UUID_4,
-    MOCK_UUID_5,
-    MOCK_UUID_6,
-    TEST_UUIDS,
-    get_bom_for_issue_275_components,
-    get_bom_just_complete_metadata,
-    get_bom_with_component_setuptools_basic,
-    get_bom_with_component_setuptools_complete,
-    get_bom_with_component_setuptools_no_component_version,
-    get_bom_with_component_setuptools_with_cpe,
-    get_bom_with_component_setuptools_with_release_notes,
-    get_bom_with_component_setuptools_with_vulnerability,
-    get_bom_with_component_toml_1,
-    get_bom_with_dependencies_hanging,
-    get_bom_with_dependencies_valid,
-    get_bom_with_external_references,
-    get_bom_with_metadata_component_and_dependencies,
-    get_bom_with_nested_services,
-    get_bom_with_services_complex,
-    get_bom_with_services_simple,
-)
+from cyclonedx.schema import SchemaVersion, OutputFormat
+
+from tests import SnapshotCompareMixin
+from tests._data.models import all_get_bom_funct_valid, uuid_generator
 
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
+from cyclonedx.validation.xml import XmlValidator
 
 
 @ddt
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-class TestOutputXml(BaseXmlTestCase):
-
-    def test_bom_external_references_v1_4(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_external_references.xml'
-        )
-
-    def test_bom_external_references_v1_3(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_external_references.xml'
-        )
-
-    def test_bom_external_references_v1_2(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_external_references.xml'
-        )
-
-    def test_bom_external_references_v1_1(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_external_references.xml'
-        )
-
-    def test_bom_external_references_v1_0(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_empty.xml'
-        )
-
-    def test_simple_bom_v1_4(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_simple_bom_v1_3(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_simple_bom_v1_2(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_simple_bom_v1_1(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_simple_bom_v1_0(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_simple_bom_v1_4_with_cpe(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-
-    def test_simple_bom_v1_3_with_cpe(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-
-    def test_simple_bom_v1_2_with_cpe(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-
-    def test_simple_bom_v1_1_with_cpe(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-
-    def test_simple_bom_v1_0_with_cpe(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_4_full_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    def test_bom_v1_3_full_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_2))
-    def test_bom_v1_2_full_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_1))
-    def test_bom_v1_1_full_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_uuid.assert_called()
-
-    def test_bom_v1_0_full_component(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_complete.xml'
-        )
-
-    def test_bom_v1_4_component_hashes_external_references(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-
-    def test_bom_v1_3_component_hashes_external_references(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-
-    def test_bom_v1_2_component_hashes_external_references(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-
-    def test_bom_v1_1_component_hashes_external_references(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-
-    def test_bom_v1_0_component_hashes_external_references(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-
-    def test_bom_v1_4_no_component_version(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_no_version.xml'
-        )
-
-    def test_bom_v1_3_no_component_version(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_no_version.xml'
-        )
-
-    def test_bom_v1_2_no_component_version(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_no_version.xml'
-        )
-
-    def test_bom_v1_1_no_component_version(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_no_version.xml'
-        )
-
-    def test_bom_v1_0_no_component_version(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_no_version.xml'
-        )
-
-    def test_bom_v1_4_component_with_release_notes(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_release_notes.xml'
-        )
-
-    def test_bom_v1_3_component_with_release_notes(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.xml'
-        )
-
-    def test_bom_v1_4_component_with_vulnerability(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_vulnerabilities.xml'
-        )
-
-    def test_bom_v1_0_component_with_vulnerability(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools.xml'
-        )
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_4_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    def test_bom_v1_3_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_2_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=UUID(MOCK_UUID_1))
-    def test_bom_v1_1_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=UUID(MOCK_UUID_1))
-    def test_bom_v1_0_with_metadata_component(self, mock_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_0,
-                fixture='bom_empty.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_1_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_0_services_simple(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_0,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_2))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_1_services_complex(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_nested(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    def test_bom_v1_4_dependencies(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies.xml'
-        )
-
-    def test_bom_v1_3_dependencies(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies.xml'
-        )
-
-    def test_bom_v1_2_dependencies(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies.xml'
-        )
-
-    def test_bom_v1_1_dependencies(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_dependencies.xml'
-        )
-
-    def test_bom_v1_4_dependencies_for_bom_component(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies_component.xml'
-        )
-
-    def test_bom_v1_3_dependencies_for_bom_component(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies_component.xml'
-        )
-
-    def test_bom_v1_2_dependencies_for_bom_component(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies_component.xml'
-        )
-
-    def test_bom_v1_4_issue_275_components(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_issue_275_components.xml'
-        )
-
-    def test_bom_v1_3_issue_275_components(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_issue_275_components.xml'
-        )
-
-    def test_bom_v1_2_issue_275_components(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_issue_275_components.xml'
-        )
-
-    def test_bom_v1_1_issue_275_components(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_issue_275_components.xml'
-        )
-
-    def test_bom_v1_0_issue_275_components(self) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_issue_275_components.xml'
-        )
-
-    def test_bom_v1_4_warn_dependencies(self) -> None:
-        with self.assertWarns(UserWarning):
-            # this data set is expected to throw this UserWarning.
-            # that is the while point of this test!
-            self._validate_xml_bom(
-                bom=get_bom_with_dependencies_hanging(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_dependencies_hanging.xml'
-            )
-
-    @named_data(
-        ('None', 'None', None),
-        ('two', 'two', 2),
-        ('4spaces', '4spaces', '    '),
-        ('tab', 'tab', '\t')
-    )
-    def test_indent(self, name: str, indent: Optional[Union[str, int]]) -> None:
-        bom = get_bom_with_component_setuptools_basic()
-        bom.serial_number = MOCK_BOM_UUID_1
-        bom.metadata.timestamp = MOCK_TIMESTAMP
-        schema_version = SchemaVersion.V1_4
-        outputter = get_outputter(bom=bom, schema_version=schema_version, output_format=OutputFormat.XML)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), f'indented_{name}.xml')
-                  ) as expected_xml:
-            bom_xml = outputter.output_as_string(indent=indent)
-            self.assertEqual(expected_xml.read(), bom_xml)
-            self.assertValidAgainstSchema(bom_xml=bom_xml, schema_version=schema_version)
-
-    # region Helper methods
+@patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
+@patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
+class TestOutputXml(TestCase, SnapshotCompareMixin):
+
+    @named_data(*(
+        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion
+    ))
+    @unpack
+    def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+        bom = get_bom()
+        xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
+        errors = XmlValidator(sv).validate_str(xml)
+        self.assertIsNone(errors)
+        self.assertEqualSnapshot(xml, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.xml')
 
-    def _validate_xml_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
-        outputter = get_outputter(bom=bom, schema_version=schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as expected_xml:
-            output_as_string = outputter.output_as_string()
-            self.assertValidAgainstSchema(bom_xml=output_as_string, schema_version=schema_version)
-            self.assertEqualXmlBom(
-                expected_xml.read(), output_as_string, namespace=outputter.get_target_namespace()
-            )
 
-    # endregion Helper methods
 
 
 @ddt

From 8e6b0da98d9b32851737ab9d1514d65c57fa951a Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 6 Oct 2023 22:57:24 +0200
Subject: [PATCH 05/22] tidy

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py         |  2 +-
 tests/_data/models.py     | 21 +++++++++++----------
 tests/test_component.py   |  2 +-
 tests/test_output_json.py | 10 ++++------
 tests/test_output_xml.py  |  8 ++------
 5 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index 7d100d413..e3fc29ab2 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -17,7 +17,7 @@
 
 from os import getenv, path
 from os.path import join
-from typing import Union, Any, Optional, TypeVar, List
+from typing import Any, List, Optional, TypeVar, Union
 from unittest import TestCase
 
 from sortedcontainers import SortedSet
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 68dfced0a..8b6b8afa9 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -16,9 +16,11 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 import base64
+import sys
 from datetime import datetime, timezone
 from decimal import Decimal
-from typing import List, Optional, TypeVar, Any, Dict, ParamSpec
+from inspect import getmembers, isfunction
+from typing import Any, Dict, List, Optional, ParamSpec, TypeVar
 from uuid import UUID
 
 # See https://github.com/package-url/packageurl-python/issues/65
@@ -26,6 +28,7 @@
 
 from cyclonedx.model import (
     AttachedText,
+    Copyright,
     DataClassification,
     DataFlow,
     Encoding,
@@ -41,7 +44,6 @@
     Property,
     Tool,
     XsUri,
-    Copyright,
 )
 from cyclonedx.model.bom import Bom, BomMetaData
 from cyclonedx.model.component import (
@@ -56,15 +58,15 @@
     Swid,
 )
 from cyclonedx.model.dependency import Dependency
-from cyclonedx.model.issue import IssueClassification, IssueType, IssueTypeSource
-from cyclonedx.model.release_note import ReleaseNotes
-from cyclonedx.model.service import Service
 from cyclonedx.model.impact_analysis import (
     ImpactAnalysisAffectedStatus,
     ImpactAnalysisJustification,
     ImpactAnalysisResponse,
     ImpactAnalysisState,
 )
+from cyclonedx.model.issue import IssueClassification, IssueType, IssueTypeSource
+from cyclonedx.model.release_note import ReleaseNotes
+from cyclonedx.model.service import Service
 from cyclonedx.model.vulnerability import (
     BomTarget,
     BomTargetVersionRange,
@@ -101,12 +103,14 @@
     'a3f4096d-4211-4d68-9d2b-13973c86aca9',
 )
 
-def uuid_generator(offset:int=0, version: int=4):
+
+def uuid_generator(offset: int = 0, version: int = 4):
     v = offset
     while True:
         v += 1
         yield UUID(int=v, version=version)
 
+
 BOM_SERIAL_NUMBER = UUID('1441d33a-e0fc-45b5-af3b-61ee52a88bac')
 BOM_TIMESTAMP = datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
 
@@ -709,11 +713,8 @@ def get_bom_service_licenses_invalid() -> Bom:
         Service(name='foo', licenses=get_invalid_license_repository())
     ])
 
-from inspect import isfunction, getmembers
-import sys
-
 
 all_get_bom_funct_valid = tuple(
-    (n,f) for n,f in getmembers(sys.modules[__name__], isfunction)
+    (n, f) for n, f in getmembers(sys.modules[__name__], isfunction)
     if n.startswith('get_bom_') and not n.endswith('_invalid')
 )
diff --git a/tests/test_component.py b/tests/test_component.py
index e89d42364..92c54c8c7 100644
--- a/tests/test_component.py
+++ b/tests/test_component.py
@@ -21,10 +21,10 @@
 # See https://github.com/package-url/packageurl-python/issues/65
 from packageurl import PackageURL
 
-from tests._data.models import get_component_setuptools_simple
 from cyclonedx.model import sha1sum
 from cyclonedx.model.component import Component
 from tests import OWN_DATA_DIRECTORY
+from tests._data.models import get_component_setuptools_simple
 
 
 class TestComponent(TestCase):
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index dba8845da..065dfdd20 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -23,13 +23,11 @@
 
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
-from cyclonedx.schema import SchemaVersion, OutputFormat
-
+from cyclonedx.schema import OutputFormat, SchemaVersion
+from cyclonedx.validation.json import JsonStrictValidator
 from tests import SnapshotCompareMixin
 from tests._data.models import all_get_bom_funct_valid, uuid_generator
 
-from cyclonedx.validation.json import JsonStrictValidator
-
 
 @ddt
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
@@ -39,8 +37,8 @@ class TestOutputJson(TestCase, SnapshotCompareMixin):
 
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion if sv not in [
-        SchemaVersion.V1_1, SchemaVersion.V1_0,
-    ]
+            SchemaVersion.V1_1, SchemaVersion.V1_0,
+        ]
     ))
     @unpack
     def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 9ed6edc05..a4e3c44d3 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -24,13 +24,11 @@
 
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
-from cyclonedx.schema import SchemaVersion, OutputFormat
-
+from cyclonedx.schema import OutputFormat, SchemaVersion
+from cyclonedx.validation.xml import XmlValidator
 from tests import SnapshotCompareMixin
 from tests._data.models import all_get_bom_funct_valid, uuid_generator
 
-from cyclonedx.validation.xml import XmlValidator
-
 
 @ddt
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
@@ -50,8 +48,6 @@ def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
         self.assertEqualSnapshot(xml, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.xml')
 
 
-
-
 @ddt
 class TestFunctionalBySchemaVersion(TestCase):
 

From 02a9a8e8bec6e4acec072725b8df2e829898c6bd Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 7 Oct 2023 08:42:15 +0200
Subject: [PATCH 06/22] invalid tests

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py         | 17 +++++++++++++++-
 tests/_data/models.py     | 12 +++++------
 tests/test_output_json.py | 43 ++++++++++++++++++++++++++++++++-------
 tests/test_output_xml.py  | 30 +++++++++++++++++++++------
 4 files changed, 81 insertions(+), 21 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index e3fc29ab2..c547ec661 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -19,6 +19,7 @@
 from os.path import join
 from typing import Any, List, Optional, TypeVar, Union
 from unittest import TestCase
+from uuid import UUID
 
 from sortedcontainers import SortedSet
 
@@ -54,7 +55,13 @@ def readSnapshot(cls, snapshot_name: str) -> str:
     def assertEqualSnapshot(self: Union[TestCase, 'SnapshotCompareMixin'], actual: str, snapshot_name: str) -> None:
         if RECREATE_SNAPSHOTS:
             self.writeSnapshot(snapshot_name, actual)
-        self.assertEqual(actual, self.readSnapshot(snapshot_name))
+        _omd = self.maxDiff
+        _omd = self.maxDiff
+        self.maxDiff = None
+        try:
+            self.assertEqual(actual, self.readSnapshot(snapshot_name))
+        finally:
+            self.maxDiff = _omd
 
 
 class DeepCompareMixin:
@@ -62,6 +69,7 @@ def assertDeepEqual(self: Union[TestCase, 'DeepCompareMixin'], first: Any, secon
                         msg: Optional[str] = None) -> None:
         """costly compare, but very verbose"""
         _omd = self.maxDiff
+        self.maxDiff = None
         try:
             self.maxDiff = None
             dd1 = self.__deepDict(first)
@@ -90,3 +98,10 @@ def reorder(items: List[_T], indexes: List[int]) -> List[_T]:
     for i in range(len(items)):
         reordered_items.append(items[indexes[i]])
     return reordered_items
+
+
+def uuid_generator(offset: int = 0, version: int = 4):
+    v = offset
+    while True:
+        v += 1
+        yield UUID(int=v, version=version)
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 8b6b8afa9..90f8bc2b1 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -104,13 +104,6 @@
 )
 
 
-def uuid_generator(offset: int = 0, version: int = 4):
-    v = offset
-    while True:
-        v += 1
-        yield UUID(int=v, version=version)
-
-
 BOM_SERIAL_NUMBER = UUID('1441d33a-e0fc-45b5-af3b-61ee52a88bac')
 BOM_TIMESTAMP = datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
 
@@ -718,3 +711,8 @@ def get_bom_service_licenses_invalid() -> Bom:
     (n, f) for n, f in getmembers(sys.modules[__name__], isfunction)
     if n.startswith('get_bom_') and not n.endswith('_invalid')
 )
+
+all_get_bom_funct_invalid = tuple(
+    (n, f) for n, f in getmembers(sys.modules[__name__], isfunction)
+    if n.startswith('get_bom_') and n.endswith('_invalid')
+)
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index 065dfdd20..b5b9c1cc9 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -19,35 +19,64 @@
 from unittest import TestCase
 from unittest.mock import Mock, patch
 
-from ddt import ddt, idata, named_data, unpack
+from ddt import ddt, idata, named_data, unpack, data
 
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.json import JsonStrictValidator
-from tests import SnapshotCompareMixin
-from tests._data.models import all_get_bom_funct_valid, uuid_generator
+from cyclonedx.exception import CycloneDxException
+from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
+from cyclonedx.exception.output import FormatNotSupportedException
+from tests import SnapshotCompareMixin, uuid_generator
+from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_invalid
 
 
 @ddt
-@patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
-@patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
 class TestOutputJson(TestCase, SnapshotCompareMixin):
 
+    @data(SchemaVersion.V1_1, SchemaVersion.V1_0,)
+    def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
+        outputterClass = BY_SCHEMA_VERSION[sv]
+        self.assertTrue(issubclass(outputterClass, Json))
+        outputter = outputterClass(Mock(spec=Bom))
+        with self.assertRaises(FormatNotSupportedException):
+            outputter.output_as_string()
+
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion if sv not in [
             SchemaVersion.V1_1, SchemaVersion.V1_0,
         ]
     ))
     @unpack
-    def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    @patch('cyclonedx.model.ThisTool._version', 'TESTING')
+    @patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
+    @patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
+    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
         bom = get_bom()
         json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = JsonStrictValidator(sv).validate_str(json)
         self.assertIsNone(errors)
         self.assertEqualSnapshot(json, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.json')
 
+    @named_data(*(
+        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion if sv not in [
+            SchemaVersion.V1_1, SchemaVersion.V1_0,
+        ]
+    ))
+    @unpack
+    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+        bom = get_bom()
+        outputter = BY_SCHEMA_VERSION[sv](bom)
+        with self.assertRaises(CycloneDxException) as error:
+            outputter.output_as_string()
+        if isinstance(error.exception, (
+            LicenseExpressionAlongWithOthersException,
+            UnknownComponentDependencyException,
+        )):
+            return None  # expected
+        raise error.exception
+
 
 @ddt
 class TestFunctionalBySchemaVersion(TestCase):
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index a4e3c44d3..9ade59683 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -26,27 +26,45 @@
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
-from tests import SnapshotCompareMixin
-from tests._data.models import all_get_bom_funct_valid, uuid_generator
+from cyclonedx.exception.model import UnknownComponentDependencyException, LicenseExpressionAlongWithOthersException
+from cyclonedx.exception import CycloneDxException
+from tests import SnapshotCompareMixin, uuid_generator
+from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_invalid
 
 
 @ddt
-@patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
-@patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
 class TestOutputXml(TestCase, SnapshotCompareMixin):
 
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion
     ))
     @unpack
-    def test(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    @patch('cyclonedx.model.ThisTool._version', 'TESTING')
+    @patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
+    @patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
+    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
         bom = get_bom()
         xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = XmlValidator(sv).validate_str(xml)
         self.assertIsNone(errors)
         self.assertEqualSnapshot(xml, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.xml')
 
+    @named_data(*(
+        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion
+    ))
+    @unpack
+    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+        bom = get_bom()
+        outputter = BY_SCHEMA_VERSION[sv](bom)
+        with self.assertRaises(CycloneDxException) as error:
+            outputter.output_as_string()
+        if isinstance(error.exception, (
+            LicenseExpressionAlongWithOthersException,
+            UnknownComponentDependencyException,
+        )):
+            return None  # expected
+        raise error.exception
+
 
 @ddt
 class TestFunctionalBySchemaVersion(TestCase):

From dde04f57cfe1d12c19ee407b55e0031a8a0ddfb5 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 7 Oct 2023 09:13:28 +0200
Subject: [PATCH 07/22] refatcor for easy testing

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/model/bom.py                        | 10 ++-
 cyclonedx/model/component.py                  |  3 +-
 cyclonedx/model/service.py                    |  3 +-
 cyclonedx/model/vulnerability.py              |  3 +-
 tests/__init__.py                             |  6 +-
 tests/_data/models.py                         | 15 ++--
 ...om_with_dependencies_unlinked-1.2.json.bin | 40 ++++++++++
 ...om_with_dependencies_unlinked-1.3.json.bin | 40 ++++++++++
 ...om_with_dependencies_unlinked-1.4.json.bin | 74 +++++++++++++++++++
 ...-get_bom_with_nested_services-1.2.json.bin | 12 +--
 ...-get_bom_with_nested_services-1.3.json.bin | 12 +--
 ...-get_bom_with_nested_services-1.4.json.bin | 12 +--
 ...get_bom_with_services_complex-1.2.json.bin |  8 +-
 ...get_bom_with_services_complex-1.3.json.bin |  8 +-
 ...get_bom_with_services_complex-1.4.json.bin |  8 +-
 ...-get_bom_with_services_simple-1.2.json.bin | 12 +--
 ...-get_bom_with_services_simple-1.3.json.bin | 12 +--
 ...-get_bom_with_services_simple-1.4.json.bin | 12 +--
 ...bom_with_dependencies_unlinked-1.0.xml.bin | 11 +++
 ...bom_with_dependencies_unlinked-1.1.xml.bin | 13 ++++
 ...bom_with_dependencies_unlinked-1.2.xml.bin | 28 +++++++
 ...bom_with_dependencies_unlinked-1.3.xml.bin | 28 +++++++
 ...bom_with_dependencies_unlinked-1.4.xml.bin | 54 ++++++++++++++
 ...l-get_bom_with_nested_services-1.2.xml.bin | 12 +--
 ...l-get_bom_with_nested_services-1.3.xml.bin | 12 +--
 ...l-get_bom_with_nested_services-1.4.xml.bin | 12 +--
 ...-get_bom_with_services_complex-1.2.xml.bin |  8 +-
 ...-get_bom_with_services_complex-1.3.xml.bin |  8 +-
 ...-get_bom_with_services_complex-1.4.xml.bin |  8 +-
 ...l-get_bom_with_services_simple-1.2.xml.bin | 12 +--
 ...l-get_bom_with_services_simple-1.3.xml.bin | 12 +--
 ...l-get_bom_with_services_simple-1.4.xml.bin | 12 +--
 tests/test_output_json.py                     | 19 +++--
 tests/test_output_xml.py                      | 15 ++--
 34 files changed, 422 insertions(+), 132 deletions(-)
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
 create mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin

diff --git a/cyclonedx/model/bom.py b/cyclonedx/model/bom.py
index 776fa8344..55a9bf932 100644
--- a/cyclonedx/model/bom.py
+++ b/cyclonedx/model/bom.py
@@ -18,7 +18,7 @@
 from datetime import datetime
 from itertools import chain
 from typing import TYPE_CHECKING, Iterable, Optional, Set, Union
-from uuid import UUID, uuid4
+from uuid import uuid4
 
 import serializable
 from sortedcontainers import SortedSet
@@ -51,6 +51,8 @@
 from .vulnerability import Vulnerability
 
 if TYPE_CHECKING:  # pragma: no cover
+    from uuid import UUID
+
     from packageurl import PackageURL
 
 
@@ -276,7 +278,7 @@ def from_parser(parser: BaseParser) -> 'Bom':
     def __init__(self, *, components: Optional[Iterable[Component]] = None,
                  services: Optional[Iterable[Service]] = None,
                  external_references: Optional[Iterable[ExternalReference]] = None,
-                 serial_number: Optional[UUID] = None, version: int = 1,
+                 serial_number: Optional['UUID'] = None, version: int = 1,
                  metadata: Optional[BomMetaData] = None,
                  dependencies: Optional[Iterable[Dependency]] = None,
                  vulnerabilities: Optional[Iterable[Vulnerability]] = None) -> None:
@@ -302,7 +304,7 @@ def __init__(self, *, components: Optional[Iterable[Component]] = None,
     @serializable.view(SchemaVersion1Dot3)
     @serializable.view(SchemaVersion1Dot4)
     @serializable.xml_attribute()
-    def serial_number(self) -> UUID:
+    def serial_number(self) -> 'UUID':
         """
         Unique UUID for this BOM
 
@@ -313,7 +315,7 @@ def serial_number(self) -> UUID:
         return self._serial_number
 
     @serial_number.setter
-    def serial_number(self, serial_number: UUID) -> None:
+    def serial_number(self, serial_number: 'UUID') -> None:
         self._serial_number = serial_number
 
     @property
diff --git a/cyclonedx/model/component.py b/cyclonedx/model/component.py
index 516e11b71..db9bc6fd7 100644
--- a/cyclonedx/model/component.py
+++ b/cyclonedx/model/component.py
@@ -19,7 +19,6 @@
 from enum import Enum
 from os.path import exists
 from typing import Any, Iterable, Optional, Set, Union
-from uuid import uuid4
 
 # See https://github.com/package-url/packageurl-python/issues/65
 import serializable
@@ -769,7 +768,7 @@ def __init__(self, *, name: str, type: ComponentType = ComponentType.LIBRARY,
         if isinstance(bom_ref, BomRef):
             self._bom_ref = bom_ref
         else:
-            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else str(uuid4()))
+            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else None)
         self.supplier = supplier
         self.author = author
         self.publisher = publisher
diff --git a/cyclonedx/model/service.py b/cyclonedx/model/service.py
index 16efea3a3..f681659a1 100644
--- a/cyclonedx/model/service.py
+++ b/cyclonedx/model/service.py
@@ -14,7 +14,6 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 from typing import Any, Iterable, Optional, Union
-from uuid import uuid4
 
 import serializable
 from sortedcontainers import SortedSet
@@ -66,7 +65,7 @@ def __init__(self, *, name: str, bom_ref: Optional[Union[str, BomRef]] = None,
         if isinstance(bom_ref, BomRef):
             self._bom_ref = bom_ref
         else:
-            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else str(uuid4()))
+            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else None)
         self.provider = provider
         self.group = group
         self.name = name
diff --git a/cyclonedx/model/vulnerability.py b/cyclonedx/model/vulnerability.py
index 004a28e18..53bcf453a 100644
--- a/cyclonedx/model/vulnerability.py
+++ b/cyclonedx/model/vulnerability.py
@@ -21,7 +21,6 @@
 from decimal import Decimal
 from enum import Enum
 from typing import Any, Iterable, Optional, Tuple, Union
-from uuid import uuid4
 
 import serializable
 from sortedcontainers import SortedSet
@@ -837,7 +836,7 @@ def __init__(self, *, bom_ref: Optional[Union[str, BomRef]] = None, id: Optional
         if isinstance(bom_ref, BomRef):
             self._bom_ref = bom_ref
         else:
-            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else str(uuid4()))
+            self._bom_ref = BomRef(value=str(bom_ref) if bom_ref else None)
         self.id = id
         self.source = source
         self.references = references or []  # type: ignore
diff --git a/tests/__init__.py b/tests/__init__.py
index c547ec661..d10850c7b 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -17,7 +17,7 @@
 
 from os import getenv, path
 from os.path import join
-from typing import Any, List, Optional, TypeVar, Union
+from typing import Any, Generator, List, Optional, TypeVar, Union
 from unittest import TestCase
 from uuid import UUID
 
@@ -43,7 +43,7 @@ def getSnapshotFile(snapshot_name: str) -> str:
         return join(SNAPSHOTS_DIRECTORY, f'{snapshot_name}.bin')
 
     @classmethod
-    def writeSnapshot(cls, snapshot_name: str, data: str):
+    def writeSnapshot(cls, snapshot_name: str, data: str) -> None:
         with open(cls.getSnapshotFile(snapshot_name), 'w') as s:
             s.write(data)
 
@@ -100,7 +100,7 @@ def reorder(items: List[_T], indexes: List[int]) -> List[_T]:
     return reordered_items
 
 
-def uuid_generator(offset: int = 0, version: int = 4):
+def uuid_generator(offset: int = 0, version: int = 4) -> Generator[UUID, None, None]:
     v = offset
     while True:
         v += 1
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 90f8bc2b1..6c38306a8 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -20,7 +20,7 @@
 from datetime import datetime, timezone
 from decimal import Decimal
 from inspect import getmembers, isfunction
-from typing import Any, Dict, List, Optional, ParamSpec, TypeVar
+from typing import Any, List, Optional
 from uuid import UUID
 
 # See https://github.com/package-url/packageurl-python/issues/65
@@ -46,6 +46,7 @@
     XsUri,
 )
 from cyclonedx.model.bom import Bom, BomMetaData
+from cyclonedx.model.bom_ref import BomRef
 from cyclonedx.model.component import (
     Commit,
     Component,
@@ -172,17 +173,21 @@ def get_bom_with_dependencies_hanging() -> Bom:
     return bom
 
 
-def get_bom_with_dependencies_invalid() -> Bom:
+def get_bom_with_dependencies_unlinked() -> Bom:
+    """generate a bom with an unlinked dependency.
+    it is expected that this is not an issue on output, that the unlined is just omitted
+    """
     c1 = get_component_setuptools_simple()
-    return _makeBom(components=[c1], dependencies=[Dependency(ref=c1.bom_ref)])
+    return _makeBom(components=[c1], dependencies=[Dependency(ref=BomRef('link-to-ref-not-in-document'))])
 
 
 def get_bom_with_metadata_component_and_dependencies() -> Bom:
-    bom = _makeBom(components=[get_component_toml_with_hashes_with_references()])
+    cs = get_component_toml_with_hashes_with_references()
+    bom = _makeBom(components=[cs])
     bom.metadata.component = get_component_setuptools_simple()
     bom.dependencies.add(
         Dependency(ref=bom.metadata.component.bom_ref, dependencies=[
-            Dependency(ref=get_component_toml_with_hashes_with_references().bom_ref)
+            Dependency(ref=cs.bom_ref)
         ])
     )
     return bom
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
new file mode 100644
index 000000000..5dc66dd42
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
@@ -0,0 +1,40 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "00000000-0000-4000-8000-000000000009"
+    },
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
new file mode 100644
index 000000000..59ea86020
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
@@ -0,0 +1,40 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "00000000-0000-4000-8000-000000000008"
+    },
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
new file mode 100644
index 000000000..759aaf5d3
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
@@ -0,0 +1,74 @@
+{
+  "components": [
+    {
+      "author": "Test Author",
+      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "licenses": [
+        {
+          "expression": "MIT License"
+        }
+      ],
+      "name": "setuptools",
+      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
+      "type": "library",
+      "version": "50.3.2"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "00000000-0000-4000-8000-000000000007"
+    },
+    {
+      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
+    }
+  ],
+  "metadata": {
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
+  },
+  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
+  "version": 1,
+  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4"
+}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
index 17e7f2060..436486b8a 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000009"
+      "ref": "00000000-0000-4000-8000-000000000014"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000009"
+      "ref": "00000000-0000-4000-8000-000000000015"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000009",
+      "bom-ref": "00000000-0000-4000-8000-000000000015",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -100,7 +100,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000007",
+          "bom-ref": "00000000-0000-4000-8000-000000000012",
           "name": "first-nested-service"
         }
       ],
@@ -108,11 +108,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000009",
+      "bom-ref": "00000000-0000-4000-8000-000000000014",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000008",
+          "bom-ref": "00000000-0000-4000-8000-000000000013",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
index fa0d1111d..c1e0aafe6 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000008"
+      "ref": "00000000-0000-4000-8000-000000000010"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000006"
+      "ref": "00000000-0000-4000-8000-000000000011"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000008",
+      "bom-ref": "00000000-0000-4000-8000-000000000011",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -116,7 +116,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000004",
+          "bom-ref": "00000000-0000-4000-8000-00000000000e",
           "name": "first-nested-service"
         }
       ],
@@ -124,11 +124,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000006",
+      "bom-ref": "00000000-0000-4000-8000-000000000010",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000005",
+          "bom-ref": "00000000-0000-4000-8000-00000000000f",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
index 8976e5a4e..8ebf91dd4 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000007"
+      "ref": "00000000-0000-4000-8000-00000000000c"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000003"
+      "ref": "00000000-0000-4000-8000-00000000000d"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000007",
+      "bom-ref": "00000000-0000-4000-8000-00000000000d",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -209,7 +209,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000001",
+          "bom-ref": "00000000-0000-4000-8000-00000000000a",
           "name": "first-nested-service"
         }
       ],
@@ -217,11 +217,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000003",
+      "bom-ref": "00000000-0000-4000-8000-00000000000c",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000100000002",
+          "bom-ref": "00000000-0000-4000-8000-00000000000b",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
index af395bff8..bdbce9f2e 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000c"
+      "ref": "00000000-0000-4000-8000-00000000001a"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000c"
+      "ref": "00000000-0000-4000-8000-00000000001b"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000c",
+      "bom-ref": "00000000-0000-4000-8000-00000000001b",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -77,7 +77,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000c",
+      "bom-ref": "00000000-0000-4000-8000-00000000001a",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
index 907b02b0e..523795f3f 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000b"
+      "ref": "00000000-0000-4000-8000-000000000018"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000b"
+      "ref": "00000000-0000-4000-8000-000000000019"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000b",
+      "bom-ref": "00000000-0000-4000-8000-000000000019",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -93,7 +93,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000b",
+      "bom-ref": "00000000-0000-4000-8000-000000000018",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
index 8f852ad7a..b2154b1e2 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000a"
+      "ref": "00000000-0000-4000-8000-000000000016"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000a"
+      "ref": "00000000-0000-4000-8000-000000000017"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000a",
+      "bom-ref": "00000000-0000-4000-8000-000000000017",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -186,7 +186,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000a",
+      "bom-ref": "00000000-0000-4000-8000-000000000016",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
index c5105a7aa..1c7d111c2 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000f"
+      "ref": "00000000-0000-4000-8000-000000000022"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000011"
+      "ref": "00000000-0000-4000-8000-000000000023"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000012"
+      "ref": "00000000-0000-4000-8000-000000000024"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000f",
+      "bom-ref": "00000000-0000-4000-8000-000000000024",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000011",
+      "bom-ref": "00000000-0000-4000-8000-000000000022",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000012",
+      "bom-ref": "00000000-0000-4000-8000-000000000023",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
index 5e176fe0e..1cc2acca3 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000e"
+      "ref": "00000000-0000-4000-8000-00000000001f"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000f"
+      "ref": "00000000-0000-4000-8000-000000000020"
     },
     {
-      "ref": "00000000-0000-4000-8000-000100000010"
+      "ref": "00000000-0000-4000-8000-000000000021"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000e",
+      "bom-ref": "00000000-0000-4000-8000-000000000021",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000f",
+      "bom-ref": "00000000-0000-4000-8000-00000000001f",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000100000010",
+      "bom-ref": "00000000-0000-4000-8000-000000000020",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
index 5e6388258..d08884d0a 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000d"
+      "ref": "00000000-0000-4000-8000-00000000001c"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000d"
+      "ref": "00000000-0000-4000-8000-00000000001d"
     },
     {
-      "ref": "00000000-0000-4000-8000-00010000000e"
+      "ref": "00000000-0000-4000-8000-00000000001e"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000d",
+      "bom-ref": "00000000-0000-4000-8000-00000000001e",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -63,11 +63,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000d",
+      "bom-ref": "00000000-0000-4000-8000-00000000001c",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00010000000e",
+      "bom-ref": "00000000-0000-4000-8000-00000000001d",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
new file mode 100644
index 000000000..961bb4798
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+  <components>
+    <component type="library">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+      <modified>false</modified>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
new file mode 100644
index 000000000..0b33bec2a
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
new file mode 100644
index 000000000..2971c25bb
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
@@ -0,0 +1,28 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
new file mode 100644
index 000000000..3d6d25626
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
@@ -0,0 +1,28 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000c"/>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin
new file mode 100644
index 000000000..d83365ab1
--- /dev/null
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin
@@ -0,0 +1,54 @@
+<?xml version="1.0" ?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
+  <metadata>
+    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
+  </metadata>
+  <components>
+    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
+      <author>Test Author</author>
+      <name>setuptools</name>
+      <version>50.3.2</version>
+      <licenses>
+        <expression>MIT License</expression>
+      </licenses>
+      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
+    </component>
+  </components>
+  <dependencies>
+    <dependency ref="00000000-0000-4000-8000-00000000000b"/>
+    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
+  </dependencies>
+</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
index c67179618..85f51e311 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000d">
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000001b">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -72,15 +72,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000100000007">
+        <service bom-ref="00000000-0000-4000-8000-000000000018">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000009">
+    <service bom-ref="00000000-0000-4000-8000-00000000001a">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000100000008">
+        <service bom-ref="00000000-0000-4000-8000-000000000019">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -105,8 +105,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
-    <dependency ref="00000000-0000-4000-8000-000100000009"/>
+    <dependency ref="00000000-0000-4000-8000-00000000001a"/>
+    <dependency ref="00000000-0000-4000-8000-00000000001b"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
index 8bf91d24f..51a6c32d9 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000c">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000017">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -79,15 +79,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000100000004">
+        <service bom-ref="00000000-0000-4000-8000-000000000014">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000006">
+    <service bom-ref="00000000-0000-4000-8000-000000000016">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000100000005">
+        <service bom-ref="00000000-0000-4000-8000-000000000015">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -112,8 +112,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000c"/>
-    <dependency ref="00000000-0000-4000-8000-000100000006"/>
+    <dependency ref="00000000-0000-4000-8000-000000000016"/>
+    <dependency ref="00000000-0000-4000-8000-000000000017"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
index 6ffef0d48..e6745bab6 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000b">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000013">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -105,7 +105,7 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000100000001">
+        <service bom-ref="00000000-0000-4000-8000-000000000010">
           <name>first-nested-service</name>
         </service>
       </services>
@@ -154,10 +154,10 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000003">
+    <service bom-ref="00000000-0000-4000-8000-000000000012">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000100000002">
+        <service bom-ref="00000000-0000-4000-8000-000000000011">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -182,8 +182,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000b"/>
-    <dependency ref="00000000-0000-4000-8000-000100000003"/>
+    <dependency ref="00000000-0000-4000-8000-000000000012"/>
+    <dependency ref="00000000-0000-4000-8000-000000000013"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
index d4ed97a1a..5c9007b27 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000012">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000029">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -52,13 +52,13 @@
         </reference>
       </externalReferences>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000012">
+    <service bom-ref="00000000-0000-4000-8000-000000000028">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000012"/>
-    <dependency ref="00000000-0000-4000-8000-000100000012"/>
+    <dependency ref="00000000-0000-4000-8000-000000000028"/>
+    <dependency ref="00000000-0000-4000-8000-000000000029"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
index d98d91eb5..d5fa7eb61 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000011">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000027">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -59,13 +59,13 @@
         <property name="key2">val2</property>
       </properties>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000011">
+    <service bom-ref="00000000-0000-4000-8000-000000000026">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000011"/>
-    <dependency ref="00000000-0000-4000-8000-000100000011"/>
+    <dependency ref="00000000-0000-4000-8000-000000000026"/>
+    <dependency ref="00000000-0000-4000-8000-000000000027"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
index 968efe928..96e19f9ec 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000010">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000025">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -129,13 +129,13 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000010">
+    <service bom-ref="00000000-0000-4000-8000-000000000024">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000010"/>
-    <dependency ref="00000000-0000-4000-8000-000100000010"/>
+    <dependency ref="00000000-0000-4000-8000-000000000024"/>
+    <dependency ref="00000000-0000-4000-8000-000000000025"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
index e8fc11f64..012ec1aac 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000017">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000036">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000100000019">
+    <service bom-ref="00000000-0000-4000-8000-000000000034">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00010000001a">
+    <service bom-ref="00000000-0000-4000-8000-000000000035">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000017"/>
-    <dependency ref="00000000-0000-4000-8000-000100000019"/>
-    <dependency ref="00000000-0000-4000-8000-00010000001a"/>
+    <dependency ref="00000000-0000-4000-8000-000000000034"/>
+    <dependency ref="00000000-0000-4000-8000-000000000035"/>
+    <dependency ref="00000000-0000-4000-8000-000000000036"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
index 56bc910b1..2370ac81d 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000016">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000033">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000100000017">
+    <service bom-ref="00000000-0000-4000-8000-000000000031">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000018">
+    <service bom-ref="00000000-0000-4000-8000-000000000032">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000016"/>
-    <dependency ref="00000000-0000-4000-8000-000100000017"/>
-    <dependency ref="00000000-0000-4000-8000-000100000018"/>
+    <dependency ref="00000000-0000-4000-8000-000000000031"/>
+    <dependency ref="00000000-0000-4000-8000-000000000032"/>
+    <dependency ref="00000000-0000-4000-8000-000000000033"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
index 870fce0e5..8fea90a62 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
@@ -35,22 +35,22 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000015">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000030">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000100000015">
+    <service bom-ref="00000000-0000-4000-8000-00000000002e">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000100000016">
+    <service bom-ref="00000000-0000-4000-8000-00000000002f">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000015"/>
-    <dependency ref="00000000-0000-4000-8000-000100000015"/>
-    <dependency ref="00000000-0000-4000-8000-000100000016"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002e"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002f"/>
+    <dependency ref="00000000-0000-4000-8000-000000000030"/>
   </dependencies>
 </bom>
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index b5b9c1cc9..53bf75c6a 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -15,21 +15,21 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
-from typing import Callable
+from typing import Any, Callable
 from unittest import TestCase
 from unittest.mock import Mock, patch
 
-from ddt import ddt, idata, named_data, unpack, data
+from ddt import data, ddt, idata, named_data, unpack
 
+from cyclonedx.exception import CycloneDxException
+from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
+from cyclonedx.exception.output import FormatNotSupportedException
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.json import JsonStrictValidator
-from cyclonedx.exception import CycloneDxException
-from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
-from cyclonedx.exception.output import FormatNotSupportedException
 from tests import SnapshotCompareMixin, uuid_generator
-from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_invalid
+from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
 
 @ddt
@@ -50,9 +50,8 @@ def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
     ))
     @unpack
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-    @patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
-    @patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
-    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
+    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **__: Any) -> None:
         bom = get_bom()
         json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = JsonStrictValidator(sv).validate_str(json)
@@ -65,7 +64,7 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) ->
         ]
     ))
     @unpack
-    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion) -> None:
         bom = get_bom()
         outputter = BY_SCHEMA_VERSION[sv](bom)
         with self.assertRaises(CycloneDxException) as error:
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 9ade59683..e24a08ed7 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -16,20 +16,20 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 
-from typing import Callable
+from typing import Any, Callable
 from unittest import TestCase
 from unittest.mock import Mock, patch
 
 from ddt import ddt, idata, named_data, unpack
 
+from cyclonedx.exception import CycloneDxException
+from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
-from cyclonedx.exception.model import UnknownComponentDependencyException, LicenseExpressionAlongWithOthersException
-from cyclonedx.exception import CycloneDxException
 from tests import SnapshotCompareMixin, uuid_generator
-from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_invalid
+from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
 
 @ddt
@@ -40,9 +40,8 @@ class TestOutputXml(TestCase, SnapshotCompareMixin):
     ))
     @unpack
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-    @patch('cyclonedx.model.component.uuid4', side_effect=uuid_generator(0))
-    @patch('cyclonedx.model.service.uuid4', side_effect=uuid_generator(2 ** 32))
-    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
+    def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **__: Any) -> None:
         bom = get_bom()
         xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = XmlValidator(sv).validate_str(xml)
@@ -53,7 +52,7 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) ->
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion
     ))
     @unpack
-    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_, **__) -> None:
+    def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion) -> None:
         bom = get_bom()
         outputter = BY_SCHEMA_VERSION[sv](bom)
         with self.assertRaises(CycloneDxException) as error:

From 82044c9c1ab353d12428fdc5dcf3620795c579c6 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 12:08:55 +0200
Subject: [PATCH 08/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_validation_json.py | 8 +++-----
 tests/test_validation_xml.py  | 6 ++----
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 45f06179e..db639a1f3 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -25,17 +25,15 @@
 from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.json import JsonStrictValidator, JsonValidator
-from tests import TESTDATA_DIRECTORY
+from tests import SCHEMA_TESTDATA_DIRECTORY
 
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'schemaTestData')
-
-UNSUPPORTED_SCHEMA_VERSIONS = (SchemaVersion.V1_0, SchemaVersion.V1_1,)
+UNSUPPORTED_SCHEMA_VERSIONS = {SchemaVersion.V1_0, SchemaVersion.V1_1, }
 
 
 def _dp(prefix: str) -> Generator:
     return (
         (sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS
-        for tf in iglob(join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.json'))
+        for tf in iglob(join(SCHEMA_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.json'))
     )
 
 
diff --git a/tests/test_validation_xml.py b/tests/test_validation_xml.py
index a08c932d7..c97ee6f7e 100644
--- a/tests/test_validation_xml.py
+++ b/tests/test_validation_xml.py
@@ -25,9 +25,7 @@
 from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
-from tests import TESTDATA_DIRECTORY
-
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'schemaTestData')
+from tests import SCHEMA_TESTDATA_DIRECTORY
 
 UNSUPPORTED_SCHEMA_VERSIONS = set()
 
@@ -35,7 +33,7 @@
 def _dp(prefix: str) -> Generator:
     return (
         (sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS
-        for tf in iglob(join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.xml'))
+        for tf in iglob(join(SCHEMA_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.xml'))
     )
 
 

From 3fdd12ab823f4004166f52efb54632ed3d7fadb4 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 12:43:09 +0200
Subject: [PATCH 09/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/model/bom.py            | 10 ++++------
 tests/test_e2e_environment.py     |  3 +--
 tests/test_model_bom_ref.py       |  2 +-
 tests/test_model_component.py     | 17 ++++++-----------
 tests/test_model_dependency.py    |  2 +-
 tests/test_model_issue.py         |  3 ++-
 tests/test_model_service.py       | 15 +++++++--------
 tests/test_model_vulnerability.py |  9 ++++-----
 8 files changed, 26 insertions(+), 35 deletions(-)

diff --git a/cyclonedx/model/bom.py b/cyclonedx/model/bom.py
index 55a9bf932..776fa8344 100644
--- a/cyclonedx/model/bom.py
+++ b/cyclonedx/model/bom.py
@@ -18,7 +18,7 @@
 from datetime import datetime
 from itertools import chain
 from typing import TYPE_CHECKING, Iterable, Optional, Set, Union
-from uuid import uuid4
+from uuid import UUID, uuid4
 
 import serializable
 from sortedcontainers import SortedSet
@@ -51,8 +51,6 @@
 from .vulnerability import Vulnerability
 
 if TYPE_CHECKING:  # pragma: no cover
-    from uuid import UUID
-
     from packageurl import PackageURL
 
 
@@ -278,7 +276,7 @@ def from_parser(parser: BaseParser) -> 'Bom':
     def __init__(self, *, components: Optional[Iterable[Component]] = None,
                  services: Optional[Iterable[Service]] = None,
                  external_references: Optional[Iterable[ExternalReference]] = None,
-                 serial_number: Optional['UUID'] = None, version: int = 1,
+                 serial_number: Optional[UUID] = None, version: int = 1,
                  metadata: Optional[BomMetaData] = None,
                  dependencies: Optional[Iterable[Dependency]] = None,
                  vulnerabilities: Optional[Iterable[Vulnerability]] = None) -> None:
@@ -304,7 +302,7 @@ def __init__(self, *, components: Optional[Iterable[Component]] = None,
     @serializable.view(SchemaVersion1Dot3)
     @serializable.view(SchemaVersion1Dot4)
     @serializable.xml_attribute()
-    def serial_number(self) -> 'UUID':
+    def serial_number(self) -> UUID:
         """
         Unique UUID for this BOM
 
@@ -315,7 +313,7 @@ def serial_number(self) -> 'UUID':
         return self._serial_number
 
     @serial_number.setter
-    def serial_number(self, serial_number: 'UUID') -> None:
+    def serial_number(self, serial_number: UUID) -> None:
         self._serial_number = serial_number
 
     @property
diff --git a/tests/test_e2e_environment.py b/tests/test_e2e_environment.py
index 3a7460ea2..78b918075 100644
--- a/tests/test_e2e_environment.py
+++ b/tests/test_e2e_environment.py
@@ -18,10 +18,10 @@
 import json
 from unittest import TestCase
 
-import pkg_resources
 from lxml import etree
 from packageurl import PackageURL
 
+from cyclonedx import __version__ as OUR_PACKAGE_VERSION
 from cyclonedx.model.bom import Bom
 from cyclonedx.model.component import Component
 from cyclonedx.output import OutputFormat, get_instance
@@ -29,7 +29,6 @@
 from cyclonedx.output.xml import Xml
 
 OUR_PACKAGE_NAME: str = 'cyclonedx-python-lib'
-OUR_PACKAGE_VERSION: str = pkg_resources.get_distribution(OUR_PACKAGE_NAME).version
 OUR_PACKAGE_AUTHOR: str = 'Paul Horton'
 
 
diff --git a/tests/test_model_bom_ref.py b/tests/test_model_bom_ref.py
index 955469bc3..40c7cef18 100644
--- a/tests/test_model_bom_ref.py
+++ b/tests/test_model_bom_ref.py
@@ -18,7 +18,7 @@
 from unittest import TestCase
 
 from cyclonedx.model.bom_ref import BomRef
-from tests.data import reorder
+from tests import reorder
 
 
 class TestBomRef(TestCase):
diff --git a/tests/test_model_component.py b/tests/test_model_component.py
index c48bb630c..d5adbb4cc 100644
--- a/tests/test_model_component.py
+++ b/tests/test_model_component.py
@@ -42,8 +42,8 @@
     Pedigree,
 )
 from cyclonedx.model.issue import IssueClassification, IssueType
-from tests.data import (
-    MOCK_UUID_7,
+from tests import reorder, uuid_generator
+from tests._data.models import (
     get_component_setuptools_simple,
     get_component_setuptools_simple_no_version,
     get_component_toml_with_hashes_with_references,
@@ -52,7 +52,6 @@
     get_pedigree_1,
     get_swid_1,
     get_swid_2,
-    reorder,
 )
 
 
@@ -105,14 +104,13 @@ def test_sort(self) -> None:
 
 class TestModelComponent(TestCase):
 
-    @patch('cyclonedx.model.component.uuid4', return_value=MOCK_UUID_7)
-    def test_empty_basic_component(self, mock_uuid: Mock) -> None:
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
+    def test_empty_basic_component(self, *_, **__) -> None:
         c = Component(name='test-component')
-        mock_uuid.assert_called()
         self.assertEqual(c.name, 'test-component')
         self.assertEqual(c.type, ComponentType.LIBRARY)
         self.assertIsNone(c.mime_type)
-        self.assertEqual(str(c.bom_ref), '6f266d1c-760f-4552-ae3b-41a9b74232fa')
+        self.assertEqual(str(c.bom_ref), '00000000-0000-4000-8000-000000000001')
         self.assertIsNone(c.supplier)
         self.assertIsNone(c.author)
         self.assertIsNone(c.publisher)
@@ -130,8 +128,7 @@ def test_empty_basic_component(self, mock_uuid: Mock) -> None:
         self.assertEqual(len(c.components), 0)
         self.assertEqual(len(c.get_all_nested_components(include_self=True)), 1)
 
-    @patch('cyclonedx.model.component.uuid4', return_value=MOCK_UUID_7)
-    def test_multiple_basic_components(self, mock_uuid: Mock) -> None:
+    def test_multiple_basic_components(self) -> None:
         c1 = Component(name='test-component')
         self.assertEqual(c1.name, 'test-component')
         self.assertIsNone(c1.version)
@@ -148,8 +145,6 @@ def test_multiple_basic_components(self, mock_uuid: Mock) -> None:
 
         self.assertNotEqual(c1, c2)
 
-        mock_uuid.assert_called()
-
     def test_external_references(self) -> None:
         c = Component(name='test-component')
         c.external_references.add(ExternalReference(
diff --git a/tests/test_model_dependency.py b/tests/test_model_dependency.py
index 165bcfca8..4439d6aa0 100644
--- a/tests/test_model_dependency.py
+++ b/tests/test_model_dependency.py
@@ -19,7 +19,7 @@
 
 from cyclonedx.model.bom_ref import BomRef
 from cyclonedx.model.dependency import Dependency
-from tests.data import reorder
+from tests import reorder
 
 
 class TestDependency(TestCase):
diff --git a/tests/test_model_issue.py b/tests/test_model_issue.py
index bc156169d..b7a127ae6 100644
--- a/tests/test_model_issue.py
+++ b/tests/test_model_issue.py
@@ -20,7 +20,8 @@
 from cyclonedx.exception.model import NoPropertiesProvidedException
 from cyclonedx.model import XsUri
 from cyclonedx.model.issue import IssueClassification, IssueType, IssueTypeSource
-from tests.data import get_issue_1, get_issue_2, reorder
+from tests import reorder
+from tests._data.models import get_issue_1, get_issue_2
 
 
 class TestModelIssueType(TestCase):
diff --git a/tests/test_model_service.py b/tests/test_model_service.py
index 588cf2d53..30c745650 100644
--- a/tests/test_model_service.py
+++ b/tests/test_model_service.py
@@ -19,17 +19,17 @@
 from unittest.mock import Mock, patch
 
 from cyclonedx.model.service import Service
-from tests.data import MOCK_UUID_8, MOCK_UUID_9, reorder
+from tests import reorder, uuid_generator
 
 
 class TestModelService(TestCase):
 
-    @patch('cyclonedx.model.service.uuid4', return_value=MOCK_UUID_8)
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
     def test_minimal_service(self, mock_uuid: Mock) -> None:
         s = Service(name='my-test-service')
         mock_uuid.assert_called()
         self.assertEqual(s.name, 'my-test-service')
-        self.assertEqual(str(s.bom_ref), str(MOCK_UUID_8))
+        self.assertEqual(str(s.bom_ref), '00000000-0000-4000-8000-000000000001')
         self.assertIsNone(s.provider)
         self.assertIsNone(s.group)
         self.assertIsNone(s.version)
@@ -44,16 +44,15 @@ def test_minimal_service(self, mock_uuid: Mock) -> None:
         self.assertFalse(s.release_notes)
         self.assertFalse(s.properties)
 
-    @patch('cyclonedx.model.service.uuid4', return_value=MOCK_UUID_9)
-    def test_service_with_services(self, mock_uuid: Mock) -> None:
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
+    def test_service_with_services(self, *_, **__) -> None:
         parent_service = Service(name='parent-service')
         parent_service.services = [
             Service(name='child-service-1'),
-            Service(name='child-service-2')
+            Service(name='child-service-2'),
         ]
-        mock_uuid.assert_called()
         self.assertEqual(parent_service.name, 'parent-service')
-        self.assertEqual(str(parent_service.bom_ref), str(MOCK_UUID_9))
+        self.assertEqual(str(parent_service.bom_ref), '00000000-0000-4000-8000-000000000001')
         self.assertIsNone(parent_service.provider)
         self.assertIsNone(parent_service.group)
         self.assertIsNone(parent_service.version)
diff --git a/tests/test_model_vulnerability.py b/tests/test_model_vulnerability.py
index 257b82a8b..482991adf 100644
--- a/tests/test_model_vulnerability.py
+++ b/tests/test_model_vulnerability.py
@@ -33,7 +33,7 @@
     VulnerabilitySeverity,
     VulnerabilitySource,
 )
-from tests.data import MOCK_UUID_10, reorder
+from tests import reorder, uuid_generator
 
 
 class TestModelVulnerability(TestCase):
@@ -167,11 +167,10 @@ def test_v_source_get_localised_vector_other_2(self) -> None:
             'SOMETHING_OR_OTHER'
         )
 
-    @patch('cyclonedx.model.vulnerability.uuid4', return_value=MOCK_UUID_10)
-    def test_empty_vulnerability(self, mock_uuid: Mock) -> None:
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
+    def test_empty_vulnerability(self, *_, **__) -> None:
         v = Vulnerability()
-        mock_uuid.assert_called()
-        self.assertEqual(str(v.bom_ref), str(MOCK_UUID_10))
+        self.assertEqual(str(v.bom_ref), '00000000-0000-4000-8000-000000000001')
         self.assertIsNone(v.id)
         self.assertIsNone(v.source)
         self.assertFalse(v.references)

From 2f701476d2e2d6ffd688a1aa5fa9979473f4dac0 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 12:49:07 +0200
Subject: [PATCH 10/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_real_world_examples.py | 23 +++++------------------
 1 file changed, 5 insertions(+), 18 deletions(-)

diff --git a/tests/test_real_world_examples.py b/tests/test_real_world_examples.py
index 795e38f4c..ee8773321 100644
--- a/tests/test_real_world_examples.py
+++ b/tests/test_real_world_examples.py
@@ -18,29 +18,16 @@
 import unittest
 from datetime import datetime
 from os.path import join
-from typing import cast
 from unittest.mock import patch
 
 from cyclonedx.model.bom import Bom
-from cyclonedx.schema import SchemaVersion
-from tests import TESTDATA_DIRECTORY
-
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
-
-
-def fixed_date_time() -> datetime:
-    return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
+from tests import OWN_DATA_DIRECTORY
 
 
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.bom.get_now_utc', fixed_date_time)
+@patch('cyclonedx.model.bom.get_now_utc', return_value=datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00'))
 class TestDeserializeeRealWorldExamples(unittest.TestCase):
 
-    def test_webgoat_6_1(self) -> None:
-        self._attempt_load_example(
-            schema_version=SchemaVersion.V1_4, fixture='webgoat-6.1.xml'
-        )
-
-    def _attempt_load_example(self, schema_version: SchemaVersion, fixture: str) -> None:
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_xml:
-            cast(Bom, Bom.from_xml(input_xml))
+    def test_webgoat_6_1(self, *_, **__) -> None:
+        with open(join(OWN_DATA_DIRECTORY, 'xml', '1.4', 'webgoat-6.1.xml')) as input_xml:
+            Bom.from_xml(input_xml)

From 6cf65de484727e275e2f6095f49a1a8d58eb244b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 13:08:40 +0200
Subject: [PATCH 11/22] fix: bom validation with invalid 1st level dependency

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/model/bom.py                        |  4 +-
 tests/_data/models.py                         |  4 +-
 ...om_with_dependencies_unlinked-1.2.json.bin |  2 +-
 ...om_with_dependencies_unlinked-1.3.json.bin |  2 +-
 ...om_with_dependencies_unlinked-1.4.json.bin |  2 +-
 ...-get_bom_with_nested_services-1.2.json.bin | 12 ++---
 ...-get_bom_with_nested_services-1.3.json.bin | 12 ++---
 ...-get_bom_with_nested_services-1.4.json.bin | 12 ++---
 ...get_bom_with_services_complex-1.2.json.bin |  8 +--
 ...get_bom_with_services_complex-1.3.json.bin |  8 +--
 ...get_bom_with_services_complex-1.4.json.bin |  8 +--
 ...-get_bom_with_services_simple-1.2.json.bin | 12 ++---
 ...-get_bom_with_services_simple-1.3.json.bin | 12 ++---
 ...-get_bom_with_services_simple-1.4.json.bin | 12 ++---
 ...bom_with_dependencies_unlinked-1.0.xml.bin | 11 ----
 ...bom_with_dependencies_unlinked-1.1.xml.bin | 13 -----
 ...bom_with_dependencies_unlinked-1.2.xml.bin | 28 ----------
 ...bom_with_dependencies_unlinked-1.3.xml.bin | 28 ----------
 ...bom_with_dependencies_unlinked-1.4.xml.bin | 54 -------------------
 ...l-get_bom_with_nested_services-1.2.xml.bin | 12 ++---
 ...l-get_bom_with_nested_services-1.3.xml.bin | 12 ++---
 ...l-get_bom_with_nested_services-1.4.xml.bin | 12 ++---
 ...-get_bom_with_services_complex-1.2.xml.bin |  8 +--
 ...-get_bom_with_services_complex-1.3.xml.bin |  8 +--
 ...-get_bom_with_services_complex-1.4.xml.bin |  8 +--
 ...l-get_bom_with_services_simple-1.2.xml.bin | 12 ++---
 ...l-get_bom_with_services_simple-1.3.xml.bin | 12 ++---
 ...l-get_bom_with_services_simple-1.4.xml.bin | 12 ++---
 28 files changed, 104 insertions(+), 236 deletions(-)
 delete mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
 delete mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
 delete mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
 delete mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
 delete mode 100644 tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin

diff --git a/cyclonedx/model/bom.py b/cyclonedx/model/bom.py
index 776fa8344..a46708572 100644
--- a/cyclonedx/model/bom.py
+++ b/cyclonedx/model/bom.py
@@ -552,7 +552,9 @@ def validate(self) -> bool:
         # 1. Make sure dependencies are all in this Bom.
         all_bom_refs = set(map(lambda c: c.bom_ref, self._get_all_components())) | set(
             map(lambda s: s.bom_ref, self.services))
-        all_dependency_bom_refs = set().union(*(d.dependencies_as_bom_refs() for d in self.dependencies))
+        all_dependency_bom_refs = set(chain((d.ref for d in self.dependencies),
+                                            chain.from_iterable(
+                                                d.dependencies_as_bom_refs() for d in self.dependencies)))
 
         dependency_diff = all_dependency_bom_refs - all_bom_refs
         if len(dependency_diff) > 0:
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 6c38306a8..5ad8c1379 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -173,9 +173,9 @@ def get_bom_with_dependencies_hanging() -> Bom:
     return bom
 
 
-def get_bom_with_dependencies_unlinked() -> Bom:
+def get_bom_with_dependencies_unlinked_invalid() -> Bom:
     """generate a bom with an unlinked dependency.
-    it is expected that this is not an issue on output, that the unlined is just omitted
+    it is expected to throw on output.
     """
     c1 = get_component_setuptools_simple()
     return _makeBom(components=[c1], dependencies=[Dependency(ref=BomRef('link-to-ref-not-in-document'))])
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
index 5dc66dd42..fc443416c 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
@@ -16,7 +16,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000009"
+      "ref": "link-to-ref-not-in-document"
     },
     {
       "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
index 59ea86020..b59edb26d 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
@@ -16,7 +16,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000008"
+      "ref": "link-to-ref-not-in-document"
     },
     {
       "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
index 759aaf5d3..8c3aa759e 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
@@ -16,7 +16,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000007"
+      "ref": "link-to-ref-not-in-document"
     },
     {
       "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
index 436486b8a..2725f6fd0 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000014"
+      "ref": "00000000-0000-4000-8000-000000000011"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000015"
+      "ref": "00000000-0000-4000-8000-000000000012"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000015",
+      "bom-ref": "00000000-0000-4000-8000-000000000012",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -100,7 +100,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-000000000012",
+          "bom-ref": "00000000-0000-4000-8000-00000000000f",
           "name": "first-nested-service"
         }
       ],
@@ -108,11 +108,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000014",
+      "bom-ref": "00000000-0000-4000-8000-000000000011",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000000000013",
+          "bom-ref": "00000000-0000-4000-8000-000000000010",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
index c1e0aafe6..399764eae 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000010"
+      "ref": "00000000-0000-4000-8000-00000000000d"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000011"
+      "ref": "00000000-0000-4000-8000-00000000000e"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000011",
+      "bom-ref": "00000000-0000-4000-8000-00000000000e",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -116,7 +116,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000e",
+          "bom-ref": "00000000-0000-4000-8000-00000000000b",
           "name": "first-nested-service"
         }
       ],
@@ -124,11 +124,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000010",
+      "bom-ref": "00000000-0000-4000-8000-00000000000d",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000f",
+          "bom-ref": "00000000-0000-4000-8000-00000000000c",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
index 8ebf91dd4..52ce5a6f8 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000c"
+      "ref": "00000000-0000-4000-8000-000000000009"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000000d"
+      "ref": "00000000-0000-4000-8000-00000000000a"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000d",
+      "bom-ref": "00000000-0000-4000-8000-00000000000a",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -209,7 +209,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000a",
+          "bom-ref": "00000000-0000-4000-8000-000000000007",
           "name": "first-nested-service"
         }
       ],
@@ -217,11 +217,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000000c",
+      "bom-ref": "00000000-0000-4000-8000-000000000009",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000b",
+          "bom-ref": "00000000-0000-4000-8000-000000000008",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
index bdbce9f2e..a34afb82d 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000001a"
+      "ref": "00000000-0000-4000-8000-000000000017"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001b"
+      "ref": "00000000-0000-4000-8000-000000000018"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000001b",
+      "bom-ref": "00000000-0000-4000-8000-000000000018",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -77,7 +77,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001a",
+      "bom-ref": "00000000-0000-4000-8000-000000000017",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
index 523795f3f..dc88c24d8 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000018"
+      "ref": "00000000-0000-4000-8000-000000000015"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000019"
+      "ref": "00000000-0000-4000-8000-000000000016"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000019",
+      "bom-ref": "00000000-0000-4000-8000-000000000016",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -93,7 +93,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000018",
+      "bom-ref": "00000000-0000-4000-8000-000000000015",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
index b2154b1e2..b097f3c87 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
@@ -1,10 +1,10 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000016"
+      "ref": "00000000-0000-4000-8000-000000000013"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000017"
+      "ref": "00000000-0000-4000-8000-000000000014"
     },
     {
       "ref": "my-specific-bom-ref-for-my-first-service"
@@ -12,7 +12,7 @@
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000017",
+      "bom-ref": "00000000-0000-4000-8000-000000000014",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -186,7 +186,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000016",
+      "bom-ref": "00000000-0000-4000-8000-000000000013",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
index 1c7d111c2..21fef6ec4 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000022"
+      "ref": "00000000-0000-4000-8000-00000000001f"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000023"
+      "ref": "00000000-0000-4000-8000-000000000020"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000024"
+      "ref": "00000000-0000-4000-8000-000000000021"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000024",
+      "bom-ref": "00000000-0000-4000-8000-000000000021",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000022",
+      "bom-ref": "00000000-0000-4000-8000-00000000001f",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000023",
+      "bom-ref": "00000000-0000-4000-8000-000000000020",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
index 1cc2acca3..121564255 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000001f"
+      "ref": "00000000-0000-4000-8000-00000000001c"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000020"
+      "ref": "00000000-0000-4000-8000-00000000001d"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000021"
+      "ref": "00000000-0000-4000-8000-00000000001e"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000021",
+      "bom-ref": "00000000-0000-4000-8000-00000000001e",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001f",
+      "bom-ref": "00000000-0000-4000-8000-00000000001c",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000020",
+      "bom-ref": "00000000-0000-4000-8000-00000000001d",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
index d08884d0a..0cb437e62 100644
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
+++ b/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000001c"
+      "ref": "00000000-0000-4000-8000-000000000019"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001d"
+      "ref": "00000000-0000-4000-8000-00000000001a"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001e"
+      "ref": "00000000-0000-4000-8000-00000000001b"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000001e",
+      "bom-ref": "00000000-0000-4000-8000-00000000001b",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -63,11 +63,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001c",
+      "bom-ref": "00000000-0000-4000-8000-000000000019",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001d",
+      "bom-ref": "00000000-0000-4000-8000-00000000001a",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
deleted file mode 100644
index 961bb4798..000000000
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.0.xml.bin
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-  <components>
-    <component type="library">
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-      <modified>false</modified>
-    </component>
-  </components>
-</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
deleted file mode 100644
index 0b33bec2a..000000000
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.1.xml.bin
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
-  <components>
-    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <licenses>
-        <expression>MIT License</expression>
-      </licenses>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-    </component>
-  </components>
-</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
deleted file mode 100644
index 2971c25bb..000000000
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.2.xml.bin
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
-  <metadata>
-    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-    <tools>
-      <tool>
-        <vendor>CycloneDX</vendor>
-        <name>cyclonedx-python-lib</name>
-        <version>TESTING</version>
-      </tool>
-    </tools>
-  </metadata>
-  <components>
-    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-      <author>Test Author</author>
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <licenses>
-        <expression>MIT License</expression>
-      </licenses>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-    </component>
-  </components>
-  <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
-    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-  </dependencies>
-</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
deleted file mode 100644
index 3d6d25626..000000000
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.3.xml.bin
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
-  <metadata>
-    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-    <tools>
-      <tool>
-        <vendor>CycloneDX</vendor>
-        <name>cyclonedx-python-lib</name>
-        <version>TESTING</version>
-      </tool>
-    </tools>
-  </metadata>
-  <components>
-    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-      <author>Test Author</author>
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <licenses>
-        <expression>MIT License</expression>
-      </licenses>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-    </component>
-  </components>
-  <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000c"/>
-    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-  </dependencies>
-</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin
deleted file mode 100644
index d83365ab1..000000000
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_unlinked-1.4.xml.bin
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
-  <metadata>
-    <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-    <tools>
-      <tool>
-        <vendor>CycloneDX</vendor>
-        <name>cyclonedx-python-lib</name>
-        <version>TESTING</version>
-        <externalReferences>
-          <reference type="build-system">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-          </reference>
-          <reference type="distribution">
-            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-          </reference>
-          <reference type="documentation">
-            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-          </reference>
-          <reference type="issue-tracker">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-          </reference>
-          <reference type="license">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-          </reference>
-          <reference type="release-notes">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-          </reference>
-          <reference type="vcs">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-          </reference>
-          <reference type="website">
-            <url>https://cyclonedx.org</url>
-          </reference>
-        </externalReferences>
-      </tool>
-    </tools>
-  </metadata>
-  <components>
-    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-      <author>Test Author</author>
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <licenses>
-        <expression>MIT License</expression>
-      </licenses>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-    </component>
-  </components>
-  <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000b"/>
-    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-  </dependencies>
-</bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
index 85f51e311..ff1d74f86 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000001b">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000016">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -72,15 +72,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000000000018">
+        <service bom-ref="00000000-0000-4000-8000-000000000013">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000001a">
+    <service bom-ref="00000000-0000-4000-8000-000000000015">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000000000019">
+        <service bom-ref="00000000-0000-4000-8000-000000000014">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -105,8 +105,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000001a"/>
-    <dependency ref="00000000-0000-4000-8000-00000000001b"/>
+    <dependency ref="00000000-0000-4000-8000-000000000015"/>
+    <dependency ref="00000000-0000-4000-8000-000000000016"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
index 51a6c32d9..f26f03609 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000017">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000012">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -79,15 +79,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000000000014">
+        <service bom-ref="00000000-0000-4000-8000-00000000000f">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000016">
+    <service bom-ref="00000000-0000-4000-8000-000000000011">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000000000015">
+        <service bom-ref="00000000-0000-4000-8000-000000000010">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -112,8 +112,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000016"/>
-    <dependency ref="00000000-0000-4000-8000-000000000017"/>
+    <dependency ref="00000000-0000-4000-8000-000000000011"/>
+    <dependency ref="00000000-0000-4000-8000-000000000012"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
index e6745bab6..60ffe5fe5 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000013">
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000e">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -105,7 +105,7 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000000000010">
+        <service bom-ref="00000000-0000-4000-8000-00000000000b">
           <name>first-nested-service</name>
         </service>
       </services>
@@ -154,10 +154,10 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000012">
+    <service bom-ref="00000000-0000-4000-8000-00000000000d">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000000000011">
+        <service bom-ref="00000000-0000-4000-8000-00000000000c">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -182,8 +182,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000012"/>
-    <dependency ref="00000000-0000-4000-8000-000000000013"/>
+    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
+    <dependency ref="00000000-0000-4000-8000-00000000000e"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
index 5c9007b27..6fe3ca84b 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000029">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000024">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -52,13 +52,13 @@
         </reference>
       </externalReferences>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000028">
+    <service bom-ref="00000000-0000-4000-8000-000000000023">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000028"/>
-    <dependency ref="00000000-0000-4000-8000-000000000029"/>
+    <dependency ref="00000000-0000-4000-8000-000000000023"/>
+    <dependency ref="00000000-0000-4000-8000-000000000024"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
index d5fa7eb61..d77acaf06 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000027">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000022">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -59,13 +59,13 @@
         <property name="key2">val2</property>
       </properties>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000026">
+    <service bom-ref="00000000-0000-4000-8000-000000000021">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000026"/>
-    <dependency ref="00000000-0000-4000-8000-000000000027"/>
+    <dependency ref="00000000-0000-4000-8000-000000000021"/>
+    <dependency ref="00000000-0000-4000-8000-000000000022"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
index 96e19f9ec..b0d0a3260 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000025">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000020">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -129,13 +129,13 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000024">
+    <service bom-ref="00000000-0000-4000-8000-00000000001f">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000024"/>
-    <dependency ref="00000000-0000-4000-8000-000000000025"/>
+    <dependency ref="00000000-0000-4000-8000-00000000001f"/>
+    <dependency ref="00000000-0000-4000-8000-000000000020"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
index 012ec1aac..0c4c323e7 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000036">
+    <component type="library" bom-ref="00000000-0000-4000-8000-000000000031">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000000000034">
+    <service bom-ref="00000000-0000-4000-8000-00000000002f">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000035">
+    <service bom-ref="00000000-0000-4000-8000-000000000030">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000034"/>
-    <dependency ref="00000000-0000-4000-8000-000000000035"/>
-    <dependency ref="00000000-0000-4000-8000-000000000036"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002f"/>
+    <dependency ref="00000000-0000-4000-8000-000000000030"/>
+    <dependency ref="00000000-0000-4000-8000-000000000031"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
index 2370ac81d..626ad4de7 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000033">
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000002e">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000000000031">
+    <service bom-ref="00000000-0000-4000-8000-00000000002c">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000032">
+    <service bom-ref="00000000-0000-4000-8000-00000000002d">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000031"/>
-    <dependency ref="00000000-0000-4000-8000-000000000032"/>
-    <dependency ref="00000000-0000-4000-8000-000000000033"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002c"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002d"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002e"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
index 8fea90a62..fa4f96757 100644
--- a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
+++ b/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
@@ -35,22 +35,22 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000030">
+    <component type="library" bom-ref="00000000-0000-4000-8000-00000000002b">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-00000000002e">
+    <service bom-ref="00000000-0000-4000-8000-000000000029">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000002f">
+    <service bom-ref="00000000-0000-4000-8000-00000000002a">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000002e"/>
-    <dependency ref="00000000-0000-4000-8000-00000000002f"/>
-    <dependency ref="00000000-0000-4000-8000-000000000030"/>
+    <dependency ref="00000000-0000-4000-8000-000000000029"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002a"/>
+    <dependency ref="00000000-0000-4000-8000-00000000002b"/>
   </dependencies>
 </bom>

From aafe2f972f792cafce9ce470f47b9640324f3c71 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 13:20:44 +0200
Subject: [PATCH 12/22] tidy

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_model_component.py     | 6 +++---
 tests/test_model_service.py       | 4 ++--
 tests/test_model_vulnerability.py | 5 +++--
 tests/test_real_world_examples.py | 3 ++-
 4 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/tests/test_model_component.py b/tests/test_model_component.py
index d5adbb4cc..ccee271e0 100644
--- a/tests/test_model_component.py
+++ b/tests/test_model_component.py
@@ -16,9 +16,9 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 import datetime
-from typing import List
+from typing import Any, List
 from unittest import TestCase
-from unittest.mock import Mock, patch
+from unittest.mock import patch
 
 from cyclonedx.exception.model import NoPropertiesProvidedException
 from cyclonedx.model import (
@@ -105,7 +105,7 @@ def test_sort(self) -> None:
 class TestModelComponent(TestCase):
 
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
-    def test_empty_basic_component(self, *_, **__) -> None:
+    def test_empty_basic_component(self, *_: Any, **__: Any) -> None:
         c = Component(name='test-component')
         self.assertEqual(c.name, 'test-component')
         self.assertEqual(c.type, ComponentType.LIBRARY)
diff --git a/tests/test_model_service.py b/tests/test_model_service.py
index 30c745650..3b677961f 100644
--- a/tests/test_model_service.py
+++ b/tests/test_model_service.py
@@ -14,7 +14,7 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
-
+from typing import Any
 from unittest import TestCase
 from unittest.mock import Mock, patch
 
@@ -45,7 +45,7 @@ def test_minimal_service(self, mock_uuid: Mock) -> None:
         self.assertFalse(s.properties)
 
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
-    def test_service_with_services(self, *_, **__) -> None:
+    def test_service_with_services(self, *_: Any, **__: Any) -> None:
         parent_service = Service(name='parent-service')
         parent_service.services = [
             Service(name='child-service-1'),
diff --git a/tests/test_model_vulnerability.py b/tests/test_model_vulnerability.py
index 482991adf..50a6c03f5 100644
--- a/tests/test_model_vulnerability.py
+++ b/tests/test_model_vulnerability.py
@@ -17,8 +17,9 @@
 
 from datetime import datetime, timedelta
 from decimal import Decimal
+from typing import Any
 from unittest import TestCase
-from unittest.mock import Mock, patch
+from unittest.mock import patch
 
 from cyclonedx.model import XsUri
 from cyclonedx.model.impact_analysis import ImpactAnalysisAffectedStatus
@@ -168,7 +169,7 @@ def test_v_source_get_localised_vector_other_2(self) -> None:
         )
 
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(version=4))
-    def test_empty_vulnerability(self, *_, **__) -> None:
+    def test_empty_vulnerability(self, *_: Any, **__: Any) -> None:
         v = Vulnerability()
         self.assertEqual(str(v.bom_ref), '00000000-0000-4000-8000-000000000001')
         self.assertIsNone(v.id)
diff --git a/tests/test_real_world_examples.py b/tests/test_real_world_examples.py
index ee8773321..c3351909f 100644
--- a/tests/test_real_world_examples.py
+++ b/tests/test_real_world_examples.py
@@ -18,6 +18,7 @@
 import unittest
 from datetime import datetime
 from os.path import join
+from typing import Any
 from unittest.mock import patch
 
 from cyclonedx.model.bom import Bom
@@ -28,6 +29,6 @@
 @patch('cyclonedx.model.bom.get_now_utc', return_value=datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00'))
 class TestDeserializeeRealWorldExamples(unittest.TestCase):
 
-    def test_webgoat_6_1(self, *_, **__) -> None:
+    def test_webgoat_6_1(self, *_: Any, **__: Any) -> None:
         with open(join(OWN_DATA_DIRECTORY, 'xml', '1.4', 'webgoat-6.1.xml')) as input_xml:
             Bom.from_xml(input_xml)

From e78a25e7d3dd041b25f84887f0276ddd7cb97476 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 17:28:52 +0200
Subject: [PATCH 13/22] consolidate snapshot names

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/schema/__init__.py |  3 +++
 tests/__init__.py            | 13 +++++++++++++
 tests/test_output_json.py    | 26 +++++++++++++-------------
 tests/test_output_xml.py     |  4 ++--
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/cyclonedx/schema/__init__.py b/cyclonedx/schema/__init__.py
index 9c592c252..ef2a696fe 100644
--- a/cyclonedx/schema/__init__.py
+++ b/cyclonedx/schema/__init__.py
@@ -32,6 +32,9 @@ class OutputFormat(Enum):
     def __hash__(self) -> int:
         return hash(self.name)
 
+    def __eq__(self, other: Any) -> bool:
+        return self is other
+
 
 _SV = TypeVar('_SV', bound='SchemaVersion')
 
diff --git a/tests/__init__.py b/tests/__init__.py
index d10850c7b..99756b2a3 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -23,6 +23,8 @@
 
 from sortedcontainers import SortedSet
 
+from cyclonedx.schema import OutputFormat, SchemaVersion
+
 _T = TypeVar('_T')
 
 _TESTDATA_DIRECTORY = path.join(path.dirname(__file__), '_data')
@@ -105,3 +107,14 @@ def uuid_generator(offset: int = 0, version: int = 4) -> Generator[UUID, None, N
     while True:
         v += 1
         yield UUID(int=v, version=version)
+
+
+_SNAME_EXT = {
+    OutputFormat.JSON: 'json',
+    OutputFormat.XML: 'xml',
+}
+
+
+def mksname(purpose: Union[Any], sv: SchemaVersion, f: OutputFormat) -> str:
+    purpose = purpose if isinstance(purpose, str) else purpose.__name__
+    return f'{purpose}-{sv.to_version()}.{_SNAME_EXT[f]}'
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index 53bf75c6a..747c17940 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -28,14 +28,16 @@
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.json import JsonStrictValidator
-from tests import SnapshotCompareMixin, uuid_generator
+from tests import SnapshotCompareMixin, mksname, uuid_generator
 from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
+UNSUPPORTED_SV = frozenset((SchemaVersion.V1_1, SchemaVersion.V1_0, ))
+
 
 @ddt
 class TestOutputJson(TestCase, SnapshotCompareMixin):
 
-    @data(SchemaVersion.V1_1, SchemaVersion.V1_0,)
+    @data(*UNSUPPORTED_SV)
     def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
         outputterClass = BY_SCHEMA_VERSION[sv]
         self.assertTrue(issubclass(outputterClass, Json))
@@ -43,11 +45,10 @@ def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
         with self.assertRaises(FormatNotSupportedException):
             outputter.output_as_string()
 
-    @named_data(*(
-        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion if sv not in [
-            SchemaVersion.V1_1, SchemaVersion.V1_0,
-        ]
-    ))
+    @named_data(*((f'{n}-{sv.to_version()}', gb, sv)
+                  for n, gb in all_get_bom_funct_valid
+                  for sv in SchemaVersion
+                  if sv not in UNSUPPORTED_SV))
     @unpack
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
@@ -56,13 +57,12 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **_
         json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = JsonStrictValidator(sv).validate_str(json)
         self.assertIsNone(errors)
-        self.assertEqualSnapshot(json, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.json')
+        self.assertEqualSnapshot(json, mksname(get_bom, sv, OutputFormat.JSON))
 
-    @named_data(*(
-        (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion if sv not in [
-            SchemaVersion.V1_1, SchemaVersion.V1_0,
-        ]
-    ))
+    @named_data(*((f'{n}-{sv.to_version()}', gb, sv)
+                  for n, gb in all_get_bom_funct_invalid
+                  for sv in SchemaVersion
+                  if sv not in UNSUPPORTED_SV))
     @unpack
     def test_invalid(self, get_bom: Callable[[], Bom], sv: SchemaVersion) -> None:
         bom = get_bom()
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index e24a08ed7..424843dfb 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -28,7 +28,7 @@
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
-from tests import SnapshotCompareMixin, uuid_generator
+from tests import SnapshotCompareMixin, mksname, uuid_generator
 from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
 
@@ -46,7 +46,7 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **_
         xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = XmlValidator(sv).validate_str(xml)
         self.assertIsNone(errors)
-        self.assertEqualSnapshot(xml, f'{self.__class__.__name__}-{get_bom.__name__}-{sv.to_version()}.xml')
+        self.assertEqualSnapshot(xml, mksname(get_bom, sv, OutputFormat.XML))
 
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion

From 19f541b8180452a2611c2768df7a3cce159c4bfa Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 17:29:51 +0200
Subject: [PATCH 14/22] move snapshot names

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 ...om_with_dependencies_unlinked-1.2.json.bin | 40 ----------
 ...om_with_dependencies_unlinked-1.3.json.bin | 40 ----------
 ...om_with_dependencies_unlinked-1.4.json.bin | 74 -------------------
 ..._bom_for_issue_275_components-1.0.xml.bin} |  0
 ..._bom_for_issue_275_components-1.1.xml.bin} |  0
 ...bom_for_issue_275_components-1.2.json.bin} |  0
 ..._bom_for_issue_275_components-1.2.xml.bin} |  0
 ...bom_for_issue_275_components-1.3.json.bin} |  0
 ..._bom_for_issue_275_components-1.3.xml.bin} |  0
 ...bom_for_issue_275_components-1.4.json.bin} |  0
 ..._bom_for_issue_275_components-1.4.xml.bin} |  0
 ..._bom_for_issue_328_components-1.0.xml.bin} |  0
 ..._bom_for_issue_328_components-1.1.xml.bin} |  0
 ...bom_for_issue_328_components-1.2.json.bin} |  0
 ..._bom_for_issue_328_components-1.2.xml.bin} |  0
 ...bom_for_issue_328_components-1.3.json.bin} |  0
 ..._bom_for_issue_328_components-1.3.xml.bin} |  0
 ...bom_for_issue_328_components-1.4.json.bin} |  0
 ..._bom_for_issue_328_components-1.4.xml.bin} |  0
 ...et_bom_just_complete_metadata-1.0.xml.bin} |  0
 ...et_bom_just_complete_metadata-1.1.xml.bin} |  0
 ...t_bom_just_complete_metadata-1.2.json.bin} |  0
 ...et_bom_just_complete_metadata-1.2.xml.bin} |  0
 ...t_bom_just_complete_metadata-1.3.json.bin} |  0
 ...et_bom_just_complete_metadata-1.3.xml.bin} |  0
 ...t_bom_just_complete_metadata-1.4.json.bin} |  0
 ...et_bom_just_complete_metadata-1.4.xml.bin} |  0
 ...th_component_setuptools_basic-1.0.xml.bin} |  0
 ...th_component_setuptools_basic-1.1.xml.bin} |  0
 ...h_component_setuptools_basic-1.2.json.bin} |  0
 ...th_component_setuptools_basic-1.2.xml.bin} |  0
 ...h_component_setuptools_basic-1.3.json.bin} |  0
 ...th_component_setuptools_basic-1.3.xml.bin} |  0
 ...h_component_setuptools_basic-1.4.json.bin} |  0
 ...th_component_setuptools_basic-1.4.xml.bin} |  0
 ...component_setuptools_complete-1.0.xml.bin} |  0
 ...component_setuptools_complete-1.1.xml.bin} |  0
 ...omponent_setuptools_complete-1.2.json.bin} |  0
 ...component_setuptools_complete-1.2.xml.bin} |  0
 ...omponent_setuptools_complete-1.3.json.bin} |  0
 ...component_setuptools_complete-1.3.xml.bin} |  0
 ...omponent_setuptools_complete-1.4.json.bin} |  0
 ...component_setuptools_complete-1.4.xml.bin} |  0
 ...tuptools_no_component_version-1.0.xml.bin} |  0
 ...tuptools_no_component_version-1.1.xml.bin} |  0
 ...uptools_no_component_version-1.2.json.bin} |  0
 ...tuptools_no_component_version-1.2.xml.bin} |  0
 ...uptools_no_component_version-1.3.json.bin} |  0
 ...tuptools_no_component_version-1.3.xml.bin} |  0
 ...uptools_no_component_version-1.4.json.bin} |  0
 ...tuptools_no_component_version-1.4.xml.bin} |  0
 ...component_setuptools_with_cpe-1.0.xml.bin} |  0
 ...component_setuptools_with_cpe-1.1.xml.bin} |  0
 ...omponent_setuptools_with_cpe-1.2.json.bin} |  0
 ...component_setuptools_with_cpe-1.2.xml.bin} |  0
 ...omponent_setuptools_with_cpe-1.3.json.bin} |  0
 ...component_setuptools_with_cpe-1.3.xml.bin} |  0
 ...omponent_setuptools_with_cpe-1.4.json.bin} |  0
 ...component_setuptools_with_cpe-1.4.xml.bin} |  0
 ...setuptools_with_release_notes-1.0.xml.bin} |  0
 ...setuptools_with_release_notes-1.1.xml.bin} |  0
 ...etuptools_with_release_notes-1.2.json.bin} |  0
 ...setuptools_with_release_notes-1.2.xml.bin} |  0
 ...etuptools_with_release_notes-1.3.json.bin} |  0
 ...setuptools_with_release_notes-1.3.xml.bin} |  0
 ...etuptools_with_release_notes-1.4.json.bin} |  0
 ...setuptools_with_release_notes-1.4.xml.bin} |  0
 ...setuptools_with_vulnerability-1.0.xml.bin} |  0
 ...setuptools_with_vulnerability-1.1.xml.bin} |  0
 ...etuptools_with_vulnerability-1.2.json.bin} |  0
 ...setuptools_with_vulnerability-1.2.xml.bin} |  0
 ...etuptools_with_vulnerability-1.3.json.bin} |  0
 ...setuptools_with_vulnerability-1.3.xml.bin} |  0
 ...etuptools_with_vulnerability-1.4.json.bin} |  0
 ...setuptools_with_vulnerability-1.4.xml.bin} |  0
 ...get_bom_with_component_toml_1-1.0.xml.bin} |  0
 ...get_bom_with_component_toml_1-1.1.xml.bin} |  0
 ...et_bom_with_component_toml_1-1.2.json.bin} |  0
 ...get_bom_with_component_toml_1-1.2.xml.bin} |  0
 ...et_bom_with_component_toml_1-1.3.json.bin} |  0
 ...get_bom_with_component_toml_1-1.3.xml.bin} |  0
 ...et_bom_with_component_toml_1-1.4.json.bin} |  0
 ...get_bom_with_component_toml_1-1.4.xml.bin} |  0
 ...bom_with_dependencies_hanging-1.0.xml.bin} |  0
 ...bom_with_dependencies_hanging-1.1.xml.bin} |  0
 ...om_with_dependencies_hanging-1.2.json.bin} |  0
 ...bom_with_dependencies_hanging-1.2.xml.bin} |  0
 ...om_with_dependencies_hanging-1.3.json.bin} |  0
 ...bom_with_dependencies_hanging-1.3.xml.bin} |  0
 ...om_with_dependencies_hanging-1.4.json.bin} |  0
 ...bom_with_dependencies_hanging-1.4.xml.bin} |  0
 ...t_bom_with_dependencies_valid-1.0.xml.bin} |  0
 ...t_bom_with_dependencies_valid-1.1.xml.bin} |  0
 ..._bom_with_dependencies_valid-1.2.json.bin} |  0
 ...t_bom_with_dependencies_valid-1.2.xml.bin} |  0
 ..._bom_with_dependencies_valid-1.3.json.bin} |  0
 ...t_bom_with_dependencies_valid-1.3.xml.bin} |  0
 ..._bom_with_dependencies_valid-1.4.json.bin} |  0
 ...t_bom_with_dependencies_valid-1.4.xml.bin} |  0
 ..._bom_with_external_references-1.0.xml.bin} |  0
 ..._bom_with_external_references-1.1.xml.bin} |  0
 ...bom_with_external_references-1.2.json.bin} |  0
 ..._bom_with_external_references-1.2.xml.bin} |  0
 ...bom_with_external_references-1.3.json.bin} |  0
 ..._bom_with_external_references-1.3.xml.bin} |  0
 ...bom_with_external_references-1.4.json.bin} |  0
 ..._bom_with_external_references-1.4.xml.bin} |  0
 ...ta_component_and_dependencies-1.0.xml.bin} |  0
 ...ta_component_and_dependencies-1.1.xml.bin} |  0
 ...a_component_and_dependencies-1.2.json.bin} |  0
 ...ta_component_and_dependencies-1.2.xml.bin} |  0
 ...a_component_and_dependencies-1.3.json.bin} |  0
 ...ta_component_and_dependencies-1.3.xml.bin} |  0
 ...a_component_and_dependencies-1.4.json.bin} |  0
 ...ta_component_and_dependencies-1.4.xml.bin} |  0
 ... get_bom_with_nested_services-1.0.xml.bin} |  0
 ... get_bom_with_nested_services-1.1.xml.bin} |  0
 ...get_bom_with_nested_services-1.2.json.bin} |  0
 ... get_bom_with_nested_services-1.2.xml.bin} |  0
 ...get_bom_with_nested_services-1.3.json.bin} |  0
 ... get_bom_with_nested_services-1.3.xml.bin} |  0
 ...get_bom_with_nested_services-1.4.json.bin} |  0
 ... get_bom_with_nested_services-1.4.xml.bin} |  0
 ...get_bom_with_services_complex-1.0.xml.bin} |  0
 ...get_bom_with_services_complex-1.1.xml.bin} |  0
 ...et_bom_with_services_complex-1.2.json.bin} |  0
 ...get_bom_with_services_complex-1.2.xml.bin} |  0
 ...et_bom_with_services_complex-1.3.json.bin} |  0
 ...get_bom_with_services_complex-1.3.xml.bin} |  0
 ...et_bom_with_services_complex-1.4.json.bin} |  0
 ...get_bom_with_services_complex-1.4.xml.bin} |  0
 ... get_bom_with_services_simple-1.0.xml.bin} |  0
 ... get_bom_with_services_simple-1.1.xml.bin} |  0
 ...get_bom_with_services_simple-1.2.json.bin} |  0
 ... get_bom_with_services_simple-1.2.xml.bin} |  0
 ...get_bom_with_services_simple-1.3.json.bin} |  0
 ... get_bom_with_services_simple-1.3.xml.bin} |  0
 ...get_bom_with_services_simple-1.4.json.bin} |  0
 ... get_bom_with_services_simple-1.4.xml.bin} |  0
 139 files changed, 154 deletions(-)
 delete mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
 delete mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
 delete mode 100644 tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin => get_bom_for_issue_275_components-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin => get_bom_for_issue_275_components-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin => get_bom_for_issue_275_components-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin => get_bom_for_issue_275_components-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin => get_bom_for_issue_275_components-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin => get_bom_for_issue_275_components-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin => get_bom_for_issue_275_components-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin => get_bom_for_issue_275_components-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin => get_bom_for_issue_328_components-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin => get_bom_for_issue_328_components-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin => get_bom_for_issue_328_components-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin => get_bom_for_issue_328_components-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin => get_bom_for_issue_328_components-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin => get_bom_for_issue_328_components-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin => get_bom_for_issue_328_components-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin => get_bom_for_issue_328_components-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin => get_bom_just_complete_metadata-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin => get_bom_just_complete_metadata-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin => get_bom_just_complete_metadata-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin => get_bom_just_complete_metadata-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin => get_bom_just_complete_metadata-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin => get_bom_just_complete_metadata-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin => get_bom_just_complete_metadata-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin => get_bom_just_complete_metadata-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin => get_bom_with_component_setuptools_basic-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin => get_bom_with_component_setuptools_basic-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin => get_bom_with_component_setuptools_basic-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin => get_bom_with_component_setuptools_basic-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin => get_bom_with_component_setuptools_basic-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin => get_bom_with_component_setuptools_basic-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin => get_bom_with_component_setuptools_basic-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin => get_bom_with_component_setuptools_basic-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin => get_bom_with_component_setuptools_complete-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin => get_bom_with_component_setuptools_complete-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin => get_bom_with_component_setuptools_complete-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin => get_bom_with_component_setuptools_complete-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin => get_bom_with_component_setuptools_complete-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin => get_bom_with_component_setuptools_complete-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin => get_bom_with_component_setuptools_complete-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin => get_bom_with_component_setuptools_complete-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin => get_bom_with_component_setuptools_no_component_version-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin => get_bom_with_component_setuptools_no_component_version-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin => get_bom_with_component_setuptools_no_component_version-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin => get_bom_with_component_setuptools_no_component_version-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin => get_bom_with_component_setuptools_no_component_version-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin => get_bom_with_component_setuptools_no_component_version-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin => get_bom_with_component_setuptools_no_component_version-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin => get_bom_with_component_setuptools_no_component_version-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin => get_bom_with_component_setuptools_with_cpe-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin => get_bom_with_component_setuptools_with_cpe-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin => get_bom_with_component_setuptools_with_cpe-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin => get_bom_with_component_setuptools_with_cpe-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin => get_bom_with_component_setuptools_with_cpe-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin => get_bom_with_component_setuptools_with_cpe-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin => get_bom_with_component_setuptools_with_cpe-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin => get_bom_with_component_setuptools_with_cpe-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin => get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin => get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin => get_bom_with_component_setuptools_with_release_notes-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin => get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin => get_bom_with_component_setuptools_with_release_notes-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin => get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin => get_bom_with_component_setuptools_with_release_notes-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin => get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin => get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin => get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin => get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin => get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin => get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin => get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin => get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin => get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin => get_bom_with_component_toml_1-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin => get_bom_with_component_toml_1-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin => get_bom_with_component_toml_1-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin => get_bom_with_component_toml_1-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin => get_bom_with_component_toml_1-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin => get_bom_with_component_toml_1-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin => get_bom_with_component_toml_1-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin => get_bom_with_component_toml_1-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin => get_bom_with_dependencies_hanging-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin => get_bom_with_dependencies_hanging-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin => get_bom_with_dependencies_hanging-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin => get_bom_with_dependencies_hanging-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin => get_bom_with_dependencies_hanging-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin => get_bom_with_dependencies_hanging-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin => get_bom_with_dependencies_hanging-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin => get_bom_with_dependencies_hanging-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin => get_bom_with_dependencies_valid-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin => get_bom_with_dependencies_valid-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin => get_bom_with_dependencies_valid-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin => get_bom_with_dependencies_valid-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin => get_bom_with_dependencies_valid-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin => get_bom_with_dependencies_valid-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin => get_bom_with_dependencies_valid-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin => get_bom_with_dependencies_valid-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_external_references-1.0.xml.bin => get_bom_with_external_references-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_external_references-1.1.xml.bin => get_bom_with_external_references-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_external_references-1.2.json.bin => get_bom_with_external_references-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_external_references-1.2.xml.bin => get_bom_with_external_references-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_external_references-1.3.json.bin => get_bom_with_external_references-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_external_references-1.3.xml.bin => get_bom_with_external_references-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_external_references-1.4.json.bin => get_bom_with_external_references-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_external_references-1.4.xml.bin => get_bom_with_external_references-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin => get_bom_with_metadata_component_and_dependencies-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin => get_bom_with_metadata_component_and_dependencies-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin => get_bom_with_metadata_component_and_dependencies-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin => get_bom_with_metadata_component_and_dependencies-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin => get_bom_with_metadata_component_and_dependencies-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin => get_bom_with_metadata_component_and_dependencies-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin => get_bom_with_metadata_component_and_dependencies-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin => get_bom_with_metadata_component_and_dependencies-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_nested_services-1.0.xml.bin => get_bom_with_nested_services-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_nested_services-1.1.xml.bin => get_bom_with_nested_services-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_nested_services-1.2.json.bin => get_bom_with_nested_services-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_nested_services-1.2.xml.bin => get_bom_with_nested_services-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_nested_services-1.3.json.bin => get_bom_with_nested_services-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_nested_services-1.3.xml.bin => get_bom_with_nested_services-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_nested_services-1.4.json.bin => get_bom_with_nested_services-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_nested_services-1.4.xml.bin => get_bom_with_nested_services-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_complex-1.0.xml.bin => get_bom_with_services_complex-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_complex-1.1.xml.bin => get_bom_with_services_complex-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_complex-1.2.json.bin => get_bom_with_services_complex-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_complex-1.2.xml.bin => get_bom_with_services_complex-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_complex-1.3.json.bin => get_bom_with_services_complex-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_complex-1.3.xml.bin => get_bom_with_services_complex-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_complex-1.4.json.bin => get_bom_with_services_complex-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_complex-1.4.xml.bin => get_bom_with_services_complex-1.4.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_simple-1.0.xml.bin => get_bom_with_services_simple-1.0.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_simple-1.1.xml.bin => get_bom_with_services_simple-1.1.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_simple-1.2.json.bin => get_bom_with_services_simple-1.2.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_simple-1.2.xml.bin => get_bom_with_services_simple-1.2.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_simple-1.3.json.bin => get_bom_with_services_simple-1.3.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_simple-1.3.xml.bin => get_bom_with_services_simple-1.3.xml.bin} (100%)
 rename tests/_data/snapshots/{TestOutputJson-get_bom_with_services_simple-1.4.json.bin => get_bom_with_services_simple-1.4.json.bin} (100%)
 rename tests/_data/snapshots/{TestOutputXml-get_bom_with_services_simple-1.4.xml.bin => get_bom_with_services_simple-1.4.xml.bin} (100%)

diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
deleted file mode 100644
index fc443416c..000000000
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.2.json.bin
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "components": [
-    {
-      "author": "Test Author",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "name": "setuptools",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "type": "library",
-      "version": "50.3.2"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "link-to-ref-not-in-document"
-    },
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "name": "cyclonedx-python-lib",
-        "vendor": "CycloneDX",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
-  "version": 1,
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2"
-}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
deleted file mode 100644
index b59edb26d..000000000
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.3.json.bin
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "components": [
-    {
-      "author": "Test Author",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "name": "setuptools",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "type": "library",
-      "version": "50.3.2"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "link-to-ref-not-in-document"
-    },
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "name": "cyclonedx-python-lib",
-        "vendor": "CycloneDX",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
-  "version": 1,
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3"
-}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin b/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
deleted file mode 100644
index 8c3aa759e..000000000
--- a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_unlinked-1.4.json.bin
+++ /dev/null
@@ -1,74 +0,0 @@
-{
-  "components": [
-    {
-      "author": "Test Author",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "name": "setuptools",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "type": "library",
-      "version": "50.3.2"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "link-to-ref-not-in-document"
-    },
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "externalReferences": [
-          {
-            "type": "build-system",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
-          },
-          {
-            "type": "distribution",
-            "url": "https://pypi.org/project/cyclonedx-python-lib/"
-          },
-          {
-            "type": "documentation",
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
-          },
-          {
-            "type": "issue-tracker",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
-          },
-          {
-            "type": "license",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
-          },
-          {
-            "type": "release-notes",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
-          },
-          {
-            "type": "vcs",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
-          },
-          {
-            "type": "website",
-            "url": "https://cyclonedx.org"
-          }
-        ],
-        "name": "cyclonedx-python-lib",
-        "vendor": "CycloneDX",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
-  "version": 1,
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4"
-}
\ No newline at end of file
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.2.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.3.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_275_components-1.4.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin b/tests/_data/snapshots/get_bom_for_issue_275_components-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_275_components-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_275_components-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.2.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.3.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_for_issue_328_components-1.4.json.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_for_issue_328_components-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.2.json.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.3.json.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_just_complete_metadata-1.4.json.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_just_complete_metadata-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_basic-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_basic-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_basic-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_complete-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_complete-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_no_component_version-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_no_component_version-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_cpe-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_cpe-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_release_notes-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_setuptools_with_vulnerability-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_component_toml_1-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_toml_1-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_component_toml_1-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_component_toml_1-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_hanging-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_hanging-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_dependencies_valid-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_valid-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_dependencies_valid-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_dependencies_valid-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_external_references-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_external_references-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin b/tests/_data/snapshots/get_bom_with_external_references-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_external_references-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin b/tests/_data/snapshots/get_bom_with_external_references-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_external_references-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin b/tests/_data/snapshots/get_bom_with_external_references-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_external_references-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_external_references-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_external_references-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_external_references-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_metadata_component_and_dependencies-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_metadata_component_and_dependencies-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_nested_services-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_nested_services-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_complex-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_complex-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.0.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.0.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.0.xml.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.1.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.1.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.1.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.2.json.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.2.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.3.json.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.3.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin
diff --git a/tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputJson-get_bom_with_services_simple-1.4.json.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin
diff --git a/tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin
similarity index 100%
rename from tests/_data/snapshots/TestOutputXml-get_bom_with_services_simple-1.4.xml.bin
rename to tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin

From e15571107e22e481b1566a7200693e1a76351250 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 17:57:59 +0200
Subject: [PATCH 15/22] deserialize from snapshots

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py              |   6 +-
 tests/test_deserialize_json.py | 436 ++------------------
 tests/test_deserialize_xml.py  | 705 +--------------------------------
 tests/test_output_json.py      |   7 +-
 tests/test_output_xml.py       |   7 +-
 5 files changed, 56 insertions(+), 1105 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index 99756b2a3..c40f19dd0 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -38,7 +38,7 @@
     print('!!! WILL RECREATE ALL SNAPSHOTS !!!')
 
 
-class SnapshotCompareMixin:
+class SnapshotMixin:
 
     @staticmethod
     def getSnapshotFile(snapshot_name: str) -> str:
@@ -54,7 +54,7 @@ def readSnapshot(cls, snapshot_name: str) -> str:
         with open(cls.getSnapshotFile(snapshot_name), 'r') as s:
             return s.read()
 
-    def assertEqualSnapshot(self: Union[TestCase, 'SnapshotCompareMixin'], actual: str, snapshot_name: str) -> None:
+    def assertEqualSnapshot(self: Union[TestCase, 'SnapshotMixin'], actual: str, snapshot_name: str) -> None:
         if RECREATE_SNAPSHOTS:
             self.writeSnapshot(snapshot_name, actual)
         _omd = self.maxDiff
@@ -84,7 +84,7 @@ def __deepDict(self, o: Any) -> Any:
         if isinstance(o, (list, tuple)):
             return tuple(self.__deepDict(i) for i in o)
         if isinstance(o, dict):
-            return {k: self.__deepDict(v) for k, v in o}
+            return {k: self.__deepDict(v) for k, v in o.items()}
         if isinstance(o, (set, SortedSet)):
             return tuple(sorted((self.__deepDict(i) for i in o), key=repr))
         if hasattr(o, '__dict__'):
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 1f07252fb..9abb88819 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -14,419 +14,29 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
+from json import loads as json_loads
+from typing import Any, Callable
+from unittest import TestCase
+from unittest.mock import patch
 
-import json
-from datetime import datetime
-from os.path import join
-from typing import cast
-from unittest.mock import Mock, patch
-from uuid import UUID
+from ddt import ddt, named_data
 
 from cyclonedx.model.bom import Bom
-from cyclonedx.output import LATEST_SUPPORTED_SCHEMA_VERSION, OutputFormat, SchemaVersion, get_instance
-from tests import TESTDATA_DIRECTORY
-from tests.base import BaseJsonTestCase
-from tests.data import (
-    MOCK_BOM_UUID_1,
-    MOCK_BOM_UUID_2,
-    MOCK_UUID_1,
-    MOCK_UUID_2,
-    MOCK_UUID_3,
-    MOCK_UUID_4,
-    MOCK_UUID_5,
-    MOCK_UUID_6,
-    MOCK_UUID_7,
-    MOCK_UUID_8,
-    TEST_UUIDS,
-    get_bom_just_complete_metadata,
-    get_bom_with_component_setuptools_basic,
-    get_bom_with_component_setuptools_complete,
-    get_bom_with_component_setuptools_no_component_version,
-    get_bom_with_component_setuptools_with_cpe,
-    get_bom_with_component_setuptools_with_release_notes,
-    get_bom_with_component_setuptools_with_vulnerability,
-    get_bom_with_component_toml_1,
-    get_bom_with_dependencies_valid,
-    get_bom_with_external_references,
-    get_bom_with_nested_services,
-    get_bom_with_services_complex,
-    get_bom_with_services_simple,
-)
-
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'json')
-
-
-def fixed_date_time() -> datetime:
-    return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
-
-
-@patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.bom.get_now_utc', fixed_date_time)
-class TestOutputJson(BaseJsonTestCase):
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_4(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_external_references.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_3(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_external_references.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_2(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_external_references.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_4(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_3(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_2(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_4_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_3_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_2_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_with_cpe.json'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_4_full_component(self, mock1: Mock, mock2: Mock) -> None:
-        self.maxDiff = None
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock1.assert_called()
-        mock2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_3_full_component(self, mock1: Mock, mock2: Mock) -> None:
-        self.maxDiff = None
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock1.assert_called()
-        mock2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_2_full_component(self, mock1: Mock, mock2: Mock) -> None:
-        self.maxDiff = None
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_complete.json'
-        )
-        mock1.assert_called()
-        mock2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_7)
-    def test_bom_v1_4_component_hashes_external_references(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_toml_1.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_7)
-    def test_bom_v1_3_component_hashes_external_references(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_toml_1.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_7)
-    def test_bom_v1_2_component_hashes_external_references(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_toml_1.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_8)
-    def test_bom_v1_4_no_component_version(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_no_version.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_8)
-    def test_bom_v1_3_no_component_version(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_no_version.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_UUID_8)
-    def test_bom_v1_2_no_component_version(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_no_version.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_component_with_release_notes(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_release_notes.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_component_with_release_notes(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_component_with_vulnerability(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_vulnerabilities.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_component_with_vulnerability(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.json'
-        )
-        mock_1.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_1))
-    def test_bom_v1_4_with_metadata_component(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_2))
-    def test_bom_v1_3_with_metadata_component(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    def test_bom_v1_2_with_metadata_component(self, mock_1: Mock, mock_2: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_with_full_metadata.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_simple.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_complex.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_2)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_json_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_nested.json'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_dependencies(self, mock_1: Mock) -> None:
-        self._validate_json_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies.json'
-        )
-        mock_1.assert_called()
-    # --
-
-    # Helper methods
-    def _validate_json_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
-        bom.metadata.timestamp = fixed_date_time()
-        bom.validate()
-
-        if schema_version != LATEST_SUPPORTED_SCHEMA_VERSION:
-            # Rewind the BOM to only have data supported by the SchemaVersion in question
-            outputter = get_instance(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
-            bom = cast(Bom, Bom.from_json(data=json.loads(outputter.output_as_string())))
-
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_json:
-            deserialized_bom = cast(Bom, Bom.from_json(data=json.loads(input_json.read())))
-
-            self.assertEqual(bom.metadata, deserialized_bom.metadata)
-
-            # This comparison fails for Dependencies despite the SortedSet's being identical
-            # self.assertEqual(bom.dependencies, deserialized_bom.dependencies)
-            self.assertSetEqual(set(bom.dependencies), set(deserialized_bom.dependencies))
-
-            self.assertEqual(bom.vulnerabilities, deserialized_bom.vulnerabilities)
-
-            self.assertEqual(bom, deserialized_bom)
+from cyclonedx.schema import OutputFormat, SchemaVersion
+from tests import DeepCompareMixin, SnapshotMixin, mksname, uuid_generator
+from tests._data.models import all_get_bom_funct_valid
+
+
+@ddt
+class TestOutputJson(TestCase, SnapshotMixin, DeepCompareMixin):
+
+    @named_data(*all_get_bom_funct_valid)
+    @patch('cyclonedx.model.ThisTool._version', 'TESTING')
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
+    def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
+        # only latest schema will have all data populated in serialized form
+        snapshot_name = mksname(get_bom, SchemaVersion.V1_4, OutputFormat.JSON)
+        expected = get_bom()
+        json = json_loads(self.readSnapshot(snapshot_name))
+        bom = Bom.from_json(json)
+        self.assertDeepEqual(expected, bom)
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index 2b32ed95b..f38ddc760 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -14,689 +14,28 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
+from typing import Any, Callable
+from unittest import TestCase
+from unittest.mock import patch
 
-from datetime import datetime
-from io import StringIO
-from os.path import join
-from typing import cast
-from unittest.mock import Mock, patch
-from uuid import UUID
+from ddt import ddt, named_data
 
 from cyclonedx.model.bom import Bom
-from cyclonedx.output import LATEST_SUPPORTED_SCHEMA_VERSION, SchemaVersion, get_instance
-from cyclonedx.schema import OutputFormat
-from tests import TESTDATA_DIRECTORY
-from tests.base import BaseXmlTestCase
-from tests.data import (
-    MOCK_BOM_UUID_1,
-    MOCK_UUID_2,
-    MOCK_UUID_3,
-    MOCK_UUID_4,
-    MOCK_UUID_5,
-    MOCK_UUID_6,
-    TEST_UUIDS,
-    get_bom_for_issue_275_components,
-    get_bom_just_complete_metadata,
-    get_bom_with_component_setuptools_basic,
-    get_bom_with_component_setuptools_complete,
-    get_bom_with_component_setuptools_no_component_version,
-    get_bom_with_component_setuptools_with_cpe,
-    get_bom_with_component_setuptools_with_release_notes,
-    get_bom_with_component_setuptools_with_vulnerability,
-    get_bom_with_component_toml_1,
-    get_bom_with_dependencies_valid,
-    get_bom_with_external_references,
-    get_bom_with_metadata_component_and_dependencies,
-    get_bom_with_nested_services,
-    get_bom_with_services_complex,
-    get_bom_with_services_simple,
-)
-
-RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
-
-
-def fixed_date_time() -> datetime:
-    return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
-
-
-@patch('cyclonedx.model.ThisTool._version', 'TESTING')
-@patch('cyclonedx.model.bom.get_now_utc', fixed_date_time)
-class TestDeserializeXml(BaseXmlTestCase):
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_4(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_external_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_3(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_external_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_2(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_external_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_1(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_external_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_external_references_v1_0(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_external_references(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_empty.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_4(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_3(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_2(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_1(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_0(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_basic(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_4_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_3_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_2_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_1_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_simple_bom_v1_0_with_cpe(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_cpe(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_with_cpe.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_4_full_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_bom_uuid.assert_called()
-        mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    def test_bom_v1_3_full_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_bom_uuid.assert_called()
-        mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_2))
-    def test_bom_v1_2_full_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_bom_uuid.assert_called()
-        mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_1_full_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_bom_uuid.assert_called()
-        mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_0_full_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_complete(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_complete.xml'
-        )
-        mock_bom_uuid.assert_called()
-        mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_component_hashes_external_references(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_component_hashes_external_references(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_component_hashes_external_references(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_1_component_hashes_external_references(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_0_component_hashes_external_references(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_toml_1(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_toml_hashes_and_references.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_no_component_version(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_no_version.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_no_component_version(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools_no_version.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_no_component_version(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_setuptools_no_version.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_1_no_component_version(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools_no_version.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_0_no_component_version(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_no_component_version(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools_no_version.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_component_with_release_notes(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_release_notes.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_component_with_release_notes(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_release_notes(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_component_with_vulnerability(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_setuptools_with_vulnerabilities.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_component_with_vulnerability(self, mock_uuid: Mock) -> None:
-        with self.assertRaises(ValueError):
-            self._validate_xml_bom(
-                bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_setuptools_with_vulnerabilities.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_component_with_vulnerability(self, mock_uuid: Mock) -> None:
-        with self.assertRaises(ValueError):
-            self._validate_xml_bom(
-                bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_setuptools_with_vulnerabilities.xml'
-            )
-            mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_1_component_with_vulnerability(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_0_component_with_vulnerability(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_component_setuptools_with_vulnerability(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_setuptools.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_4_with_metadata_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_bom_uuid.assert_called()
-            mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_5))
-    def test_bom_v1_3_with_metadata_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_bom_uuid.assert_called()
-            mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    def test_bom_v1_2_with_metadata_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_with_full_metadata.xml'
-            )
-            mock_bom_uuid.assert_called()
-            mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_1_with_metadata_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_bom_uuid.assert_called()
-            mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    def test_bom_v1_0_with_metadata_component(self, mock_bom_uuid: Mock, mock_bom_ref_uuid: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_just_complete_metadata(), schema_version=SchemaVersion.V1_0,
-                fixture='bom_empty.xml'
-            )
-            mock_bom_uuid.assert_called()
-            mock_bom_ref_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_simple.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_1_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_3))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_0_services_simple(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_simple(), schema_version=SchemaVersion.V1_0,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_complex.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_4))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_1_services_complex(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_services_complex(), schema_version=SchemaVersion.V1_1,
-                fixture='bom_empty.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_4_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_4,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_3_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_3,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    @patch('cyclonedx.model.component.uuid4', return_value=UUID(MOCK_UUID_6))
-    @patch('cyclonedx.model.service.uuid4', side_effect=TEST_UUIDS)
-    def test_bom_v1_2_services_nested(self, mock_1: Mock, mock_2: Mock, mock_3: Mock) -> None:
-        with self.assertWarns(UserWarning):
-            self._validate_xml_bom(
-                bom=get_bom_with_nested_services(), schema_version=SchemaVersion.V1_2,
-                fixture='bom_services_nested.xml'
-            )
-            mock_1.assert_called()
-            mock_2.assert_called()
-            mock_3.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_dependencies(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_dependencies(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_dependencies(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_1_dependencies(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_dependencies_valid(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_dependencies.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_dependencies_for_bom_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_dependencies_component.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_dependencies_for_bom_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_dependencies_component.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_dependencies_for_bom_component(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_with_metadata_component_and_dependencies(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_dependencies_component.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_4_issue_275_components(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_4,
-            fixture='bom_issue_275_components.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_3_issue_275_components(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_3,
-            fixture='bom_issue_275_components.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_2_issue_275_components(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_2,
-            fixture='bom_issue_275_components.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_1_issue_275_components(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_1,
-            fixture='bom_issue_275_components.xml'
-        )
-        mock_uuid.assert_called()
-
-    @patch('cyclonedx.model.bom.uuid4', return_value=MOCK_BOM_UUID_1)
-    def test_bom_v1_0_issue_275_components(self, mock_uuid: Mock) -> None:
-        self._validate_xml_bom(
-            bom=get_bom_for_issue_275_components(), schema_version=SchemaVersion.V1_0,
-            fixture='bom_issue_275_components.xml'
-        )
-        mock_uuid.assert_called()
-
-    # Helper methods
-    def _validate_xml_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
-        bom.metadata.timestamp = fixed_date_time()
-        bom.validate()
-
-        if schema_version != LATEST_SUPPORTED_SCHEMA_VERSION:
-            # Rewind the BOM to only have data supported by the SchemaVersion in question
-            outputter = get_instance(bom=bom, output_format=OutputFormat.XML, schema_version=schema_version)
-            bom = cast(Bom, Bom.from_xml(StringIO(outputter.output_as_string())))
-
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_xml:
-            deserialized_bom = cast(Bom, Bom.from_xml(input_xml))
-
-            self.assertEqual(bom.metadata, deserialized_bom.metadata)
-
-            # This comparison fails for Dependencies despite the SortedSet's being identical
-            # print(bom.dependencies.difference(deserialized_bom.dependencies))
-            # self.assertEqual(bom.dependencies, deserialized_bom.dependencies)
-            # self.assertSetEqual(set(bom.dependencies), set(deserialized_bom.dependencies))
-
-            self.assertEqual(bom.vulnerabilities, deserialized_bom.vulnerabilities)
-            self.assertEqual(bom, deserialized_bom)
+from cyclonedx.schema import OutputFormat, SchemaVersion
+from tests import DeepCompareMixin, SnapshotMixin, mksname, uuid_generator
+from tests._data.models import all_get_bom_funct_valid
+
+
+@ddt
+class TestOutputJson(TestCase, SnapshotMixin, DeepCompareMixin):
+
+    @named_data(*all_get_bom_funct_valid)
+    @patch('cyclonedx.model.ThisTool._version', 'TESTING')
+    @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
+    def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
+        # only latest schema will have all data populated in serialized form
+        snapshot_name = mksname(get_bom, SchemaVersion.V1_4, OutputFormat.XML)
+        expected = get_bom()
+        with open(self.getSnapshotFile(snapshot_name), 'r') as s:
+            bom = Bom.from_xml(s)
+        self.assertDeepEqual(expected, bom)
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index 747c17940..23be22cc4 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -28,14 +28,14 @@
 from cyclonedx.output.json import BY_SCHEMA_VERSION, Json
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.json import JsonStrictValidator
-from tests import SnapshotCompareMixin, mksname, uuid_generator
+from tests import SnapshotMixin, mksname, uuid_generator
 from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
 UNSUPPORTED_SV = frozenset((SchemaVersion.V1_1, SchemaVersion.V1_0, ))
 
 
 @ddt
-class TestOutputJson(TestCase, SnapshotCompareMixin):
+class TestOutputJson(TestCase, SnapshotMixin):
 
     @data(*UNSUPPORTED_SV)
     def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
@@ -53,11 +53,12 @@ def test_unsupported_schema_raises(self, sv: SchemaVersion) -> None:
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
     def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **__: Any) -> None:
+        snapshot_name = mksname(get_bom, sv, OutputFormat.JSON)
         bom = get_bom()
         json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = JsonStrictValidator(sv).validate_str(json)
         self.assertIsNone(errors)
-        self.assertEqualSnapshot(json, mksname(get_bom, sv, OutputFormat.JSON))
+        self.assertEqualSnapshot(json, snapshot_name)
 
     @named_data(*((f'{n}-{sv.to_version()}', gb, sv)
                   for n, gb in all_get_bom_funct_invalid
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 424843dfb..d5b87825d 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -28,12 +28,12 @@
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
-from tests import SnapshotCompareMixin, mksname, uuid_generator
+from tests import SnapshotMixin, mksname, uuid_generator
 from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
 
 @ddt
-class TestOutputXml(TestCase, SnapshotCompareMixin):
+class TestOutputXml(TestCase, SnapshotMixin):
 
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_valid for sv in SchemaVersion
@@ -42,11 +42,12 @@ class TestOutputXml(TestCase, SnapshotCompareMixin):
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
     @patch('cyclonedx.model.bom_ref.uuid4', side_effect=uuid_generator(0, version=4))
     def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **__: Any) -> None:
+        snapshot_name = mksname(get_bom, sv, OutputFormat.XML)
         bom = get_bom()
         xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
         errors = XmlValidator(sv).validate_str(xml)
         self.assertIsNone(errors)
-        self.assertEqualSnapshot(xml, mksname(get_bom, sv, OutputFormat.XML))
+        self.assertEqualSnapshot(xml, snapshot_name)
 
     @named_data(*(
         (f'{n}-{sv.to_version()}', gb, sv) for n, gb in all_get_bom_funct_invalid for sv in SchemaVersion

From 2f3a4648110e42ad00f88e6c13e98151bda5c0a1 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 18:16:01 +0200
Subject: [PATCH 16/22] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py              | 9 ++++++---
 tests/test_deserialize_json.py | 2 ++
 tests/test_deserialize_xml.py  | 2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index c40f19dd0..eac750ac5 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -81,14 +81,17 @@ def assertDeepEqual(self: Union[TestCase, 'DeepCompareMixin'], first: Any, secon
             self.maxDiff = _omd
 
     def __deepDict(self, o: Any) -> Any:
-        if isinstance(o, (list, tuple)):
+        if isinstance(o, tuple):
             return tuple(self.__deepDict(i) for i in o)
+        if isinstance(o, list):
+            return list(self.__deepDict(i) for i in o)
         if isinstance(o, dict):
             return {k: self.__deepDict(v) for k, v in o.items()}
         if isinstance(o, (set, SortedSet)):
-            return tuple(sorted((self.__deepDict(i) for i in o), key=repr))
+            # this method returns dict. `dict` is not hashable, so use `list` instead.
+            return list(self.__deepDict(i) for i in o) + ['%conv:set%']
         if hasattr(o, '__dict__'):
-            return {k: self.__deepDict(v) for k, v in vars(o).items() if not (k.startswith('__') and k.endswith('__'))}
+            return {k: self.__deepDict(v) for k, v in vars(o).items() if '__' not in k}
         return o
 
 
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 9abb88819..9bcf96aa4 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
+
+
 from json import loads as json_loads
 from typing import Any, Callable
 from unittest import TestCase
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index f38ddc760..4af8c73e5 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
+
+
 from typing import Any, Callable
 from unittest import TestCase
 from unittest.mock import patch

From 37ff16bb6e450a3be6c587dbd2ba0610c271ef52 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 22:20:09 +0200
Subject: [PATCH 17/22] dings

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/model/component.py                  |  2 -
 cyclonedx/model/dependency.py                 |  2 +-
 tests/__init__.py                             | 26 ++++++++++--
 tests/_data/models.py                         | 40 ++++++++++++-------
 ..._bom_for_issue_328_components-1.2.json.bin | 15 +++++++
 ...t_bom_for_issue_328_components-1.2.xml.bin | 12 +++++-
 ..._bom_for_issue_328_components-1.3.json.bin | 15 +++++++
 ...t_bom_for_issue_328_components-1.3.xml.bin | 12 +++++-
 ..._bom_for_issue_328_components-1.4.json.bin | 15 +++++++
 ...t_bom_for_issue_328_components-1.4.xml.bin | 12 +++++-
 ...et_bom_just_complete_metadata-1.2.json.bin |  4 +-
 ...get_bom_just_complete_metadata-1.2.xml.bin |  4 +-
 ...et_bom_just_complete_metadata-1.3.json.bin |  4 +-
 ...get_bom_just_complete_metadata-1.3.xml.bin |  4 +-
 ...et_bom_just_complete_metadata-1.4.json.bin |  4 +-
 ...get_bom_just_complete_metadata-1.4.xml.bin |  4 +-
 ..._component_setuptools_complete-1.1.xml.bin |  2 +-
 ...component_setuptools_complete-1.2.json.bin |  4 +-
 ..._component_setuptools_complete-1.2.xml.bin |  4 +-
 ...component_setuptools_complete-1.3.json.bin |  4 +-
 ..._component_setuptools_complete-1.3.xml.bin |  4 +-
 ...component_setuptools_complete-1.4.json.bin |  4 +-
 ..._component_setuptools_complete-1.4.xml.bin |  4 +-
 .../get_bom_with_nested_services-1.2.json.bin | 14 +++----
 .../get_bom_with_nested_services-1.2.xml.bin  | 12 +++---
 .../get_bom_with_nested_services-1.3.json.bin | 14 +++----
 .../get_bom_with_nested_services-1.3.xml.bin  | 12 +++---
 .../get_bom_with_nested_services-1.4.json.bin | 14 +++----
 .../get_bom_with_nested_services-1.4.xml.bin  | 12 +++---
 ...get_bom_with_services_complex-1.2.json.bin | 10 ++---
 .../get_bom_with_services_complex-1.2.xml.bin |  8 ++--
 ...get_bom_with_services_complex-1.3.json.bin | 10 ++---
 .../get_bom_with_services_complex-1.3.xml.bin |  8 ++--
 ...get_bom_with_services_complex-1.4.json.bin | 10 ++---
 .../get_bom_with_services_complex-1.4.xml.bin |  8 ++--
 .../get_bom_with_services_simple-1.2.json.bin | 12 +++---
 .../get_bom_with_services_simple-1.2.xml.bin  | 12 +++---
 .../get_bom_with_services_simple-1.3.json.bin | 12 +++---
 .../get_bom_with_services_simple-1.3.xml.bin  | 12 +++---
 .../get_bom_with_services_simple-1.4.json.bin | 12 +++---
 .../get_bom_with_services_simple-1.4.xml.bin  | 12 +++---
 tests/test_deserialize_json.py                |  7 ++--
 tests/test_deserialize_xml.py                 |  7 ++--
 43 files changed, 259 insertions(+), 160 deletions(-)

diff --git a/cyclonedx/model/component.py b/cyclonedx/model/component.py
index db9bc6fd7..29e51eed5 100644
--- a/cyclonedx/model/component.py
+++ b/cyclonedx/model/component.py
@@ -808,8 +808,6 @@ def __init__(self, *, name: str, type: ComponentType = ComponentType.LIBRARY,
             if not licenses:
                 self.licenses = [LicenseChoice(expression=license_str)]  # type: ignore
 
-        self.__dependencies: "SortedSet[BomRef]" = SortedSet()
-
     @property
     @serializable.xml_attribute()
     def type(self) -> ComponentType:
diff --git a/cyclonedx/model/dependency.py b/cyclonedx/model/dependency.py
index 34155874f..317de1613 100644
--- a/cyclonedx/model/dependency.py
+++ b/cyclonedx/model/dependency.py
@@ -108,4 +108,4 @@ class Dependable(ABC):
     @property
     @abstractmethod
     def bom_ref(self) -> BomRef:
-        pass
+        ...
diff --git a/tests/__init__.py b/tests/__init__.py
index eac750ac5..00bda7920 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -17,7 +17,7 @@
 
 from os import getenv, path
 from os.path import join
-from typing import Any, Generator, List, Optional, TypeVar, Union
+from typing import Any, Generator, List, Optional, TypeVar, Union, TYPE_CHECKING, Callable
 from unittest import TestCase
 from uuid import UUID
 
@@ -25,6 +25,9 @@
 
 from cyclonedx.schema import OutputFormat, SchemaVersion
 
+if TYPE_CHECKING:
+    from cyclonedx.model.bom import Bom
+
 _T = TypeVar('_T')
 
 _TESTDATA_DIRECTORY = path.join(path.dirname(__file__), '_data')
@@ -89,11 +92,28 @@ def __deepDict(self, o: Any) -> Any:
             return {k: self.__deepDict(v) for k, v in o.items()}
         if isinstance(o, (set, SortedSet)):
             # this method returns dict. `dict` is not hashable, so use `list` instead.
-            return list(self.__deepDict(i) for i in o) + ['%conv:set%']
+            return tuple(self.__deepDict(i) for i in sorted(o, key=hash)) + ('%conv:%set',)
         if hasattr(o, '__dict__'):
-            return {k: self.__deepDict(v) for k, v in vars(o).items() if '__' not in k}
+            return {a: self.__deepDict(v) for a, v in o.__dict__.items() if '__' not in a
+                    } | {'%conv': str(type(o))}
         return o
 
+    def assertDeepEqualBom(self, expected: 'Bom', actual: 'Bom',
+                           msg: Optional[str] = None, *,
+                           fuzzy_deps: bool = True) -> None:
+        # deps might have been upgraded on serialization, so they might differ
+        edeps = expected.dependencies
+        adeps = actual.dependencies
+        if True or fuzzy_deps:
+            expected.dependencies = []
+            actual.dependencies = []
+        try:
+            self.assertDeepEqual(expected, actual, msg)
+            # do the fuzzy in deps
+        finally:
+            expected.dependencies = edeps
+            actual.dependencies = adeps
+
 
 def reorder(items: List[_T], indexes: List[int]) -> List[_T]:
     """
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 5ad8c1379..1140fa08c 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -212,12 +212,12 @@ def get_bom_with_component_setuptools_with_vulnerability() -> Bom:
         ],
         ratings=[
             VulnerabilityRating(
-                source=get_vulnerability_source_nvd(), score=Decimal(9.8), severity=VulnerabilitySeverity.CRITICAL,
+                source=get_vulnerability_source_nvd(), score=Decimal('9.8'), severity=VulnerabilitySeverity.CRITICAL,
                 method=VulnerabilityScoreSource.CVSS_V3,
                 vector='AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H', justification='Some justification'
             ),
             VulnerabilityRating(
-                source=get_vulnerability_source_owasp(), score=Decimal(2.7), severity=VulnerabilitySeverity.LOW,
+                source=get_vulnerability_source_owasp(), score=Decimal('2.7'), severity=VulnerabilitySeverity.LOW,
                 method=VulnerabilityScoreSource.CVSS_V3,
                 vector='AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N', justification='Some other justification'
             )
@@ -288,11 +288,12 @@ def get_bom_with_external_references() -> Bom:
 
 def get_bom_with_services_simple() -> Bom:
     bom = _makeBom(services=[
-        Service(name='my-first-service'),
-        Service(name='my-second-service')
+        Service(name='my-first-service', bom_ref='my-specific-bom-ref-for-my-first-service'),
+        Service(name='my-second-service', bom_ref='my-specific-bom-ref-for-my-second-service')
     ])
     bom.metadata.component = Component(
-        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY
+        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY,
+        bom_ref='my-specific-bom-ref-for-cpl'
     )
     return bom
 
@@ -318,10 +319,11 @@ def get_bom_with_services_complex() -> Bom:
             properties=get_properties_1(),
             release_notes=get_release_notes()
         ),
-        Service(name='my-second-service')
+        Service(name='my-second-service', bom_ref='my-specific-bom-ref-for-my-second-service')
     ])
     bom.metadata.component = Component(
-        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY
+        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY,
+        bom_ref='my-specific-bom-ref-for-cpl'
     )
     return bom
 
@@ -347,7 +349,7 @@ def get_bom_with_nested_services() -> Bom:
             properties=get_properties_1(),
             services=[
                 Service(
-                    name='first-nested-service'
+                    name='first-nested-service', bom_ref='my-specific-bom-ref-for-first-nested-service',
                 ),
                 Service(
                     name='second-nested-service', bom_ref='my-specific-bom-ref-for-second-nested-service',
@@ -359,6 +361,7 @@ def get_bom_with_nested_services() -> Bom:
         ),
         Service(
             name='my-second-service',
+            bom_ref='my-specific-bom-ref-for-my-second-service',
             services=[
                 Service(
                     name='yet-another-nested-service', provider=get_org_entity_1(), group='what-group', version='6.5.4'
@@ -371,7 +374,8 @@ def get_bom_with_nested_services() -> Bom:
         )
     ])
     bom.metadata.component = Component(
-        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY
+        name='cyclonedx-python-lib', version='1.0.0', type=ComponentType.LIBRARY,
+        bom_ref='my-specific-bom-ref-for-cpl'
     )
     return bom
 
@@ -421,6 +425,7 @@ def get_bom_for_issue_328_components() -> Bom:
     """regression test for issue #328
     see https://github.com/CycloneDX/cyclonedx-python-lib/issues/328
     """
+    bom = _makeBom()
 
     comp_root = Component(type=ComponentType.APPLICATION,
                           name='my-project', version='1', bom_ref='my-project')
@@ -431,19 +436,20 @@ def get_bom_for_issue_328_components() -> Bom:
     # Make a tree of components A -> B -> C
     comp_a.components = [comp_b]
     comp_b.components = [comp_c]
-    # Declare dependencies the same way: A -> B -> C
-    comp_a.dependencies = [comp_b.bom_ref]
-    comp_b.dependencies = [comp_c.bom_ref]
 
-    bom = _makeBom()
     bom.metadata.component = comp_root
-    comp_root.dependencies = [comp_a.bom_ref]
+    bom.register_dependency(comp_root, [comp_a])
     bom.components = [comp_a]
+
+    # Declare dependencies the same way: A -> B -> C
+    bom.register_dependency(comp_a, [comp_b])
+    bom.register_dependency(comp_b, [comp_c])
+
     return bom
 
 
 def get_component_setuptools_complete(include_pedigree: bool = True) -> Component:
-    component = get_component_setuptools_simple(bom_ref=None)
+    component = get_component_setuptools_simple(bom_ref='my-specific-bom-ref-for-dings')
     component.supplier = get_org_entity_1()
     component.publisher = 'CycloneDX'
     component.description = 'This component is awesome'
@@ -721,3 +727,7 @@ def get_bom_service_licenses_invalid() -> Bom:
     (n, f) for n, f in getmembers(sys.modules[__name__], isfunction)
     if n.startswith('get_bom_') and n.endswith('_invalid')
 )
+
+all_get_bom_funct_with_incomplete_deps = {
+
+}
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin
index 39c7b2cd9..80f814faa 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.json.bin
@@ -25,9 +25,24 @@
   ],
   "dependencies": [
     {
+      "dependsOn": [
+        "component-B"
+      ],
       "ref": "component-A"
     },
     {
+      "dependsOn": [
+        "component-C"
+      ],
+      "ref": "component-B"
+    },
+    {
+      "ref": "component-C"
+    },
+    {
+      "dependsOn": [
+        "component-A"
+      ],
       "ref": "my-project"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin
index 629294135..4e712c8c5 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.2.xml.bin
@@ -33,7 +33,15 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="component-A"/>
-    <dependency ref="my-project"/>
+    <dependency ref="component-A">
+      <dependency ref="component-B"/>
+    </dependency>
+    <dependency ref="component-B">
+      <dependency ref="component-C"/>
+    </dependency>
+    <dependency ref="component-C"/>
+    <dependency ref="my-project">
+      <dependency ref="component-A"/>
+    </dependency>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin
index 038380bc6..a4dce742d 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.json.bin
@@ -25,9 +25,24 @@
   ],
   "dependencies": [
     {
+      "dependsOn": [
+        "component-B"
+      ],
       "ref": "component-A"
     },
     {
+      "dependsOn": [
+        "component-C"
+      ],
+      "ref": "component-B"
+    },
+    {
+      "ref": "component-C"
+    },
+    {
+      "dependsOn": [
+        "component-A"
+      ],
       "ref": "my-project"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin
index c3e67d2c2..022354c04 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.3.xml.bin
@@ -33,7 +33,15 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="component-A"/>
-    <dependency ref="my-project"/>
+    <dependency ref="component-A">
+      <dependency ref="component-B"/>
+    </dependency>
+    <dependency ref="component-B">
+      <dependency ref="component-C"/>
+    </dependency>
+    <dependency ref="component-C"/>
+    <dependency ref="my-project">
+      <dependency ref="component-A"/>
+    </dependency>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin
index 13322afd4..a1ee1181a 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.json.bin
@@ -25,9 +25,24 @@
   ],
   "dependencies": [
     {
+      "dependsOn": [
+        "component-B"
+      ],
       "ref": "component-A"
     },
     {
+      "dependsOn": [
+        "component-C"
+      ],
+      "ref": "component-B"
+    },
+    {
+      "ref": "component-C"
+    },
+    {
+      "dependsOn": [
+        "component-A"
+      ],
       "ref": "my-project"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin
index a86555a64..d646d17d1 100644
--- a/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_for_issue_328_components-1.4.xml.bin
@@ -59,7 +59,15 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="component-A"/>
-    <dependency ref="my-project"/>
+    <dependency ref="component-A">
+      <dependency ref="component-B"/>
+    </dependency>
+    <dependency ref="component-B">
+      <dependency ref="component-C"/>
+    </dependency>
+    <dependency ref="component-C"/>
+    <dependency ref="my-project">
+      <dependency ref="component-A"/>
+    </dependency>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin
index befd43dd3..7233c3c12 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000003"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000003",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin
index d39fdc714..75b6733e3 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.2.xml.bin
@@ -20,7 +20,7 @@
         <email>paul.horton@owasp.org</email>
       </author>
     </authors>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000003">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -187,6 +187,6 @@
     </supplier>
   </metadata>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000003"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin
index dcd010ba4..1a720cf21 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000002"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000002",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin
index fd2e46d60..4b03243b0 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.3.xml.bin
@@ -20,7 +20,7 @@
         <email>paul.horton@owasp.org</email>
       </author>
     </authors>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000002">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -220,6 +220,6 @@
     </properties>
   </metadata>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000002"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin
index 8e583aece..60b9249af 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.json.bin
@@ -1,7 +1,7 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000001"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
@@ -18,7 +18,7 @@
     ],
     "component": {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000001",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
diff --git a/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin
index 772145066..98e51691d 100644
--- a/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_just_complete_metadata-1.4.xml.bin
@@ -46,7 +46,7 @@
         <email>paul.horton@owasp.org</email>
       </author>
     </authors>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000001">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -288,6 +288,6 @@
     </properties>
   </metadata>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000001"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin
index c20fbeed9..cf2184b05 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.1.xml.bin
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
   <components>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000009">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <publisher>CycloneDX</publisher>
       <name>setuptools</name>
       <version>50.3.2</version>
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin
index 80594a20c..9cf4af5be 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000006",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
@@ -202,7 +202,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000006"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin
index 52ce835d5..7c9f77b41 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.2.xml.bin
@@ -11,7 +11,7 @@
     </tools>
   </metadata>
   <components>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000008">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -156,6 +156,6 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000008"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin
index 727560925..cf2dc3e1f 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000005",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
@@ -246,7 +246,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000005"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin
index adbc02190..316f55629 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.3.xml.bin
@@ -11,7 +11,7 @@
     </tools>
   </metadata>
   <components>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000007">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -178,6 +178,6 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000007"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin
index b19ef072f..525c924c4 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.json.bin
@@ -2,7 +2,7 @@
   "components": [
     {
       "author": "Test Author",
-      "bom-ref": "00000000-0000-4000-8000-000000000004",
+      "bom-ref": "my-specific-bom-ref-for-dings",
       "components": [
         {
           "author": "Test Author",
@@ -303,7 +303,7 @@
   ],
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000004"
+      "ref": "my-specific-bom-ref-for-dings"
     }
   ],
   "metadata": {
diff --git a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin
index 85f5452a4..24b43c3f0 100644
--- a/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_component_setuptools_complete-1.4.xml.bin
@@ -37,7 +37,7 @@
     </tools>
   </metadata>
   <components>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000006">
+    <component type="library" bom-ref="my-specific-bom-ref-for-dings">
       <supplier>
         <name>CycloneDX</name>
         <url>https://cyclonedx.org</url>
@@ -246,6 +246,6 @@
     </component>
   </components>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000006"/>
+    <dependency ref="my-specific-bom-ref-for-dings"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin
index 2725f6fd0..ae3197b79 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.2.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000011"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000012"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000012",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -100,7 +100,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000f",
+          "bom-ref": "my-specific-bom-ref-for-first-nested-service",
           "name": "first-nested-service"
         }
       ],
@@ -108,11 +108,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000011",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000000000010",
+          "bom-ref": "00000000-0000-4000-8000-000000000003",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin
index ff1d74f86..e01e6b3ed 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000016">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -72,15 +72,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-000000000013">
+        <service bom-ref="my-specific-bom-ref-for-first-nested-service">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000015">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000000000014">
+        <service bom-ref="00000000-0000-4000-8000-000000000003">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -105,8 +105,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000015"/>
-    <dependency ref="00000000-0000-4000-8000-000000000016"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin
index 399764eae..9ab746dbf 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.3.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000000d"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000000e"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000e",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -116,7 +116,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000b",
+          "bom-ref": "my-specific-bom-ref-for-first-nested-service",
           "name": "first-nested-service"
         }
       ],
@@ -124,11 +124,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000000d",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-00000000000c",
+          "bom-ref": "00000000-0000-4000-8000-000000000002",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin
index f26f03609..00c1fd2b9 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000012">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -79,15 +79,15 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-00000000000f">
+        <service bom-ref="my-specific-bom-ref-for-first-nested-service">
           <name>first-nested-service</name>
         </service>
       </services>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000011">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-000000000010">
+        <service bom-ref="00000000-0000-4000-8000-000000000002">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -112,8 +112,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000011"/>
-    <dependency ref="00000000-0000-4000-8000-000000000012"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin
index 52ce5a6f8..be23872da 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.4.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000009"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000000a"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000000a",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -209,7 +209,7 @@
           "x-trust-boundary": false
         },
         {
-          "bom-ref": "00000000-0000-4000-8000-000000000007",
+          "bom-ref": "my-specific-bom-ref-for-first-nested-service",
           "name": "first-nested-service"
         }
       ],
@@ -217,11 +217,11 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000009",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service",
       "services": [
         {
-          "bom-ref": "00000000-0000-4000-8000-000000000008",
+          "bom-ref": "00000000-0000-4000-8000-000000000001",
           "group": "what-group",
           "name": "yet-another-nested-service",
           "provider": {
diff --git a/tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin
index 60ffe5fe5..986ed1589 100644
--- a/tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_nested_services-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000000e">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -105,7 +105,7 @@
           <authenticated>true</authenticated>
           <x-trust-boundary>false</x-trust-boundary>
         </service>
-        <service bom-ref="00000000-0000-4000-8000-00000000000b">
+        <service bom-ref="my-specific-bom-ref-for-first-nested-service">
           <name>first-nested-service</name>
         </service>
       </services>
@@ -154,10 +154,10 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000000d">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
       <services>
-        <service bom-ref="00000000-0000-4000-8000-00000000000c">
+        <service bom-ref="00000000-0000-4000-8000-000000000001">
           <provider>
             <name>CycloneDX</name>
             <url>https://cyclonedx.org</url>
@@ -182,8 +182,8 @@
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000000d"/>
-    <dependency ref="00000000-0000-4000-8000-00000000000e"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin
index a34afb82d..549dc40fc 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.2.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000017"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000018"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000018",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -77,7 +77,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000017",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin
index 6fe3ca84b..7e6b4b9f0 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.2.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000024">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -52,13 +52,13 @@
         </reference>
       </externalReferences>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000023">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000023"/>
-    <dependency ref="00000000-0000-4000-8000-000000000024"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin
index dc88c24d8..38ea8bb3f 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.3.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000015"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000016"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000016",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -93,7 +93,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000015",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin
index d77acaf06..3725a7257 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.3.xml.bin
@@ -9,7 +9,7 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000022">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -59,13 +59,13 @@
         <property name="key2">val2</property>
       </properties>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000021">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000021"/>
-    <dependency ref="00000000-0000-4000-8000-000000000022"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin
index b097f3c87..b4d58520e 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.4.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000013"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000014"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "my-specific-bom-ref-for-my-first-service"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000014",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -186,7 +186,7 @@
       "x-trust-boundary": true
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000013",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin
index b0d0a3260..bb4f4a0ff 100644
--- a/tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_complex-1.4.xml.bin
@@ -35,7 +35,7 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000020">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
@@ -129,13 +129,13 @@
         </properties>
       </releaseNotes>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000001f">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000001f"/>
-    <dependency ref="00000000-0000-4000-8000-000000000020"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
     <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin
index 21fef6ec4..e7562cebe 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.2.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000001f"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000020"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "00000000-0000-4000-8000-000000000021"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-000000000021",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001f",
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000020",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin
index 0c4c323e7..60db211e8 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.2.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-000000000031">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-00000000002f">
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-000000000030">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000002f"/>
-    <dependency ref="00000000-0000-4000-8000-000000000030"/>
-    <dependency ref="00000000-0000-4000-8000-000000000031"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin
index 121564255..4c2ea8b21 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.3.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-00000000001c"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001d"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001e"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000001e",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -29,11 +29,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001c",
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001d",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin
index 626ad4de7..08fcc576b 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.3.xml.bin
@@ -9,22 +9,22 @@
         <version>TESTING</version>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000002e">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-00000000002c">
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000002d">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-00000000002c"/>
-    <dependency ref="00000000-0000-4000-8000-00000000002d"/>
-    <dependency ref="00000000-0000-4000-8000-00000000002e"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin
index 0cb437e62..78ab58482 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.4.json.bin
@@ -1,18 +1,18 @@
 {
   "dependencies": [
     {
-      "ref": "00000000-0000-4000-8000-000000000019"
+      "ref": "my-specific-bom-ref-for-cpl"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001a"
+      "ref": "my-specific-bom-ref-for-my-first-service"
     },
     {
-      "ref": "00000000-0000-4000-8000-00000000001b"
+      "ref": "my-specific-bom-ref-for-my-second-service"
     }
   ],
   "metadata": {
     "component": {
-      "bom-ref": "00000000-0000-4000-8000-00000000001b",
+      "bom-ref": "my-specific-bom-ref-for-cpl",
       "name": "cyclonedx-python-lib",
       "type": "library",
       "version": "1.0.0"
@@ -63,11 +63,11 @@
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "services": [
     {
-      "bom-ref": "00000000-0000-4000-8000-000000000019",
+      "bom-ref": "my-specific-bom-ref-for-my-first-service",
       "name": "my-first-service"
     },
     {
-      "bom-ref": "00000000-0000-4000-8000-00000000001a",
+      "bom-ref": "my-specific-bom-ref-for-my-second-service",
       "name": "my-second-service"
     }
   ],
diff --git a/tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin
index fa4f96757..ed0a032df 100644
--- a/tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_services_simple-1.4.xml.bin
@@ -35,22 +35,22 @@
         </externalReferences>
       </tool>
     </tools>
-    <component type="library" bom-ref="00000000-0000-4000-8000-00000000002b">
+    <component type="library" bom-ref="my-specific-bom-ref-for-cpl">
       <name>cyclonedx-python-lib</name>
       <version>1.0.0</version>
     </component>
   </metadata>
   <services>
-    <service bom-ref="00000000-0000-4000-8000-000000000029">
+    <service bom-ref="my-specific-bom-ref-for-my-first-service">
       <name>my-first-service</name>
     </service>
-    <service bom-ref="00000000-0000-4000-8000-00000000002a">
+    <service bom-ref="my-specific-bom-ref-for-my-second-service">
       <name>my-second-service</name>
     </service>
   </services>
   <dependencies>
-    <dependency ref="00000000-0000-4000-8000-000000000029"/>
-    <dependency ref="00000000-0000-4000-8000-00000000002a"/>
-    <dependency ref="00000000-0000-4000-8000-00000000002b"/>
+    <dependency ref="my-specific-bom-ref-for-cpl"/>
+    <dependency ref="my-specific-bom-ref-for-my-first-service"/>
+    <dependency ref="my-specific-bom-ref-for-my-second-service"/>
   </dependencies>
 </bom>
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 9bcf96aa4..6d2869d7b 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -26,11 +26,11 @@
 from cyclonedx.model.bom import Bom
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from tests import DeepCompareMixin, SnapshotMixin, mksname, uuid_generator
-from tests._data.models import all_get_bom_funct_valid
+from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_with_incomplete_deps
 
 
 @ddt
-class TestOutputJson(TestCase, SnapshotMixin, DeepCompareMixin):
+class TestDeserializeJson(TestCase, SnapshotMixin, DeepCompareMixin):
 
     @named_data(*all_get_bom_funct_valid)
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
@@ -41,4 +41,5 @@ def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
         expected = get_bom()
         json = json_loads(self.readSnapshot(snapshot_name))
         bom = Bom.from_json(json)
-        self.assertDeepEqual(expected, bom)
+        self.assertDeepEqualBom(expected, bom,
+                                fuzzy_deps=get_bom in all_get_bom_funct_with_incomplete_deps)
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index 4af8c73e5..7ea805a54 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -25,11 +25,11 @@
 from cyclonedx.model.bom import Bom
 from cyclonedx.schema import OutputFormat, SchemaVersion
 from tests import DeepCompareMixin, SnapshotMixin, mksname, uuid_generator
-from tests._data.models import all_get_bom_funct_valid
+from tests._data.models import all_get_bom_funct_valid, all_get_bom_funct_with_incomplete_deps
 
 
 @ddt
-class TestOutputJson(TestCase, SnapshotMixin, DeepCompareMixin):
+class TestDeserializeXml(TestCase, SnapshotMixin, DeepCompareMixin):
 
     @named_data(*all_get_bom_funct_valid)
     @patch('cyclonedx.model.ThisTool._version', 'TESTING')
@@ -40,4 +40,5 @@ def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
         expected = get_bom()
         with open(self.getSnapshotFile(snapshot_name), 'r') as s:
             bom = Bom.from_xml(s)
-        self.assertDeepEqual(expected, bom)
+        self.assertDeepEqualBom(expected, bom,
+                                fuzzy_deps=get_bom in all_get_bom_funct_with_incomplete_deps)

From 9344deb71835c9296182a151f99f4b7fc007b75a Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 22:36:55 +0200
Subject: [PATCH 18/22] dings

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py                             |  7 +--
 tests/_data/models.py                         |  2 -
 ...bom_with_dependencies_hanging-1.2.json.bin |  9 +++-
 ..._bom_with_dependencies_hanging-1.2.xml.bin |  7 +++
 ...bom_with_dependencies_hanging-1.3.json.bin |  9 +++-
 ..._bom_with_dependencies_hanging-1.3.xml.bin |  7 +++
 ...bom_with_dependencies_hanging-1.4.json.bin | 43 ++++++++++++++++++-
 ..._bom_with_dependencies_hanging-1.4.xml.bin | 33 ++++++++++++++
 8 files changed, 109 insertions(+), 8 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index 00bda7920..57a07d8f2 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -91,11 +91,12 @@ def __deepDict(self, o: Any) -> Any:
         if isinstance(o, dict):
             return {k: self.__deepDict(v) for k, v in o.items()}
         if isinstance(o, (set, SortedSet)):
-            # this method returns dict. `dict` is not hashable, so use `list` instead.
+            # this method returns dict. `dict` is not hashable, so use `tuple` instead.
             return tuple(self.__deepDict(i) for i in sorted(o, key=hash)) + ('%conv:%set',)
         if hasattr(o, '__dict__'):
-            return {a: self.__deepDict(v) for a, v in o.__dict__.items() if '__' not in a
-                    } | {'%conv': str(type(o))}
+            d = {a: self.__deepDict(v) for a, v in o.__dict__.items() if '__' not in a}
+            d['%conv'] = str(type(o))
+            return d
         return o
 
     def assertDeepEqualBom(self, expected: 'Bom', actual: 'Bom',
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 1140fa08c..90b8a0978 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -169,7 +169,6 @@ def get_bom_with_dependencies_hanging() -> Bom:
             Dependency(c2.bom_ref)
         ]
     )
-    bom.metadata.tools.clear()
     return bom
 
 
@@ -729,5 +728,4 @@ def get_bom_service_licenses_invalid() -> Bom:
 )
 
 all_get_bom_funct_with_incomplete_deps = {
-
 }
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin
index e9bf6c643..c63b1b817 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.json.bin
@@ -55,7 +55,14 @@
       "type": "application",
       "version": ""
     },
-    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
   },
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "version": 23,
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin
index 1389c52b2..3d1ac1fb5 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.2.xml.bin
@@ -2,6 +2,13 @@
 <bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
   <metadata>
     <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
     <component type="application" bom-ref="root-component">
       <name>rootComponent</name>
       <version/>
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin
index 9f84818bd..5ccacbb31 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.json.bin
@@ -61,7 +61,14 @@
       "type": "application",
       "version": ""
     },
-    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
   },
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "version": 23,
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin
index 91b049a8f..656e37d0e 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.3.xml.bin
@@ -2,6 +2,13 @@
 <bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
   <metadata>
     <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+      </tool>
+    </tools>
     <component type="application" bom-ref="root-component">
       <name>rootComponent</name>
       <version/>
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin
index 5bfe6f285..abe58bd49 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.json.bin
@@ -60,7 +60,48 @@
       "name": "rootComponent",
       "type": "application"
     },
-    "timestamp": "2023-01-07T13:44:32.312678+00:00"
+    "timestamp": "2023-01-07T13:44:32.312678+00:00",
+    "tools": [
+      {
+        "externalReferences": [
+          {
+            "type": "build-system",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
+          },
+          {
+            "type": "distribution",
+            "url": "https://pypi.org/project/cyclonedx-python-lib/"
+          },
+          {
+            "type": "documentation",
+            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
+          },
+          {
+            "type": "issue-tracker",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
+          },
+          {
+            "type": "license",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
+          },
+          {
+            "type": "release-notes",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
+          },
+          {
+            "type": "vcs",
+            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
+          },
+          {
+            "type": "website",
+            "url": "https://cyclonedx.org"
+          }
+        ],
+        "name": "cyclonedx-python-lib",
+        "vendor": "CycloneDX",
+        "version": "TESTING"
+      }
+    ]
   },
   "serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
   "version": 23,
diff --git a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin
index fd73dd78c..5bea1c052 100644
--- a/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin
+++ b/tests/_data/snapshots/get_bom_with_dependencies_hanging-1.4.xml.bin
@@ -2,6 +2,39 @@
 <bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="23">
   <metadata>
     <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
+    <tools>
+      <tool>
+        <vendor>CycloneDX</vendor>
+        <name>cyclonedx-python-lib</name>
+        <version>TESTING</version>
+        <externalReferences>
+          <reference type="build-system">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
+          </reference>
+          <reference type="distribution">
+            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="documentation">
+            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
+          </reference>
+          <reference type="issue-tracker">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
+          </reference>
+          <reference type="license">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
+          </reference>
+          <reference type="release-notes">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
+          </reference>
+          <reference type="vcs">
+            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
+          </reference>
+          <reference type="website">
+            <url>https://cyclonedx.org</url>
+          </reference>
+        </externalReferences>
+      </tool>
+    </tools>
     <component type="application" bom-ref="root-component">
       <name>rootComponent</name>
     </component>

From 89c707cba59cfa55827a2e5834eae26fee73811e Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 22:37:33 +0200
Subject: [PATCH 19/22] bump def "py-serializable"

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index feeaf0133..dbe4a8743 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -61,7 +61,7 @@ keywords = [
 # ATTENTION: keep `deps.lowest.r` file in sync
 python = "^3.8"
 packageurl-python = ">= 0.11"
-py-serializable =  "^0.14.0"
+py-serializable =  "^0.14.1"
 sortedcontainers = "^2.4.0"
 license-expression = "^30"
 jsonschema = { version = "^4.18", extras=['format'], optional=true }

From 73d46f72d28f5f57aee4309c3368715cdc1d71df Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 22:39:52 +0200
Subject: [PATCH 20/22] remove unused test data

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .../_data/own/json/1.2/bom_dependencies.json  |  63 ---
 .../json/1.2/bom_dependencies_component.json  |  63 ---
 .../own/json/1.2/bom_external_references.json |  28 --
 .../json/1.2/bom_issue_275_components.json    |  66 ---
 .../json/1.2/bom_issue_328_components.json    |  71 ---
 .../own/json/1.2/bom_services_complex.json    |  88 ----
 .../own/json/1.2/bom_services_nested.json     | 148 ------
 .../own/json/1.2/bom_services_simple.json     |  44 --
 tests/_data/own/json/1.2/bom_setuptools.json  |  37 --
 .../own/json/1.2/bom_setuptools_complete.json | 223 ----------
 .../json/1.2/bom_setuptools_no_version.json   |  37 --
 .../own/json/1.2/bom_setuptools_with_cpe.json |  38 --
 tests/_data/own/json/1.2/bom_toml_1.json      |  44 --
 .../own/json/1.2/bom_with_full_metadata.json  | 262 -----------
 .../_data/own/json/1.3/bom_dependencies.json  |  69 ---
 .../json/1.3/bom_dependencies_component.json  |  69 ---
 .../own/json/1.3/bom_external_references.json |  34 --
 .../json/1.3/bom_issue_275_components.json    |  66 ---
 .../json/1.3/bom_issue_328_components.json    |  71 ---
 .../own/json/1.3/bom_services_complex.json    | 104 -----
 .../own/json/1.3/bom_services_nested.json     | 164 -------
 .../own/json/1.3/bom_services_simple.json     |  44 --
 tests/_data/own/json/1.3/bom_setuptools.json  |  37 --
 .../own/json/1.3/bom_setuptools_complete.json | 267 -----------
 .../json/1.3/bom_setuptools_no_version.json   |  37 --
 .../own/json/1.3/bom_setuptools_with_cpe.json |  38 --
 tests/_data/own/json/1.3/bom_toml_1.json      |  50 ---
 .../own/json/1.3/bom_with_full_metadata.json  | 329 --------------
 .../_data/own/json/1.4/bom_dependencies.json  | 103 -----
 .../json/1.4/bom_dependencies_component.json  | 103 -----
 .../own/json/1.4/bom_external_references.json |  68 ---
 .../json/1.4/bom_issue_275_components.json    | 100 -----
 .../json/1.4/bom_issue_328_components.json    | 105 -----
 .../own/json/1.4/bom_services_complex.json    | 197 --------
 .../own/json/1.4/bom_services_nested.json     | 257 -----------
 .../own/json/1.4/bom_services_simple.json     |  78 ----
 tests/_data/own/json/1.4/bom_setuptools.json  |  71 ---
 .../own/json/1.4/bom_setuptools_complete.json | 358 ---------------
 .../json/1.4/bom_setuptools_no_version.json   |  70 ---
 .../own/json/1.4/bom_setuptools_with_cpe.json |  72 ---
 .../bom_setuptools_with_release_notes.json    | 130 ------
 .../bom_setuptools_with_vulnerabilities.json  | 195 --------
 tests/_data/own/json/1.4/bom_toml_1.json      |  84 ----
 .../1.4/bom_with_dependencies_hanging.json    |  70 ---
 .../own/json/1.4/bom_with_full_metadata.json  | 420 ------------------
 .../_data/own/json/1.4/indented_4spaces.json  |  71 ---
 tests/_data/own/json/1.4/indented_None.json   |   1 -
 tests/_data/own/json/1.4/indented_tab.json    |  71 ---
 tests/_data/own/json/1.4/indented_two.json    |  71 ---
 tests/_data/own/xml/1.0/bom_empty.xml         |   4 -
 .../own/xml/1.0/bom_issue_275_components.xml  |  22 -
 .../own/xml/1.0/bom_issue_328_components.xml  |  24 -
 tests/_data/own/xml/1.0/bom_setuptools.xml    |  11 -
 .../own/xml/1.0/bom_setuptools_complete.xml   |  33 --
 .../own/xml/1.0/bom_setuptools_no_version.xml |  11 -
 .../own/xml/1.0/bom_setuptools_with_cpe.xml   |  12 -
 .../1.0/bom_toml_hashes_and_references.xml    |  14 -
 tests/_data/own/xml/1.1/bom_dependencies.xml  |  28 --
 tests/_data/own/xml/1.1/bom_empty.xml         |   5 -
 .../own/xml/1.1/bom_external_references.xml   |  14 -
 .../own/xml/1.1/bom_issue_275_components.xml  |  20 -
 .../own/xml/1.1/bom_issue_328_components.xml  |  22 -
 tests/_data/own/xml/1.1/bom_setuptools.xml    |  14 -
 .../own/xml/1.1/bom_setuptools_complete.xml   | 124 ------
 .../own/xml/1.1/bom_setuptools_no_version.xml |  14 -
 .../own/xml/1.1/bom_setuptools_with_cpe.xml   |  15 -
 .../bom_setuptools_with_vulnerabilities.xml   |  53 ---
 .../1.1/bom_toml_hashes_and_references.xml    |  20 -
 tests/_data/own/xml/1.2/bom_dependencies.xml  |  45 --
 .../xml/1.2/bom_dependencies_component.xml    |  45 --
 .../own/xml/1.2/bom_external_references.xml   |  23 -
 .../own/xml/1.2/bom_issue_275_components.xml  |  45 --
 .../own/xml/1.2/bom_issue_328_components.xml  |  48 --
 .../own/xml/1.2/bom_services_complex.xml      |  65 ---
 .../_data/own/xml/1.2/bom_services_nested.xml | 113 -----
 .../_data/own/xml/1.2/bom_services_simple.xml |  31 --
 tests/_data/own/xml/1.2/bom_setuptools.xml    |  28 --
 .../own/xml/1.2/bom_setuptools_complete.xml   | 162 -------
 .../own/xml/1.2/bom_setuptools_no_version.xml |  28 --
 .../own/xml/1.2/bom_setuptools_with_cpe.xml   |  29 --
 .../bom_setuptools_with_vulnerabilities.xml   |  67 ---
 .../1.2/bom_toml_hashes_and_references.xml    |  33 --
 .../own/xml/1.2/bom_with_full_metadata.xml    | 193 --------
 tests/_data/own/xml/1.3/bom_dependencies.xml  |  48 --
 .../xml/1.3/bom_dependencies_component.xml    |  48 --
 .../own/xml/1.3/bom_external_references.xml   |  26 --
 .../own/xml/1.3/bom_issue_275_components.xml  |  45 --
 .../own/xml/1.3/bom_issue_328_components.xml  |  48 --
 .../own/xml/1.3/bom_services_complex.xml      |  72 ---
 .../_data/own/xml/1.3/bom_services_nested.xml | 120 -----
 .../_data/own/xml/1.3/bom_services_simple.xml |  31 --
 tests/_data/own/xml/1.3/bom_setuptools.xml    |  28 --
 .../own/xml/1.3/bom_setuptools_complete.xml   | 184 --------
 .../own/xml/1.3/bom_setuptools_no_version.xml |  28 --
 .../own/xml/1.3/bom_setuptools_with_cpe.xml   |  29 --
 .../bom_setuptools_with_vulnerabilities.xml   |  67 ---
 .../1.3/bom_toml_hashes_and_references.xml    |  36 --
 .../own/xml/1.3/bom_with_full_metadata.xml    | 226 ----------
 tests/_data/own/xml/1.4/bom_dependencies.xml  |  74 ---
 .../xml/1.4/bom_dependencies_component.xml    |  74 ---
 .../own/xml/1.4/bom_external_references.xml   |  51 ---
 .../own/xml/1.4/bom_issue_275_components.xml  |  71 ---
 .../own/xml/1.4/bom_issue_328_components.xml  |  73 ---
 .../own/xml/1.4/bom_services_complex.xml      | 142 ------
 .../_data/own/xml/1.4/bom_services_nested.xml | 190 --------
 .../_data/own/xml/1.4/bom_services_simple.xml |  57 ---
 .../own/xml/1.4/bom_setuptools_complete.xml   | 252 -----------
 .../own/xml/1.4/bom_setuptools_no_version.xml |  53 ---
 .../own/xml/1.4/bom_setuptools_with_cpe.xml   |  55 ---
 .../1.4/bom_setuptools_with_release_notes.xml |  98 ----
 .../bom_setuptools_with_vulnerabilities.xml   | 166 -------
 .../1.4/bom_toml_hashes_and_references.xml    |  62 ---
 .../xml/1.4/bom_with_dependencies_hanging.xml |  47 --
 .../own/xml/1.4/bom_with_full_metadata.xml    | 294 ------------
 tests/_data/own/xml/1.4/indented_4spaces.xml  |  53 ---
 tests/_data/own/xml/1.4/indented_None.xml     |   2 -
 tests/_data/own/xml/1.4/indented_tab.xml      |  53 ---
 tests/_data/own/xml/1.4/indented_two.xml      |  53 ---
 118 files changed, 9657 deletions(-)
 delete mode 100644 tests/_data/own/json/1.2/bom_dependencies.json
 delete mode 100644 tests/_data/own/json/1.2/bom_dependencies_component.json
 delete mode 100644 tests/_data/own/json/1.2/bom_external_references.json
 delete mode 100644 tests/_data/own/json/1.2/bom_issue_275_components.json
 delete mode 100644 tests/_data/own/json/1.2/bom_issue_328_components.json
 delete mode 100644 tests/_data/own/json/1.2/bom_services_complex.json
 delete mode 100644 tests/_data/own/json/1.2/bom_services_nested.json
 delete mode 100644 tests/_data/own/json/1.2/bom_services_simple.json
 delete mode 100644 tests/_data/own/json/1.2/bom_setuptools.json
 delete mode 100644 tests/_data/own/json/1.2/bom_setuptools_complete.json
 delete mode 100644 tests/_data/own/json/1.2/bom_setuptools_no_version.json
 delete mode 100644 tests/_data/own/json/1.2/bom_setuptools_with_cpe.json
 delete mode 100644 tests/_data/own/json/1.2/bom_toml_1.json
 delete mode 100644 tests/_data/own/json/1.2/bom_with_full_metadata.json
 delete mode 100644 tests/_data/own/json/1.3/bom_dependencies.json
 delete mode 100644 tests/_data/own/json/1.3/bom_dependencies_component.json
 delete mode 100644 tests/_data/own/json/1.3/bom_external_references.json
 delete mode 100644 tests/_data/own/json/1.3/bom_issue_275_components.json
 delete mode 100644 tests/_data/own/json/1.3/bom_issue_328_components.json
 delete mode 100644 tests/_data/own/json/1.3/bom_services_complex.json
 delete mode 100644 tests/_data/own/json/1.3/bom_services_nested.json
 delete mode 100644 tests/_data/own/json/1.3/bom_services_simple.json
 delete mode 100644 tests/_data/own/json/1.3/bom_setuptools.json
 delete mode 100644 tests/_data/own/json/1.3/bom_setuptools_complete.json
 delete mode 100644 tests/_data/own/json/1.3/bom_setuptools_no_version.json
 delete mode 100644 tests/_data/own/json/1.3/bom_setuptools_with_cpe.json
 delete mode 100644 tests/_data/own/json/1.3/bom_toml_1.json
 delete mode 100644 tests/_data/own/json/1.3/bom_with_full_metadata.json
 delete mode 100644 tests/_data/own/json/1.4/bom_dependencies.json
 delete mode 100644 tests/_data/own/json/1.4/bom_dependencies_component.json
 delete mode 100644 tests/_data/own/json/1.4/bom_external_references.json
 delete mode 100644 tests/_data/own/json/1.4/bom_issue_275_components.json
 delete mode 100644 tests/_data/own/json/1.4/bom_issue_328_components.json
 delete mode 100644 tests/_data/own/json/1.4/bom_services_complex.json
 delete mode 100644 tests/_data/own/json/1.4/bom_services_nested.json
 delete mode 100644 tests/_data/own/json/1.4/bom_services_simple.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools_complete.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools_no_version.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools_with_cpe.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json
 delete mode 100644 tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json
 delete mode 100644 tests/_data/own/json/1.4/bom_toml_1.json
 delete mode 100644 tests/_data/own/json/1.4/bom_with_dependencies_hanging.json
 delete mode 100644 tests/_data/own/json/1.4/bom_with_full_metadata.json
 delete mode 100644 tests/_data/own/json/1.4/indented_4spaces.json
 delete mode 100644 tests/_data/own/json/1.4/indented_None.json
 delete mode 100644 tests/_data/own/json/1.4/indented_tab.json
 delete mode 100644 tests/_data/own/json/1.4/indented_two.json
 delete mode 100644 tests/_data/own/xml/1.0/bom_empty.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_issue_275_components.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_issue_328_components.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_setuptools.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_setuptools_complete.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_setuptools_no_version.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml
 delete mode 100644 tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_dependencies.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_empty.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_external_references.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_issue_275_components.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_issue_328_components.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_setuptools.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_setuptools_complete.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_setuptools_no_version.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml
 delete mode 100644 tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_dependencies.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_dependencies_component.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_external_references.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_issue_275_components.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_issue_328_components.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_services_complex.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_services_nested.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_services_simple.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_setuptools.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_setuptools_complete.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_setuptools_no_version.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml
 delete mode 100644 tests/_data/own/xml/1.2/bom_with_full_metadata.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_dependencies.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_dependencies_component.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_external_references.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_issue_275_components.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_issue_328_components.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_services_complex.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_services_nested.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_services_simple.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_setuptools.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_setuptools_complete.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_setuptools_no_version.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml
 delete mode 100644 tests/_data/own/xml/1.3/bom_with_full_metadata.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_dependencies.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_dependencies_component.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_external_references.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_issue_275_components.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_issue_328_components.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_services_complex.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_services_nested.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_services_simple.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_setuptools_complete.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_setuptools_no_version.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml
 delete mode 100644 tests/_data/own/xml/1.4/bom_with_full_metadata.xml
 delete mode 100644 tests/_data/own/xml/1.4/indented_4spaces.xml
 delete mode 100644 tests/_data/own/xml/1.4/indented_None.xml
 delete mode 100644 tests/_data/own/xml/1.4/indented_tab.xml
 delete mode 100644 tests/_data/own/xml/1.4/indented_two.xml

diff --git a/tests/_data/own/json/1.2/bom_dependencies.json b/tests/_data/own/json/1.2/bom_dependencies.json
deleted file mode 100644
index 8f54fe4a1..000000000
--- a/tests/_data/own/json/1.2/bom_dependencies.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:6dc366e9-89eb-48cc-9ae8-49a810ce3dcb",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.575599+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    },
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_dependencies_component.json b/tests/_data/own/json/1.2/bom_dependencies_component.json
deleted file mode 100644
index dd6b880ee..000000000
--- a/tests/_data/own/json/1.2/bom_dependencies_component.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:fae7d0a5-648d-4058-be92-774ed4f974eb",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.597300+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_external_references.json b/tests/_data/own/json/1.2/bom_external_references.json
deleted file mode 100644
index fb370e06e..000000000
--- a/tests/_data/own/json/1.2/bom_external_references.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "externalReferences": [
-    {
-      "url": "https://cyclonedx.org",
-      "comment": "No comment",
-      "type": "distribution"
-    },
-    {
-      "url": "https://cyclonedx.org",
-      "type": "website"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_issue_275_components.json b/tests/_data/own/json/1.2/bom_issue_275_components.json
deleted file mode 100644
index 8fc7cf7e2..000000000
--- a/tests/_data/own/json/1.2/bom_issue_275_components.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:e8a76c00-84d4-447e-8bc5-d8a3cefd01f0",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.651650+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "app",
-      "version": "1.0.0"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "comp_a",
-      "version": "1.0.0"
-    },
-    {
-      "type": "library",
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "comp_b",
-      "version": "1.0.0",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-          "name": "comp_c",
-          "version": "1.0.0"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "dependsOn": [
-        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-      ]
-    },
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    },
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "dependsOn": [
-        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-      ]
-    },
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_issue_328_components.json b/tests/_data/own/json/1.2/bom_issue_328_components.json
deleted file mode 100644
index 1ad1cce25..000000000
--- a/tests/_data/own/json/1.2/bom_issue_328_components.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:0e7ce694-c130-4965-8716-85015b42c729",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:52:27.732107+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "application",
-      "bom-ref": "my-project",
-      "name": "my-project",
-      "version": "1"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "component-A",
-      "name": "A",
-      "version": "0.1",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "component-B",
-          "name": "B",
-          "version": "1.0",
-          "components": [
-            {
-              "type": "library",
-              "bom-ref": "component-C",
-              "name": "C",
-              "version": "1.0"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "my-project",
-      "dependsOn": [
-        "component-A"
-      ]
-    },
-    {
-      "ref": "component-A",
-      "dependsOn": [
-        "component-B"
-      ]
-    },
-    {
-      "ref": "component-B",
-      "dependsOn": [
-        "component-C"
-      ]
-    },
-    {
-      "ref": "component-C",
-      "dependsOn": []
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_services_complex.json b/tests/_data/own/json/1.2/bom_services_complex.json
deleted file mode 100644
index 2caa98766..000000000
--- a/tests/_data/own/json/1.2/bom_services_complex.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "provider": {
-        "contact": [
-          {
-            "email": "paul.horton@owasp.org",
-            "name": "Paul Horton"
-          },
-          {
-            "email": "someone@somewhere.tld",
-            "name": "A N Other",
-            "phone": "+44 (0)1234 567890"
-          }
-        ],
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ]
-      },
-      "group": "a-group",
-      "name": "my-first-service",
-      "version": "1.2.3",
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "authenticated": false,
-      "x-trust-boundary": true,
-      "data": [
-        {
-          "classification": "public",
-          "flow": "outbound"
-        }
-      ],
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "externalReferences": [
-        {
-          "comment": "No comment",
-          "type": "distribution",
-          "url": "https://cyclonedx.org"
-        }
-      ]
-    },
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655"
-    },
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_services_nested.json b/tests/_data/own/json/1.2/bom_services_nested.json
deleted file mode 100644
index f927f9d7a..000000000
--- a/tests/_data/own/json/1.2/bom_services_nested.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "metadata": {
-    "component": {
-      "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-      "name": "cyclonedx-python-lib",
-      "type": "library",
-      "version": "1.0.0"
-    },
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "name": "cyclonedx-python-lib",
-        "vendor": "CycloneDX",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "services": [
-    {
-      "authenticated": false,
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "data": [
-        {
-          "classification": "public",
-          "flow": "outbound"
-        }
-      ],
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "externalReferences": [
-        {
-          "comment": "No comment",
-          "type": "distribution",
-          "url": "https://cyclonedx.org"
-        }
-      ],
-      "group": "a-group",
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "name": "my-first-service",
-      "provider": {
-        "contact": [
-          {
-            "email": "paul.horton@owasp.org",
-            "name": "Paul Horton"
-          },
-          {
-            "email": "someone@somewhere.tld",
-            "name": "A N Other",
-            "phone": "+44 (0)1234 567890"
-          }
-        ],
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ]
-      },
-      "services": [
-        {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-          "name": "first-nested-service"
-        },
-        {
-          "authenticated": true,
-          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
-          "group": "no-group",
-          "name": "second-nested-service",
-          "provider": {
-            "contact": [
-              {
-                "email": "paul.horton@owasp.org",
-                "name": "Paul Horton"
-              },
-              {
-                "email": "someone@somewhere.tld",
-                "name": "A N Other",
-                "phone": "+44 (0)1234 567890"
-              }
-            ],
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ]
-          },
-          "version": "3.2.1",
-          "x-trust-boundary": false
-        }
-      ],
-      "version": "1.2.3",
-      "x-trust-boundary": true
-    },
-    {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "my-second-service",
-      "services": [
-        {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-          "group": "what-group",
-          "name": "yet-another-nested-service",
-          "provider": {
-            "contact": [
-              {
-                "email": "paul.horton@owasp.org",
-                "name": "Paul Horton"
-              },
-              {
-                "email": "someone@somewhere.tld",
-                "name": "A N Other",
-                "phone": "+44 (0)1234 567890"
-              }
-            ],
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ]
-          },
-          "version": "6.5.4"
-        },
-        {
-          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
-          "name": "another-nested-service"
-        }
-      ]
-    }
-  ],
-  "specVersion": "1.2",
-  "version": 1,
-  "dependencies": [
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
-    },
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    },
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_services_simple.json b/tests/_data/own/json/1.2/bom_services_simple.json
deleted file mode 100644
index 198bfadd0..000000000
--- a/tests/_data/own/json/1.2/bom_services_simple.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-first-service"
-    },
-    {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    },
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_setuptools.json b/tests/_data/own/json/1.2/bom_setuptools.json
deleted file mode 100644
index 961c69d90..000000000
--- a/tests/_data/own/json/1.2/bom_setuptools.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_setuptools_complete.json b/tests/_data/own/json/1.2/bom_setuptools_complete.json
deleted file mode 100644
index 1bfc41dc8..000000000
--- a/tests/_data/own/json/1.2/bom_setuptools_complete.json
+++ /dev/null
@@ -1,223 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          },
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment"
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment"
-              }
-            ]
-          },
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "type": "distribution",
-          "url": "https://cyclonedx.org",
-          "comment": "No comment"
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "externalReferences": [
-            {
-              "type": "distribution",
-              "url": "https://cyclonedx.org",
-              "comment": "No comment"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_setuptools_no_version.json b/tests/_data/own/json/1.2/bom_setuptools_no_version.json
deleted file mode 100644
index 8fb2dd782..000000000
--- a/tests/_data/own/json/1.2/bom_setuptools_no_version.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:77d15ab9-5602-4cca-8ed2-59ae579aafd3",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.2/bom_setuptools_with_cpe.json
deleted file mode 100644
index 0d7e9b9e2..000000000
--- a/tests/_data/own/json/1.2/bom_setuptools_with_cpe.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_toml_1.json b/tests/_data/own/json/1.2/bom_toml_1.json
deleted file mode 100644
index 4180b39b0..000000000
--- a/tests/_data/own/json/1.2/bom_toml_1.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:6f266d1c-760f-4552-ae3b-41a9b74232fa",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.2/bom_with_full_metadata.json b/tests/_data/own/json/1.2/bom_with_full_metadata.json
deleted file mode 100644
index d24684c69..000000000
--- a/tests/_data/own/json/1.2/bom_with_full_metadata.json
+++ /dev/null
@@ -1,262 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.2",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "authors": [
-      {
-        "name": "A N Other",
-        "email": "someone@somewhere.tld",
-        "phone": "+44 (0)1234 567890"
-      },
-      {
-        "name": "Paul Horton",
-        "email": "paul.horton@owasp.org"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution"
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution"
-              }
-            ]
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution"
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "externalReferences": [
-            {
-              "url": "https://cyclonedx.org",
-              "comment": "No comment",
-              "type": "distribution"
-            }
-          ]
-        }
-      ]
-    },
-    "manufacture": {
-      "name": "CycloneDX",
-      "url": [
-        "https://cyclonedx.org"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        },
-        {
-          "name": "Paul Horton",
-          "email": "paul.horton@owasp.org"
-        }
-      ]
-    },
-    "supplier": {
-      "name": "Cyclone DX",
-      "url": [
-        "https://cyclonedx.org/"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        }
-      ]
-    }
-  },
-  "dependencies": [
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_dependencies.json b/tests/_data/own/json/1.3/bom_dependencies.json
deleted file mode 100644
index afd36d07f..000000000
--- a/tests/_data/own/json/1.3/bom_dependencies.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d2ef50e0-27c7-4776-9e6f-9bbb3614d6de",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.875727+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    },
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_dependencies_component.json b/tests/_data/own/json/1.3/bom_dependencies_component.json
deleted file mode 100644
index 1820acbd6..000000000
--- a/tests/_data/own/json/1.3/bom_dependencies_component.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:f1ab7398-e797-4ac1-8fdd-f2901bd5059d",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.901622+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_external_references.json b/tests/_data/own/json/1.3/bom_external_references.json
deleted file mode 100644
index a4d4d9fde..000000000
--- a/tests/_data/own/json/1.3/bom_external_references.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "externalReferences": [
-    {
-      "url": "https://cyclonedx.org",
-      "comment": "No comment",
-      "type": "distribution",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ]
-    },
-    {
-      "url": "https://cyclonedx.org",
-      "type": "website"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_issue_275_components.json b/tests/_data/own/json/1.3/bom_issue_275_components.json
deleted file mode 100644
index f1f7596de..000000000
--- a/tests/_data/own/json/1.3/bom_issue_275_components.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:4d8c5007-3d0b-4556-bbda-e9902c183b82",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:57.962469+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "app",
-      "version": "1.0.0"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "comp_a",
-      "version": "1.0.0"
-    },
-    {
-      "type": "library",
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "comp_b",
-      "version": "1.0.0",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-          "name": "comp_c",
-          "version": "1.0.0"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "dependsOn": [
-        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-      ]
-    },
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    },
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "dependsOn": [
-        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-      ]
-    },
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_issue_328_components.json b/tests/_data/own/json/1.3/bom_issue_328_components.json
deleted file mode 100644
index 7d515941c..000000000
--- a/tests/_data/own/json/1.3/bom_issue_328_components.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d59b94a8-25bc-4876-a1ae-c21a73fecd2c",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:52:28.562184+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "application",
-      "bom-ref": "my-project",
-      "name": "my-project",
-      "version": "1"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "component-A",
-      "name": "A",
-      "version": "0.1",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "component-B",
-          "name": "B",
-          "version": "1.0",
-          "components": [
-            {
-              "type": "library",
-              "bom-ref": "component-C",
-              "name": "C",
-              "version": "1.0"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "my-project",
-      "dependsOn": [
-        "component-A"
-      ]
-    },
-    {
-      "ref": "component-A",
-      "dependsOn": [
-        "component-B"
-      ]
-    },
-    {
-      "ref": "component-B",
-      "dependsOn": [
-        "component-C"
-      ]
-    },
-    {
-      "ref": "component-C",
-      "dependsOn": []
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_services_complex.json b/tests/_data/own/json/1.3/bom_services_complex.json
deleted file mode 100644
index f222cd505..000000000
--- a/tests/_data/own/json/1.3/bom_services_complex.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "provider": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "group": "a-group",
-      "name": "my-first-service",
-      "version": "1.2.3",
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "authenticated": false,
-      "x-trust-boundary": true,
-      "data": [
-        {
-          "flow": "outbound",
-          "classification": "public"
-        }
-      ],
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    },
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    },
-    {
-      "ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_services_nested.json b/tests/_data/own/json/1.3/bom_services_nested.json
deleted file mode 100644
index 82e9e1870..000000000
--- a/tests/_data/own/json/1.3/bom_services_nested.json
+++ /dev/null
@@ -1,164 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "provider": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "group": "a-group",
-      "name": "my-first-service",
-      "version": "1.2.3",
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "authenticated": false,
-      "x-trust-boundary": true,
-      "data": [
-        {
-          "flow": "outbound",
-          "classification": "public"
-        }
-      ],
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "services": [
-        {
-          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
-          "provider": {
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ],
-            "contact": [
-              {
-                "name": "A N Other",
-                "email": "someone@somewhere.tld",
-                "phone": "+44 (0)1234 567890"
-              },
-              {
-                "name": "Paul Horton",
-                "email": "paul.horton@owasp.org"
-              }
-            ]
-          },
-          "group": "no-group",
-          "name": "second-nested-service",
-          "version": "3.2.1",
-          "authenticated": true,
-          "x-trust-boundary": false
-        },
-        {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-          "name": "first-nested-service"
-        }
-      ],
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    },
-    {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "my-second-service",
-      "services": [
-        {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-          "provider": {
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ],
-            "contact": [
-              {
-                "name": "A N Other",
-                "email": "someone@somewhere.tld",
-                "phone": "+44 (0)1234 567890"
-              },
-              {
-                "name": "Paul Horton",
-                "email": "paul.horton@owasp.org"
-              }
-            ]
-          },
-          "group": "what-group",
-          "name": "yet-another-nested-service",
-          "version": "6.5.4"
-        },
-        {
-          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
-          "name": "another-nested-service"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    },
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    },
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_services_simple.json b/tests/_data/own/json/1.3/bom_services_simple.json
deleted file mode 100644
index a18e31cbe..000000000
--- a/tests/_data/own/json/1.3/bom_services_simple.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-first-service"
-    },
-    {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    },
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_setuptools.json b/tests/_data/own/json/1.3/bom_setuptools.json
deleted file mode 100644
index 33d6d3992..000000000
--- a/tests/_data/own/json/1.3/bom_setuptools.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_setuptools_complete.json b/tests/_data/own/json/1.3/bom_setuptools_complete.json
deleted file mode 100644
index d32d02004..000000000
--- a/tests/_data/own/json/1.3/bom_setuptools_complete.json
+++ /dev/null
@@ -1,267 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          },
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          },
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "type": "distribution",
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "externalReferences": [
-            {
-              "type": "distribution",
-              "url": "https://cyclonedx.org",
-              "comment": "No comment",
-              "hashes": [
-                {
-                  "alg": "SHA-256",
-                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "evidence": {
-        "copyright": [
-          {
-            "text": "Commercial"
-          },
-          {
-            "text": "Commercial 2"
-          }
-        ]
-      },
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_setuptools_no_version.json b/tests/_data/own/json/1.3/bom_setuptools_no_version.json
deleted file mode 100644
index c59f067e7..000000000
--- a/tests/_data/own/json/1.3/bom_setuptools_no_version.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:77d15ab9-5602-4cca-8ed2-59ae579aafd3",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.3/bom_setuptools_with_cpe.json
deleted file mode 100644
index baf80bccb..000000000
--- a/tests/_data/own/json/1.3/bom_setuptools_with_cpe.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_toml_1.json b/tests/_data/own/json/1.3/bom_toml_1.json
deleted file mode 100644
index 2ec922747..000000000
--- a/tests/_data/own/json/1.3/bom_toml_1.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:6f266d1c-760f-4552-ae3b-41a9b74232fa",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.3/bom_with_full_metadata.json b/tests/_data/own/json/1.3/bom_with_full_metadata.json
deleted file mode 100644
index 9cd5271c2..000000000
--- a/tests/_data/own/json/1.3/bom_with_full_metadata.json
+++ /dev/null
@@ -1,329 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.3",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING"
-      }
-    ],
-    "authors": [
-      {
-        "name": "A N Other",
-        "email": "someone@somewhere.tld",
-        "phone": "+44 (0)1234 567890"
-      },
-      {
-        "name": "Paul Horton",
-        "email": "paul.horton@owasp.org"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "externalReferences": [
-            {
-              "url": "https://cyclonedx.org",
-              "comment": "No comment",
-              "type": "distribution",
-              "hashes": [
-                {
-                  "alg": "SHA-256",
-                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "evidence": {
-        "copyright": [
-          {
-            "text": "Commercial"
-          },
-          {
-            "text": "Commercial 2"
-          }
-        ]
-      }
-    },
-    "manufacture": {
-      "name": "CycloneDX",
-      "url": [
-        "https://cyclonedx.org"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        },
-        {
-          "name": "Paul Horton",
-          "email": "paul.horton@owasp.org"
-        }
-      ]
-    },
-    "supplier": {
-      "name": "Cyclone DX",
-      "url": [
-        "https://cyclonedx.org/"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        }
-      ]
-    },
-    "licenses": [
-      {
-        "license": {
-          "id": "Apache-2.0",
-          "text": {
-            "contentType": "text/plain",
-            "encoding": "base64",
-            "content": "VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE="
-          },
-          "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
-        }
-      }
-    ],
-    "properties": [
-      {
-        "name": "key1",
-        "value": "val1"
-      },
-      {
-        "name": "key2",
-        "value": "val2"
-      }
-    ]
-  },
-  "dependencies": [
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_dependencies.json b/tests/_data/own/json/1.4/bom_dependencies.json
deleted file mode 100644
index 02c349606..000000000
--- a/tests/_data/own/json/1.4/bom_dependencies.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    },
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_dependencies_component.json b/tests/_data/own/json/1.4/bom_dependencies_component.json
deleted file mode 100644
index df8cc3b77..000000000
--- a/tests/_data/own/json/1.4/bom_dependencies_component.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:890c2dff-1e2c-4133-a0b1-ee23d93737af",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:58.782058+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "dependsOn": [
-        "pkg:pypi/toml@0.10.2?extension=tar.gz"
-      ]
-    },
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_external_references.json b/tests/_data/own/json/1.4/bom_external_references.json
deleted file mode 100644
index 2f961c7b4..000000000
--- a/tests/_data/own/json/1.4/bom_external_references.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "externalReferences": [
-    {
-      "url": "https://cyclonedx.org",
-      "comment": "No comment",
-      "type": "distribution",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ]
-    },
-    {
-      "url": "https://cyclonedx.org",
-      "type": "website"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_issue_275_components.json b/tests/_data/own/json/1.4/bom_issue_275_components.json
deleted file mode 100644
index 6826b7a16..000000000
--- a/tests/_data/own/json/1.4/bom_issue_275_components.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:75d08821-33b4-4f66-8577-6caa2fc718ac",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:45:58.871481+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "app",
-      "version": "1.0.0"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "comp_a",
-      "version": "1.0.0"
-    },
-    {
-      "type": "library",
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "comp_b",
-      "version": "1.0.0",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-          "name": "comp_c",
-          "version": "1.0.0"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "dependsOn": [
-        "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-        "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-      ]
-    },
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    },
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "dependsOn": [
-        "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-      ]
-    },
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_issue_328_components.json b/tests/_data/own/json/1.4/bom_issue_328_components.json
deleted file mode 100644
index 278722235..000000000
--- a/tests/_data/own/json/1.4/bom_issue_328_components.json
+++ /dev/null
@@ -1,105 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:282ec6f4-455e-4b07-b4b8-561bad2010c5",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:52:30.247202+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "application",
-      "bom-ref": "my-project",
-      "name": "my-project",
-      "version": "1"
-    }
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "component-A",
-      "name": "A",
-      "version": "0.1",
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "component-B",
-          "name": "B",
-          "version": "1.0",
-          "components": [
-            {
-              "type": "library",
-              "bom-ref": "component-C",
-              "name": "C",
-              "version": "1.0"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "my-project",
-      "dependsOn": [
-        "component-A"
-      ]
-    },
-    {
-      "ref": "component-A",
-      "dependsOn": [
-        "component-B"
-      ]
-    },
-    {
-      "ref": "component-B",
-      "dependsOn": [
-        "component-C"
-      ]
-    },
-    {
-      "ref": "component-C",
-      "dependsOn": []
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_services_complex.json b/tests/_data/own/json/1.4/bom_services_complex.json
deleted file mode 100644
index d4d80b06d..000000000
--- a/tests/_data/own/json/1.4/bom_services_complex.json
+++ /dev/null
@@ -1,197 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "provider": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "group": "a-group",
-      "name": "my-first-service",
-      "version": "1.2.3",
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "authenticated": false,
-      "x-trust-boundary": true,
-      "data": [
-        {
-          "flow": "outbound",
-          "classification": "public"
-        }
-      ],
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "releaseNotes": {
-        "type": "major",
-        "title": "Release Notes Title",
-        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
-        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
-        "description": "This release is a test release",
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "aliases": [
-          "First Test Release"
-        ],
-        "tags": [
-          "alpha",
-          "test"
-        ],
-        "resolves": [
-          {
-            "type": "security",
-            "id": "CVE-2021-44228",
-            "name": "Apache Log3Shell",
-            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
-            "source": {
-              "name": "NVD",
-              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
-            },
-            "references": [
-              "https://central.sonatype.org/news/20211213_log4shell_help",
-              "https://logging.apache.org/log4j/2.x/security.html"
-            ]
-          }
-        ],
-        "notes": [
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-GB"
-          },
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-US"
-          }
-        ],
-        "properties": [
-          {
-            "name": "key1",
-            "value": "val1"
-          },
-          {
-            "name": "key2",
-            "value": "val2"
-          }
-        ]
-      },
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    },
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "bb5911d6-1a1d-41c9-b6e0-46e848d16655"
-    },
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_services_nested.json b/tests/_data/own/json/1.4/bom_services_nested.json
deleted file mode 100644
index 3c6746827..000000000
--- a/tests/_data/own/json/1.4/bom_services_nested.json
+++ /dev/null
@@ -1,257 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "my-specific-bom-ref-for-my-first-service",
-      "provider": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "group": "a-group",
-      "name": "my-first-service",
-      "version": "1.2.3",
-      "description": "Description goes here",
-      "endpoints": [
-        "/api/thing/1",
-        "/api/thing/2"
-      ],
-      "authenticated": false,
-      "x-trust-boundary": true,
-      "data": [
-        {
-          "flow": "outbound",
-          "classification": "public"
-        }
-      ],
-      "licenses": [
-        {
-          "expression": "Commercial"
-        }
-      ],
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "services": [
-        {
-          "bom-ref": "my-specific-bom-ref-for-second-nested-service",
-          "provider": {
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ],
-            "contact": [
-              {
-                "name": "A N Other",
-                "email": "someone@somewhere.tld",
-                "phone": "+44 (0)1234 567890"
-              },
-              {
-                "name": "Paul Horton",
-                "email": "paul.horton@owasp.org"
-              }
-            ]
-          },
-          "group": "no-group",
-          "name": "second-nested-service",
-          "version": "3.2.1",
-          "authenticated": true,
-          "x-trust-boundary": false
-        },
-        {
-          "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-          "name": "first-nested-service"
-        }
-      ],
-      "releaseNotes": {
-        "type": "major",
-        "title": "Release Notes Title",
-        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
-        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
-        "description": "This release is a test release",
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "aliases": [
-          "First Test Release"
-        ],
-        "tags": [
-          "alpha",
-          "test"
-        ],
-        "resolves": [
-          {
-            "type": "security",
-            "id": "CVE-2021-44228",
-            "name": "Apache Log3Shell",
-            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
-            "source": {
-              "name": "NVD",
-              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
-            },
-            "references": [
-              "https://central.sonatype.org/news/20211213_log4shell_help",
-              "https://logging.apache.org/log4j/2.x/security.html"
-            ]
-          }
-        ],
-        "notes": [
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-GB"
-          },
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-US"
-          }
-        ],
-        "properties": [
-          {
-            "name": "key1",
-            "value": "val1"
-          },
-          {
-            "name": "key2",
-            "value": "val2"
-          }
-        ]
-      },
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    },
-    {
-      "bom-ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857",
-      "name": "my-second-service",
-      "services": [
-        {
-          "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-          "provider": {
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ],
-            "contact": [
-              {
-                "name": "A N Other",
-                "email": "someone@somewhere.tld",
-                "phone": "+44 (0)1234 567890"
-              },
-              {
-                "name": "Paul Horton",
-                "email": "paul.horton@owasp.org"
-              }
-            ]
-          },
-          "group": "what-group",
-          "name": "yet-another-nested-service",
-          "version": "6.5.4"
-        },
-        {
-          "bom-ref": "my-specific-bom-ref-for-another-nested-service",
-          "name": "another-nested-service"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "my-specific-bom-ref-for-my-first-service"
-    },
-    {
-      "ref": "0b049d09-64c0-4490-a0f5-c84d9aacf857"
-    },
-    {
-      "ref": "cd3e9c95-9d41-49e7-9924-8cf0465ae789"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_services_simple.json b/tests/_data/own/json/1.4/bom_services_simple.json
deleted file mode 100644
index 38c714228..000000000
--- a/tests/_data/own/json/1.4/bom_services_simple.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "name": "cyclonedx-python-lib",
-      "version": "1.0.0"
-    }
-  },
-  "services": [
-    {
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "name": "my-first-service"
-    },
-    {
-      "bom-ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda",
-      "name": "my-second-service"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    },
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    },
-    {
-      "ref": "17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools.json b/tests/_data/own/json/1.4/bom_setuptools.json
deleted file mode 100644
index 4fd30cacd..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools_complete.json b/tests/_data/own/json/1.4/bom_setuptools_complete.json
deleted file mode 100644
index ceb5903c2..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools_complete.json
+++ /dev/null
@@ -1,358 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "type": "build-system",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
-          },
-          {
-            "type": "distribution",
-            "url": "https://pypi.org/project/cyclonedx-python-lib/"
-          },
-          {
-            "type": "documentation",
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
-          },
-          {
-            "type": "issue-tracker",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
-          },
-          {
-            "type": "license",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
-          },
-          {
-            "type": "release-notes",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
-          },
-          {
-            "type": "vcs",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
-          },
-          {
-            "type": "website",
-            "url": "https://cyclonedx.org"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "df70b5f1-8f53-47a4-be48-669ae78795e6",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          },
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "externalReferences": [
-              {
-                "type": "distribution",
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          },
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "type": "distribution",
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "externalReferences": [
-            {
-              "type": "distribution",
-              "url": "https://cyclonedx.org",
-              "comment": "No comment",
-              "hashes": [
-                {
-                  "alg": "SHA-256",
-                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "evidence": {
-        "copyright": [
-          {
-            "text": "Commercial"
-          },
-          {
-            "text": "Commercial 2"
-          }
-        ]
-      },
-      "releaseNotes": {
-        "type": "major",
-        "title": "Release Notes Title",
-        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
-        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
-        "description": "This release is a test release",
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "aliases": [
-          "First Test Release"
-        ],
-        "tags": [
-          "test",
-          "alpha"
-        ],
-        "resolves": [
-          {
-            "type": "security",
-            "id": "CVE-2021-44228",
-            "name": "Apache Log3Shell",
-            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
-            "source": {
-              "name": "NVD",
-              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
-            },
-            "references": [
-              "https://logging.apache.org/log4j/2.x/security.html",
-              "https://central.sonatype.org/news/20211213_log4shell_help"
-            ]
-          }
-        ],
-        "notes": [
-          {
-            "locale": "en-GB",
-            "text": {
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64",
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA=="
-            }
-          },
-          {
-            "locale": "en-US",
-            "text": {
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64",
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA=="
-            }
-          }
-        ],
-        "properties": [
-          {
-            "name": "key1",
-            "value": "val1"
-          },
-          {
-            "name": "key2",
-            "value": "val2"
-          }
-        ]
-      },
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "df70b5f1-8f53-47a4-be48-669ae78795e6"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools_no_version.json b/tests/_data/own/json/1.4/bom_setuptools_no_version.json
deleted file mode 100644
index ea3bb5d6d..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools_no_version.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:77d15ab9-5602-4cca-8ed2-59ae579aafd3",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.4/bom_setuptools_with_cpe.json
deleted file mode 100644
index 7ad22406a..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools_with_cpe.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json b/tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json
deleted file mode 100644
index 492be373e..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json
+++ /dev/null
@@ -1,130 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "releaseNotes": {
-        "type": "major",
-        "title": "Release Notes Title",
-        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
-        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
-        "description": "This release is a test release",
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "aliases": [
-          "First Test Release"
-        ],
-        "tags": [
-          "alpha",
-          "test"
-        ],
-        "resolves": [
-          {
-            "type": "security",
-            "id": "CVE-2021-44228",
-            "name": "Apache Log3Shell",
-            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
-            "source": {
-              "name": "NVD",
-              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
-            },
-            "references": [
-              "https://central.sonatype.org/news/20211213_log4shell_help",
-              "https://logging.apache.org/log4j/2.x/security.html"
-            ]
-          }
-        ],
-        "notes": [
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-GB"
-          },
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-US"
-          }
-        ],
-        "properties": [
-          {
-            "name": "key1",
-            "value": "val1"
-          },
-          {
-            "name": "key2",
-            "value": "val2"
-          }
-        ]
-      }
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json b/tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json
deleted file mode 100644
index c7c0ed05c..000000000
--- a/tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json
+++ /dev/null
@@ -1,195 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "author": "Test Author",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "vulnerabilities": [
-    {
-      "bom-ref": "my-vuln-ref-1",
-      "id": "CVE-2018-7489",
-      "source": {
-        "name": "NVD",
-        "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
-      },
-      "references": [
-        {
-          "id": "SOME-OTHER-ID",
-          "source": {
-            "name": "OSS Index",
-            "url": "https://ossindex.sonatype.org/component/pkg:pypi/setuptools"
-          }
-        }
-      ],
-      "ratings": [
-        {
-          "source": {
-            "name": "NVD",
-            "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
-          },
-          "score": 9.8,
-          "severity": "critical",
-          "method": "CVSSv3",
-          "vector": "AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
-          "justification": "Some justification"
-        },
-        {
-          "source": {
-            "name": "OWASP",
-            "url": "https://owasp.org"
-          },
-          "score": 2.7,
-          "severity": "low",
-          "method": "CVSSv3",
-          "vector": "AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N",
-          "justification": "Some other justification"
-        }
-      ],
-      "cwes": [
-        22,
-        33
-      ],
-      "description": "A description here",
-      "detail": "Some detail here",
-      "recommendation": "Upgrade",
-      "advisories": [
-        {
-          "url": "http://www.securitytracker.com/id/1040693"
-        },
-        {
-          "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-7489"
-        }
-      ],
-      "created": "2021-09-01T10:50:42.051979+00:00",
-      "published": "2021-09-02T10:50:42.051979+00:00",
-      "updated": "2021-09-03T10:50:42.051979+00:00",
-      "credits": {
-        "organizations": [
-          {
-            "name": "CycloneDX",
-            "url": [
-              "https://cyclonedx.org"
-            ],
-            "contact": [
-              {
-                "name": "A N Other",
-                "email": "someone@somewhere.tld",
-                "phone": "+44 (0)1234 567890"
-              },
-              {
-                "name": "Paul Horton",
-                "email": "paul.horton@owasp.org"
-              }
-            ]
-          }
-        ],
-        "individuals": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          }
-        ]
-      },
-      "tools": [
-        {
-          "vendor": "CycloneDX",
-          "name": "cyclonedx-python-lib"
-        }
-      ],
-      "analysis": {
-        "state": "exploitable",
-        "justification": "requires_environment",
-        "response": [
-          "can_not_fix"
-        ],
-        "detail": "Some extra detail"
-      },
-      "affects": [
-        {
-          "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "versions": [
-            {
-              "range": "49.0.0 - 54.0.0",
-              "status": "affected"
-            }
-          ]
-        }
-      ],
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_toml_1.json b/tests/_data/own/json/1.4/bom_toml_1.json
deleted file mode 100644
index 80fe0ae3f..000000000
--- a/tests/_data/own/json/1.4/bom_toml_1.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:6f266d1c-760f-4552-ae3b-41a9b74232fa",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ]
-  },
-  "components": [
-    {
-      "type": "library",
-      "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "name": "toml",
-      "version": "0.10.2",
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ]
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/toml@0.10.2?extension=tar.gz"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_with_dependencies_hanging.json b/tests/_data/own/json/1.4/bom_with_dependencies_hanging.json
deleted file mode 100644
index 92cf9405d..000000000
--- a/tests/_data/own/json/1.4/bom_with_dependencies_hanging.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:12345678-395b-41f5-a30f-1234567890ab",
-  "version": 23,
-  "metadata": {
-    "component": {
-      "bom-ref": "root-component",
-      "name": "rootComponent",
-      "type": "application"
-    },
-    "timestamp": "2023-06-01T03:03:07+00:00"
-  },
-  "components": [
-    {
-      "author": "Test Author",
-      "bom-ref": "setuptools",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "name": "setuptools",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "type": "library",
-      "version": "50.3.2"
-    },
-    {
-      "bom-ref": "toml",
-      "externalReferences": [
-        {
-          "comment": "No comment",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "type": "distribution",
-          "url": "https://cyclonedx.org"
-        }
-      ],
-      "hashes": [
-        {
-          "alg": "SHA-256",
-          "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-        }
-      ],
-      "name": "toml",
-      "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-      "type": "library",
-      "version": "0.10.2"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "root-component"
-    },
-    {
-      "ref": "setuptools",
-      "dependsOn": [
-        "toml"
-      ]
-    },
-    {
-      "ref": "toml"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/bom_with_full_metadata.json b/tests/_data/own/json/1.4/bom_with_full_metadata.json
deleted file mode 100644
index 0fab3971e..000000000
--- a/tests/_data/own/json/1.4/bom_with_full_metadata.json
+++ /dev/null
@@ -1,420 +0,0 @@
-{
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:d0b24ba4-102b-497e-b31f-4fdc3f0a3005",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2023-01-07T13:44:32.312678+00:00",
-    "tools": [
-      {
-        "vendor": "CycloneDX",
-        "name": "cyclonedx-python-lib",
-        "version": "TESTING",
-        "externalReferences": [
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions",
-            "type": "build-system"
-          },
-          {
-            "url": "https://pypi.org/project/cyclonedx-python-lib/",
-            "type": "distribution"
-          },
-          {
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/",
-            "type": "documentation"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues",
-            "type": "issue-tracker"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE",
-            "type": "license"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md",
-            "type": "release-notes"
-          },
-          {
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib",
-            "type": "vcs"
-          },
-          {
-            "url": "https://cyclonedx.org",
-            "type": "website"
-          }
-        ]
-      }
-    ],
-    "authors": [
-      {
-        "name": "A N Other",
-        "email": "someone@somewhere.tld",
-        "phone": "+44 (0)1234 567890"
-      },
-      {
-        "name": "Paul Horton",
-        "email": "paul.horton@owasp.org"
-      }
-    ],
-    "component": {
-      "type": "library",
-      "bom-ref": "be2c6502-7e9a-47db-9a66-e34f729810a3",
-      "supplier": {
-        "name": "CycloneDX",
-        "url": [
-          "https://cyclonedx.org"
-        ],
-        "contact": [
-          {
-            "name": "A N Other",
-            "email": "someone@somewhere.tld",
-            "phone": "+44 (0)1234 567890"
-          },
-          {
-            "name": "Paul Horton",
-            "email": "paul.horton@owasp.org"
-          }
-        ]
-      },
-      "author": "Test Author",
-      "publisher": "CycloneDX",
-      "name": "setuptools",
-      "version": "50.3.2",
-      "description": "This component is awesome",
-      "scope": "required",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "copyright": "Apache 2.0 baby!",
-      "cpe": "cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "swid": {
-        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
-        "name": "Test Application",
-        "version": "3.4.5",
-        "text": {
-          "contentType": "text/xml",
-          "encoding": "base64",
-          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
-        }
-      },
-      "pedigree": {
-        "ancestors": [
-          {
-            "type": "library",
-            "bom-ref": "ccc8d7ee-4b9c-4750-aee0-a72585152291",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "8a3893b3-9923-4adb-a1d3-47456636ba0a",
-            "author": "Test Author",
-            "name": "setuptools",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          }
-        ],
-        "descendants": [
-          {
-            "type": "library",
-            "bom-ref": "28b2d8ce-def0-446f-a221-58dee0b44acc",
-            "author": "Test Author",
-            "name": "setuptools",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "555ca729-93c6-48f3-956e-bdaa4a2f0bfa",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "variants": [
-          {
-            "type": "library",
-            "bom-ref": "ded1d73e-1fca-4302-b520-f1bc53979958",
-            "author": "Test Author",
-            "name": "setuptools",
-            "version": "50.3.2",
-            "licenses": [
-              {
-                "expression": "MIT License"
-              }
-            ],
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-          },
-          {
-            "type": "library",
-            "bom-ref": "e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66",
-            "name": "toml",
-            "version": "0.10.2",
-            "hashes": [
-              {
-                "alg": "SHA-256",
-                "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-              }
-            ],
-            "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-            "externalReferences": [
-              {
-                "url": "https://cyclonedx.org",
-                "comment": "No comment",
-                "type": "distribution",
-                "hashes": [
-                  {
-                    "alg": "SHA-256",
-                    "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "commits": [
-          {
-            "uid": "a-random-uid",
-            "message": "A commit message"
-          }
-        ],
-        "patches": [
-          {
-            "type": "backport"
-          }
-        ],
-        "notes": "Some notes here please"
-      },
-      "externalReferences": [
-        {
-          "url": "https://cyclonedx.org",
-          "comment": "No comment",
-          "type": "distribution",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ]
-        }
-      ],
-      "properties": [
-        {
-          "name": "key1",
-          "value": "val1"
-        },
-        {
-          "name": "key2",
-          "value": "val2"
-        }
-      ],
-      "components": [
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-          "author": "Test Author",
-          "name": "setuptools",
-          "version": "50.3.2",
-          "licenses": [
-            {
-              "expression": "MIT License"
-            }
-          ],
-          "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        },
-        {
-          "type": "library",
-          "bom-ref": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "name": "toml",
-          "version": "0.10.2",
-          "hashes": [
-            {
-              "alg": "SHA-256",
-              "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-            }
-          ],
-          "purl": "pkg:pypi/toml@0.10.2?extension=tar.gz",
-          "externalReferences": [
-            {
-              "url": "https://cyclonedx.org",
-              "comment": "No comment",
-              "type": "distribution",
-              "hashes": [
-                {
-                  "alg": "SHA-256",
-                  "content": "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "evidence": {
-        "copyright": [
-          {
-            "text": "Commercial"
-          },
-          {
-            "text": "Commercial 2"
-          }
-        ]
-      },
-      "releaseNotes": {
-        "type": "major",
-        "title": "Release Notes Title",
-        "featuredImage": "https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png",
-        "socialImage": "https://cyclonedx.org/cyclonedx-icon.png",
-        "description": "This release is a test release",
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "aliases": [
-          "First Test Release"
-        ],
-        "tags": [
-          "alpha",
-          "test"
-        ],
-        "resolves": [
-          {
-            "type": "security",
-            "id": "CVE-2021-44228",
-            "name": "Apache Log3Shell",
-            "description": "Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...",
-            "source": {
-              "name": "NVD",
-              "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
-            },
-            "references": [
-              "https://central.sonatype.org/news/20211213_log4shell_help",
-              "https://logging.apache.org/log4j/2.x/security.html"
-            ]
-          }
-        ],
-        "notes": [
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-GB"
-          },
-          {
-            "text": {
-              "content": "U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==",
-              "contentType": "text/plain; charset=UTF-8",
-              "encoding": "base64"
-            },
-            "locale": "en-US"
-          }
-        ],
-        "properties": [
-          {
-            "name": "key1",
-            "value": "val1"
-          },
-          {
-            "name": "key2",
-            "value": "val2"
-          }
-        ]
-      }
-    },
-    "manufacture": {
-      "name": "CycloneDX",
-      "url": [
-        "https://cyclonedx.org"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        },
-        {
-          "name": "Paul Horton",
-          "email": "paul.horton@owasp.org"
-        }
-      ]
-    },
-    "supplier": {
-      "name": "Cyclone DX",
-      "url": [
-        "https://cyclonedx.org/"
-      ],
-      "contact": [
-        {
-          "name": "A N Other",
-          "email": "someone@somewhere.tld",
-          "phone": "+44 (0)1234 567890"
-        }
-      ]
-    },
-    "licenses": [
-      {
-        "license": {
-          "id": "Apache-2.0",
-          "text": {
-            "contentType": "text/plain",
-            "encoding": "base64",
-            "content": "VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE="
-          },
-          "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
-        }
-      }
-    ],
-    "properties": [
-      {
-        "name": "key1",
-        "value": "val1"
-      },
-      {
-        "name": "key2",
-        "value": "val2"
-      }
-    ]
-  },
-  "dependencies": [
-    {
-      "ref": "be2c6502-7e9a-47db-9a66-e34f729810a3"
-    }
-  ]
-}
diff --git a/tests/_data/own/json/1.4/indented_4spaces.json b/tests/_data/own/json/1.4/indented_4spaces.json
deleted file mode 100644
index a37dc693d..000000000
--- a/tests/_data/own/json/1.4/indented_4spaces.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-    "components": [
-        {
-            "author": "Test Author",
-            "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-            "licenses": [
-                {
-                    "expression": "MIT License"
-                }
-            ],
-            "name": "setuptools",
-            "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-            "type": "library",
-            "version": "50.3.2"
-        }
-    ],
-    "dependencies": [
-        {
-            "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-        }
-    ],
-    "metadata": {
-        "timestamp": "2021-12-31T10:00:00+00:00",
-        "tools": [
-            {
-                "externalReferences": [
-                    {
-                        "type": "build-system",
-                        "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
-                    },
-                    {
-                        "type": "distribution",
-                        "url": "https://pypi.org/project/cyclonedx-python-lib/"
-                    },
-                    {
-                        "type": "documentation",
-                        "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
-                    },
-                    {
-                        "type": "issue-tracker",
-                        "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
-                    },
-                    {
-                        "type": "license",
-                        "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
-                    },
-                    {
-                        "type": "release-notes",
-                        "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
-                    },
-                    {
-                        "type": "vcs",
-                        "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
-                    },
-                    {
-                        "type": "website",
-                        "url": "https://cyclonedx.org"
-                    }
-                ],
-                "name": "cyclonedx-python-lib",
-                "vendor": "CycloneDX",
-                "version": "TESTING"
-            }
-        ]
-    },
-    "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-    "version": 1,
-    "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-    "bomFormat": "CycloneDX",
-    "specVersion": "1.4"
-}
\ No newline at end of file
diff --git a/tests/_data/own/json/1.4/indented_None.json b/tests/_data/own/json/1.4/indented_None.json
deleted file mode 100644
index 5f0687d8c..000000000
--- a/tests/_data/own/json/1.4/indented_None.json
+++ /dev/null
@@ -1 +0,0 @@
-{"components": [{"author": "Test Author", "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz", "licenses": [{"expression": "MIT License"}], "name": "setuptools", "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz", "type": "library", "version": "50.3.2"}], "dependencies": [{"ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"}], "metadata": {"timestamp": "2021-12-31T10:00:00+00:00", "tools": [{"externalReferences": [{"type": "build-system", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"}, {"type": "distribution", "url": "https://pypi.org/project/cyclonedx-python-lib/"}, {"type": "documentation", "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"}, {"type": "issue-tracker", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"}, {"type": "license", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"}, {"type": "release-notes", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"}, {"type": "vcs", "url": "https://github.com/CycloneDX/cyclonedx-python-lib"}, {"type": "website", "url": "https://cyclonedx.org"}], "name": "cyclonedx-python-lib", "vendor": "CycloneDX", "version": "TESTING"}]}, "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json", "bomFormat": "CycloneDX", "specVersion": "1.4"}
\ No newline at end of file
diff --git a/tests/_data/own/json/1.4/indented_tab.json b/tests/_data/own/json/1.4/indented_tab.json
deleted file mode 100644
index 5f4ddb09a..000000000
--- a/tests/_data/own/json/1.4/indented_tab.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-	"components": [
-		{
-			"author": "Test Author",
-			"bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-			"licenses": [
-				{
-					"expression": "MIT License"
-				}
-			],
-			"name": "setuptools",
-			"purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-			"type": "library",
-			"version": "50.3.2"
-		}
-	],
-	"dependencies": [
-		{
-			"ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-		}
-	],
-	"metadata": {
-		"timestamp": "2021-12-31T10:00:00+00:00",
-		"tools": [
-			{
-				"externalReferences": [
-					{
-						"type": "build-system",
-						"url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
-					},
-					{
-						"type": "distribution",
-						"url": "https://pypi.org/project/cyclonedx-python-lib/"
-					},
-					{
-						"type": "documentation",
-						"url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
-					},
-					{
-						"type": "issue-tracker",
-						"url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
-					},
-					{
-						"type": "license",
-						"url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
-					},
-					{
-						"type": "release-notes",
-						"url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
-					},
-					{
-						"type": "vcs",
-						"url": "https://github.com/CycloneDX/cyclonedx-python-lib"
-					},
-					{
-						"type": "website",
-						"url": "https://cyclonedx.org"
-					}
-				],
-				"name": "cyclonedx-python-lib",
-				"vendor": "CycloneDX",
-				"version": "TESTING"
-			}
-		]
-	},
-	"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-	"version": 1,
-	"$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-	"bomFormat": "CycloneDX",
-	"specVersion": "1.4"
-}
\ No newline at end of file
diff --git a/tests/_data/own/json/1.4/indented_two.json b/tests/_data/own/json/1.4/indented_two.json
deleted file mode 100644
index 8d60c03db..000000000
--- a/tests/_data/own/json/1.4/indented_two.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "components": [
-    {
-      "author": "Test Author",
-      "bom-ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "licenses": [
-        {
-          "expression": "MIT License"
-        }
-      ],
-      "name": "setuptools",
-      "purl": "pkg:pypi/setuptools@50.3.2?extension=tar.gz",
-      "type": "library",
-      "version": "50.3.2"
-    }
-  ],
-  "dependencies": [
-    {
-      "ref": "pkg:pypi/setuptools@50.3.2?extension=tar.gz"
-    }
-  ],
-  "metadata": {
-    "timestamp": "2021-12-31T10:00:00+00:00",
-    "tools": [
-      {
-        "externalReferences": [
-          {
-            "type": "build-system",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions"
-          },
-          {
-            "type": "distribution",
-            "url": "https://pypi.org/project/cyclonedx-python-lib/"
-          },
-          {
-            "type": "documentation",
-            "url": "https://cyclonedx.github.io/cyclonedx-python-lib/"
-          },
-          {
-            "type": "issue-tracker",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues"
-          },
-          {
-            "type": "license",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE"
-          },
-          {
-            "type": "release-notes",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md"
-          },
-          {
-            "type": "vcs",
-            "url": "https://github.com/CycloneDX/cyclonedx-python-lib"
-          },
-          {
-            "type": "website",
-            "url": "https://cyclonedx.org"
-          }
-        ],
-        "name": "cyclonedx-python-lib",
-        "vendor": "CycloneDX",
-        "version": "TESTING"
-      }
-    ]
-  },
-  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
-  "version": 1,
-  "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4"
-}
\ No newline at end of file
diff --git a/tests/_data/own/xml/1.0/bom_empty.xml b/tests/_data/own/xml/1.0/bom_empty.xml
deleted file mode 100644
index a803aa60f..000000000
--- a/tests/_data/own/xml/1.0/bom_empty.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components/>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_issue_275_components.xml b/tests/_data/own/xml/1.0/bom_issue_275_components.xml
deleted file mode 100644
index c7c26afb1..000000000
--- a/tests/_data/own/xml/1.0/bom_issue_275_components.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>comp_a</name>
-            <version>1.0.0</version>
-            <modified>false</modified>
-        </component>
-        <component type="library">
-            <name>comp_b</name>
-            <version>1.0.0</version>
-            <modified>false</modified>
-            <components>
-                <component type="library">
-                    <name>comp_c</name>
-                    <version>1.0.0</version>
-                    <modified>false</modified>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_issue_328_components.xml b/tests/_data/own/xml/1.0/bom_issue_328_components.xml
deleted file mode 100644
index 3d2dc7ab9..000000000
--- a/tests/_data/own/xml/1.0/bom_issue_328_components.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>A</name>
-            <version>0.1</version>
-            <modified>false</modified>
-            <components>
-                <component type="library">
-                    <name>B</name>
-                    <version>1.0</version>
-                    <modified>false</modified>
-                    <components>
-                        <component type="library">
-                            <name>C</name>
-                            <version>1.0</version>
-                            <modified>false</modified>
-                        </component>
-                    </components>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_setuptools.xml b/tests/_data/own/xml/1.0/bom_setuptools.xml
deleted file mode 100644
index a88232144..000000000
--- a/tests/_data/own/xml/1.0/bom_setuptools.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <modified>false</modified>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_setuptools_complete.xml b/tests/_data/own/xml/1.0/bom_setuptools_complete.xml
deleted file mode 100644
index 796fce001..000000000
--- a/tests/_data/own/xml/1.0/bom_setuptools_complete.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <modified>false</modified>
-            <components>
-                <component type="library">
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    <modified>false</modified>
-                </component>
-                <component type="library">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <modified>false</modified>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.0/bom_setuptools_no_version.xml
deleted file mode 100644
index 2871e097f..000000000
--- a/tests/_data/own/xml/1.0/bom_setuptools_no_version.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>setuptools</name>
-            <version/>
-            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-            <modified>false</modified>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml
deleted file mode 100644
index 0b7982aec..000000000
--- a/tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <modified>false</modified>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml
deleted file mode 100644
index 04b1faa65..000000000
--- a/tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
-    <components>
-        <component type="library">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <modified>false</modified>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_dependencies.xml b/tests/_data/own/xml/1.1/bom_dependencies.xml
deleted file mode 100644
index 44cb1a8d7..000000000
--- a/tests/_data/own/xml/1.1/bom_dependencies.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_empty.xml b/tests/_data/own/xml/1.1/bom_empty.xml
deleted file mode 100644
index 07db9157f..000000000
--- a/tests/_data/own/xml/1.1/bom_empty.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components/>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_external_references.xml b/tests/_data/own/xml/1.1/bom_external_references.xml
deleted file mode 100644
index 1100a3e88..000000000
--- a/tests/_data/own/xml/1.1/bom_external_references.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components/>
-    <externalReferences>
-        <reference type="distribution">
-            <url>https://cyclonedx.org</url>
-            <comment>No comment</comment>
-        </reference>
-        <reference type="website">
-            <url>https://cyclonedx.org</url>
-        </reference>
-    </externalReferences>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_issue_275_components.xml b/tests/_data/own/xml/1.1/bom_issue_275_components.xml
deleted file mode 100644
index 19b2b3573..000000000
--- a/tests/_data/own/xml/1.1/bom_issue_275_components.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>comp_a</name>
-            <version>1.0.0</version>
-        </component>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>comp_b</name>
-            <version>1.0.0</version>
-            <components>
-                <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-                    <name>comp_c</name>
-                    <version>1.0.0</version>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_issue_328_components.xml b/tests/_data/own/xml/1.1/bom_issue_328_components.xml
deleted file mode 100644
index b72c3bcc6..000000000
--- a/tests/_data/own/xml/1.1/bom_issue_328_components.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:fa443043-7dca-4c17-b9bc-e8b63faa9711">
-    <components>
-        <component type="library" bom-ref="component-A">
-            <name>A</name>
-            <version>0.1</version>
-            <components>
-                <component type="library" bom-ref="component-B">
-                    <name>B</name>
-                    <version>1.0</version>
-                    <components>
-                        <component type="library" bom-ref="component-C">
-                            <name>C</name>
-                            <version>1.0</version>
-                        </component>
-                    </components>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_setuptools.xml b/tests/_data/own/xml/1.1/bom_setuptools.xml
deleted file mode 100644
index 74c050f1a..000000000
--- a/tests/_data/own/xml/1.1/bom_setuptools.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_setuptools_complete.xml b/tests/_data/own/xml/1.1/bom_setuptools_complete.xml
deleted file mode 100644
index b18d1d36f..000000000
--- a/tests/_data/own/xml/1.1/bom_setuptools_complete.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.1/bom_setuptools_no_version.xml
deleted file mode 100644
index 2a24f4bc1..000000000
--- a/tests/_data/own/xml/1.1/bom_setuptools_no_version.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
-            <name>setuptools</name>
-            <version/>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml
deleted file mode 100644
index b8e9cf150..000000000
--- a/tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml
deleted file mode 100644
index 555d41868..000000000
--- a/tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:98149a18-a918-4083-837f-e006d26ab3b4"
-     xmlns:v="http://cyclonedx.org/schema/ext/vulnerability/1.0">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <v:vulnerabilities>
-                <v:vulnerability ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <v:id>CVE-2018-7489</v:id>
-                    <v:source name="NVD">
-                        <v:url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:url>
-                    </v:source>
-                    <v:ratings>
-                        <v:rating>
-                            <v:score>
-                                <v:base>9.8</v:base>
-                            </v:score>
-                            <v:severity>Critical</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</v:vector>
-                        </v:rating>
-                        <v:rating>
-                            <v:score>
-                                <v:base>2.7</v:base>
-                            </v:score>
-                            <v:severity>Low</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N</v:vector>
-                        </v:rating>
-                    </v:ratings>
-                    <v:cwes>
-                        <v:cwe>22</v:cwe>
-                        <v:cwe>33</v:cwe>
-                    </v:cwes>
-                    <v:description>A description here</v:description>
-                    <v:recommendations>
-                        <v:recommendation>Upgrade</v:recommendation>
-                    </v:recommendations>
-                    <v:advisories>
-                        <v:advisory>http://www.securitytracker.com/id/1040693</v:advisory>
-                        <v:advisory>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:advisory>
-                    </v:advisories>
-                </v:vulnerability>
-            </v:vulnerabilities>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml
deleted file mode 100644
index 4020f6fef..000000000
--- a/tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.1" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_dependencies.xml b/tests/_data/own/xml/1.2/bom_dependencies.xml
deleted file mode 100644
index a3a52dc7d..000000000
--- a/tests/_data/own/xml/1.2/bom_dependencies.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_dependencies_component.xml b/tests/_data/own/xml/1.2/bom_dependencies_component.xml
deleted file mode 100644
index b301d92c0..000000000
--- a/tests/_data/own/xml/1.2/bom_dependencies_component.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_external_references.xml b/tests/_data/own/xml/1.2/bom_external_references.xml
deleted file mode 100644
index 3187c7a97..000000000
--- a/tests/_data/own/xml/1.2/bom_external_references.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <externalReferences>
-        <reference type="distribution">
-            <url>https://cyclonedx.org</url>
-            <comment>No comment</comment>
-        </reference>
-        <reference type="website">
-            <url>https://cyclonedx.org</url>
-        </reference>
-    </externalReferences>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_issue_275_components.xml b/tests/_data/own/xml/1.2/bom_issue_275_components.xml
deleted file mode 100644
index 2c0584bc8..000000000
--- a/tests/_data/own/xml/1.2/bom_issue_275_components.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>app</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>comp_a</name>
-            <version>1.0.0</version>
-        </component>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>comp_b</name>
-            <version>1.0.0</version>
-            <components>
-                <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-                    <name>comp_c</name>
-                    <version>1.0.0</version>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-            <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        </dependency>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-        </dependency>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_issue_328_components.xml b/tests/_data/own/xml/1.2/bom_issue_328_components.xml
deleted file mode 100644
index b5093aaea..000000000
--- a/tests/_data/own/xml/1.2/bom_issue_328_components.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:b348cb37-e5e3-4b10-81ac-fc4e2f72dbd6">
-    <metadata>
-        <timestamp>2023-01-07T13:52:31.865875+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="application" bom-ref="my-project">
-            <name>my-project</name>
-            <version>1</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="component-A">
-            <name>A</name>
-            <version>0.1</version>
-            <components>
-                <component type="library" bom-ref="component-B">
-                    <name>B</name>
-                    <version>1.0</version>
-                    <components>
-                        <component type="library" bom-ref="component-C">
-                            <name>C</name>
-                            <version>1.0</version>
-                        </component>
-                    </components>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="my-project">
-            <dependency ref="component-A"/>
-        </dependency>
-        <dependency ref="component-A">
-            <dependency ref="component-B"/>
-        </dependency>
-        <dependency ref="component-B">
-            <dependency ref="component-C"/>
-        </dependency>
-        <dependency ref="component-C"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_services_complex.xml b/tests/_data/own/xml/1.2/bom_services_complex.xml
deleted file mode 100644
index fb379dd24..000000000
--- a/tests/_data/own/xml/1.2/bom_services_complex.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </service>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3"/>
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_services_nested.xml b/tests/_data/own/xml/1.2/bom_services_nested.xml
deleted file mode 100644
index b3fce9899..000000000
--- a/tests/_data/own/xml/1.2/bom_services_nested.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="df70b5f1-8f53-47a4-be48-669ae78795e6">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-            <services>
-                <service bom-ref="my-specific-bom-ref-for-second-nested-service">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>no-group</group>
-                    <name>second-nested-service</name>
-                    <version>3.2.1</version>
-                    <authenticated>true</authenticated>
-                    <x-trust-boundary>false</x-trust-boundary>
-                </service>
-                <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-                    <name>first-nested-service</name>
-                </service>
-            </services>
-        </service>
-        <service bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>my-second-service</name>
-            <services>
-                <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>what-group</group>
-                    <name>yet-another-nested-service</name>
-                    <version>6.5.4</version>
-                </service>
-                <service bom-ref="my-specific-bom-ref-for-another-nested-service">
-                    <name>another-nested-service</name>
-                </service>
-            </services>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="df70b5f1-8f53-47a4-be48-669ae78795e6"/>
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_services_simple.xml b/tests/_data/own/xml/1.2/bom_services_simple.xml
deleted file mode 100644
index 7595971a2..000000000
--- a/tests/_data/own/xml/1.2/bom_services_simple.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-first-service</name>
-        </service>
-        <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3"/>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_setuptools.xml b/tests/_data/own/xml/1.2/bom_setuptools.xml
deleted file mode 100644
index ffdfcc422..000000000
--- a/tests/_data/own/xml/1.2/bom_setuptools.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_setuptools_complete.xml b/tests/_data/own/xml/1.2/bom_setuptools_complete.xml
deleted file mode 100644
index 4a16c92c7..000000000
--- a/tests/_data/own/xml/1.2/bom_setuptools_complete.xml
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.2/bom_setuptools_no_version.xml
deleted file mode 100644
index c80352ac6..000000000
--- a/tests/_data/own/xml/1.2/bom_setuptools_no_version.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version/>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml
deleted file mode 100644
index f143d86ea..000000000
--- a/tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml
deleted file mode 100644
index 39e4c53c3..000000000
--- a/tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:985deff3-4e92-4284-a6da-eab046d13ecf"
-     xmlns:v="http://cyclonedx.org/schema/ext/vulnerability/1.0">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.626402+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <v:vulnerabilities>
-                <v:vulnerability ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <v:id>CVE-2018-7489</v:id>
-                    <v:source name="NVD">
-                        <v:url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:url>
-                    </v:source>
-                    <v:ratings>
-                        <v:rating>
-                            <v:score>
-                                <v:base>9.8</v:base>
-                            </v:score>
-                            <v:severity>Critical</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</v:vector>
-                        </v:rating>
-                        <v:rating>
-                            <v:score>
-                                <v:base>2.7</v:base>
-                            </v:score>
-                            <v:severity>Low</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N</v:vector>
-                        </v:rating>
-                    </v:ratings>
-                    <v:cwes>
-                        <v:cwe>22</v:cwe>
-                        <v:cwe>33</v:cwe>
-                    </v:cwes>
-                    <v:description>A description here</v:description>
-                    <v:recommendations>
-                        <v:recommendation>Upgrade</v:recommendation>
-                    </v:recommendations>
-                    <v:advisories>
-                        <v:advisory>http://www.securitytracker.com/id/1040693</v:advisory>
-                        <v:advisory>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:advisory>
-                    </v:advisories>
-                </v:vulnerability>
-            </v:vulnerabilities>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml
deleted file mode 100644
index 30cf691b6..000000000
--- a/tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.2/bom_with_full_metadata.xml b/tests/_data/own/xml/1.2/bom_with_full_metadata.xml
deleted file mode 100644
index 056af1731..000000000
--- a/tests/_data/own/xml/1.2/bom_with_full_metadata.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.2" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <authors>
-            <author>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </author>
-            <author>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </author>
-        </authors>
-        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                </reference>
-            </externalReferences>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-        </component>
-        <manufacture>
-            <name>CycloneDX</name>
-            <url>https://cyclonedx.org</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-            <contact>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </contact>
-        </manufacture>
-        <supplier>
-            <name>Cyclone DX</name>
-            <url>https://cyclonedx.org/</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-        </supplier>
-    </metadata>
-    <dependencies>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_dependencies.xml b/tests/_data/own/xml/1.3/bom_dependencies.xml
deleted file mode 100644
index 3685ff849..000000000
--- a/tests/_data/own/xml/1.3/bom_dependencies.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_dependencies_component.xml b/tests/_data/own/xml/1.3/bom_dependencies_component.xml
deleted file mode 100644
index bbe61960d..000000000
--- a/tests/_data/own/xml/1.3/bom_dependencies_component.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_external_references.xml b/tests/_data/own/xml/1.3/bom_external_references.xml
deleted file mode 100644
index 443d36cc8..000000000
--- a/tests/_data/own/xml/1.3/bom_external_references.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <externalReferences>
-        <reference type="distribution">
-            <url>https://cyclonedx.org</url>
-            <comment>No comment</comment>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-        </reference>
-        <reference type="website">
-            <url>https://cyclonedx.org</url>
-        </reference>
-    </externalReferences>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_issue_275_components.xml b/tests/_data/own/xml/1.3/bom_issue_275_components.xml
deleted file mode 100644
index d41ae90b5..000000000
--- a/tests/_data/own/xml/1.3/bom_issue_275_components.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>app</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>comp_a</name>
-            <version>1.0.0</version>
-        </component>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>comp_b</name>
-            <version>1.0.0</version>
-            <components>
-                <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-                    <name>comp_c</name>
-                    <version>1.0.0</version>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-            <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        </dependency>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-        </dependency>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_issue_328_components.xml b/tests/_data/own/xml/1.3/bom_issue_328_components.xml
deleted file mode 100644
index ad5e62583..000000000
--- a/tests/_data/own/xml/1.3/bom_issue_328_components.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:2c421d7e-7a78-46db-a60c-6648b2b76eea">
-    <metadata>
-        <timestamp>2023-01-07T13:52:32.198166+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="application" bom-ref="my-project">
-            <name>my-project</name>
-            <version>1</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="component-A">
-            <name>A</name>
-            <version>0.1</version>
-            <components>
-                <component type="library" bom-ref="component-B">
-                    <name>B</name>
-                    <version>1.0</version>
-                    <components>
-                        <component type="library" bom-ref="component-C">
-                            <name>C</name>
-                            <version>1.0</version>
-                        </component>
-                    </components>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="my-project">
-            <dependency ref="component-A"/>
-        </dependency>
-        <dependency ref="component-A">
-            <dependency ref="component-B"/>
-        </dependency>
-        <dependency ref="component-B">
-            <dependency ref="component-C"/>
-        </dependency>
-        <dependency ref="component-C"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_services_complex.xml b/tests/_data/own/xml/1.3/bom_services_complex.xml
deleted file mode 100644
index f62058f0b..000000000
--- a/tests/_data/own/xml/1.3/bom_services_complex.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-        </service>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789" />
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_services_nested.xml b/tests/_data/own/xml/1.3/bom_services_nested.xml
deleted file mode 100644
index ccb0684d6..000000000
--- a/tests/_data/own/xml/1.3/bom_services_nested.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="df70b5f1-8f53-47a4-be48-669ae78795e6">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <services>
-                <service bom-ref="my-specific-bom-ref-for-second-nested-service">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>no-group</group>
-                    <name>second-nested-service</name>
-                    <version>3.2.1</version>
-                    <authenticated>true</authenticated>
-                    <x-trust-boundary>false</x-trust-boundary>
-                </service>
-                <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-                    <name>first-nested-service</name>
-                </service>
-            </services>
-        </service>
-        <service bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>my-second-service</name>
-            <services>
-                <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>what-group</group>
-                    <name>yet-another-nested-service</name>
-                    <version>6.5.4</version>
-                </service>
-                <service bom-ref="my-specific-bom-ref-for-another-nested-service">
-                    <name>another-nested-service</name>
-                </service>
-            </services>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="df70b5f1-8f53-47a4-be48-669ae78795e6"/>
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_services_simple.xml b/tests/_data/own/xml/1.3/bom_services_simple.xml
deleted file mode 100644
index 7eaaaa6a5..000000000
--- a/tests/_data/own/xml/1.3/bom_services_simple.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-first-service</name>
-        </service>
-        <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3"/>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_setuptools.xml b/tests/_data/own/xml/1.3/bom_setuptools.xml
deleted file mode 100644
index dbe2a1578..000000000
--- a/tests/_data/own/xml/1.3/bom_setuptools.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_setuptools_complete.xml b/tests/_data/own/xml/1.3/bom_setuptools_complete.xml
deleted file mode 100644
index f9ac65f03..000000000
--- a/tests/_data/own/xml/1.3/bom_setuptools_complete.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                            <hashes>
-                                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                            </hashes>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-            <evidence>
-                <copyright>
-                    <text>Commercial</text>
-                    <text>Commercial 2</text>
-                </copyright>
-            </evidence>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.3/bom_setuptools_no_version.xml
deleted file mode 100644
index 9fe150363..000000000
--- a/tests/_data/own/xml/1.3/bom_setuptools_no_version.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version/>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml
deleted file mode 100644
index 27abd9b21..000000000
--- a/tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml
deleted file mode 100644
index 6cce456e5..000000000
--- a/tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:962e7fd7-d097-4cbe-b2b7-19bf54f71075"
-     xmlns:v="http://cyclonedx.org/schema/ext/vulnerability/1.0">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.964601+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <v:vulnerabilities>
-                <v:vulnerability ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <v:id>CVE-2018-7489</v:id>
-                    <v:source name="NVD">
-                        <v:url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:url>
-                    </v:source>
-                    <v:ratings>
-                        <v:rating>
-                            <v:score>
-                                <v:base>9.8</v:base>
-                            </v:score>
-                            <v:severity>Critical</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</v:vector>
-                        </v:rating>
-                        <v:rating>
-                            <v:score>
-                                <v:base>2.7</v:base>
-                            </v:score>
-                            <v:severity>Low</v:severity>
-                            <v:method>CVSSv3</v:method>
-                            <v:vector>AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N</v:vector>
-                        </v:rating>
-                    </v:ratings>
-                    <v:cwes>
-                        <v:cwe>22</v:cwe>
-                        <v:cwe>33</v:cwe>
-                    </v:cwes>
-                    <v:description>A description here</v:description>
-                    <v:recommendations>
-                        <v:recommendation>Upgrade</v:recommendation>
-                    </v:recommendations>
-                    <v:advisories>
-                        <v:advisory>http://www.securitytracker.com/id/1040693</v:advisory>
-                        <v:advisory>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</v:advisory>
-                    </v:advisories>
-                </v:vulnerability>
-            </v:vulnerabilities>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml
deleted file mode 100644
index 3e3c02bc1..000000000
--- a/tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.3/bom_with_full_metadata.xml b/tests/_data/own/xml/1.3/bom_with_full_metadata.xml
deleted file mode 100644
index 434dd66cf..000000000
--- a/tests/_data/own/xml/1.3/bom_with_full_metadata.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.3" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-            </tool>
-        </tools>
-        <authors>
-            <author>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </author>
-            <author>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </author>
-        </authors>
-        <component type="library" bom-ref="bb5911d6-1a1d-41c9-b6e0-46e848d16655">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version/>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                            <hashes>
-                                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                            </hashes>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-            <evidence>
-                <copyright>
-                    <text>Commercial</text>
-                    <text>Commercial 2</text>
-                </copyright>
-            </evidence>
-        </component>
-        <manufacture>
-            <name>CycloneDX</name>
-            <url>https://cyclonedx.org</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-            <contact>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </contact>
-        </manufacture>
-        <supplier>
-            <name>Cyclone DX</name>
-            <url>https://cyclonedx.org/</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-        </supplier>
-        <licenses>
-            <license>
-                <id>Apache-2.0</id>
-                <text content-type="text/plain" encoding="base64">VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=</text>
-                <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            </license>
-        </licenses>
-        <properties>
-            <property name="key1">val1</property>
-            <property name="key2">val2</property>
-        </properties>
-    </metadata>
-    <dependencies>
-        <dependency ref="bb5911d6-1a1d-41c9-b6e0-46e848d16655"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_dependencies.xml b/tests/_data/own/xml/1.4/bom_dependencies.xml
deleted file mode 100644
index ecdb150c4..000000000
--- a/tests/_data/own/xml/1.4/bom_dependencies.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_dependencies_component.xml b/tests/_data/own/xml/1.4/bom_dependencies_component.xml
deleted file mode 100644
index 0aadc91a1..000000000
--- a/tests/_data/own/xml/1.4/bom_dependencies_component.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-        </dependency>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_external_references.xml b/tests/_data/own/xml/1.4/bom_external_references.xml
deleted file mode 100644
index 146497d34..000000000
--- a/tests/_data/own/xml/1.4/bom_external_references.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <externalReferences>
-        <reference type="distribution">
-            <url>https://cyclonedx.org</url>
-            <comment>No comment</comment>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-        </reference>
-        <reference type="website">
-            <url>https://cyclonedx.org</url>
-        </reference>
-    </externalReferences>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_issue_275_components.xml b/tests/_data/own/xml/1.4/bom_issue_275_components.xml
deleted file mode 100644
index 7d6924a8b..000000000
--- a/tests/_data/own/xml/1.4/bom_issue_275_components.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>app</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>comp_a</name>
-            <version>1.0.0</version>
-        </component>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>comp_b</name>
-            <version>1.0.0</version>
-            <components>
-                <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-                    <name>comp_c</name>
-                    <version>1.0.0</version>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857"/>
-            <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        </dependency>
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-        </dependency>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_issue_328_components.xml b/tests/_data/own/xml/1.4/bom_issue_328_components.xml
deleted file mode 100644
index 004ce30d6..000000000
--- a/tests/_data/own/xml/1.4/bom_issue_328_components.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="application" bom-ref="my-project">
-            <name>my-project</name>
-            <version>1</version>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="component-A">
-            <name>A</name>
-            <version>0.1</version>
-            <components>
-                <component type="library" bom-ref="component-B">
-                    <name>B</name>
-                    <version>1.0</version>
-                    <components>
-                        <component type="library" bom-ref="component-C">
-                            <name>C</name>
-                            <version>1.0</version>
-                        </component>
-                    </components>
-                </component>
-            </components>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="my-project">
-            <dependency ref="component-A"/>
-        </dependency>
-        <dependency ref="component-A">
-            <dependency ref="component-B"/>
-        </dependency>
-        <dependency ref="component-B">
-            <dependency ref="component-C"/>
-        </dependency>
-        <dependency ref="component-C"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_services_complex.xml b/tests/_data/own/xml/1.4/bom_services_complex.xml
deleted file mode 100644
index 03d2c4600..000000000
--- a/tests/_data/own/xml/1.4/bom_services_complex.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <releaseNotes>
-                <type>major</type>
-                <title>Release Notes Title</title>
-                <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
-                <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
-                <description>This release is a test release</description>
-                <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-                <aliases>
-                    <alias>First Test Release</alias>
-                </aliases>
-                <tags>
-                    <tag>alpha</tag>
-                    <tag>test</tag>
-                </tags>
-                <resolves>
-                    <issue type="security">
-                        <id>CVE-2021-44228</id>
-                        <name>Apache Log3Shell</name>
-                        <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
-                        <source>
-                            <name>NVD</name>
-                            <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
-                        </source>
-                        <references>
-                            <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
-                            <url>https://logging.apache.org/log4j/2.x/security.html</url>
-                        </references>
-                    </issue>
-                </resolves>
-                <notes>
-                    <note>
-                        <locale>en-GB</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                    <note>
-                        <locale>en-US</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                </notes>
-                <properties>
-                    <property name="key1">val1</property>
-                    <property name="key2">val2</property>
-                </properties>
-            </releaseNotes>
-        </service>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_services_nested.xml b/tests/_data/own/xml/1.4/bom_services_nested.xml
deleted file mode 100644
index a0cc89ec4..000000000
--- a/tests/_data/own/xml/1.4/bom_services_nested.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="df70b5f1-8f53-47a4-be48-669ae78795e6">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="my-specific-bom-ref-for-my-first-service">
-            <provider>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </provider>
-            <group>a-group</group>
-            <name>my-first-service</name>
-            <version>1.2.3</version>
-            <description>Description goes here</description>
-            <endpoints>
-                <endpoint>/api/thing/1</endpoint>
-                <endpoint>/api/thing/2</endpoint>
-            </endpoints>
-            <authenticated>false</authenticated>
-            <x-trust-boundary>true</x-trust-boundary>
-            <data>
-                <classification flow="outbound">public</classification>
-            </data>
-            <licenses>
-                <expression>Commercial</expression>
-            </licenses>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <services>
-                <service bom-ref="my-specific-bom-ref-for-second-nested-service">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>no-group</group>
-                    <name>second-nested-service</name>
-                    <version>3.2.1</version>
-                    <authenticated>true</authenticated>
-                    <x-trust-boundary>false</x-trust-boundary>
-                </service>
-                <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-                    <name>first-nested-service</name>
-                </service>
-            </services>
-            <releaseNotes>
-                <type>major</type>
-                <title>Release Notes Title</title>
-                <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
-                <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
-                <description>This release is a test release</description>
-                <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-                <aliases>
-                    <alias>First Test Release</alias>
-                </aliases>
-                <tags>
-                    <tag>alpha</tag>
-                    <tag>test</tag>
-                </tags>
-                <resolves>
-                    <issue type="security">
-                        <id>CVE-2021-44228</id>
-                        <name>Apache Log3Shell</name>
-                        <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
-                        <source>
-                            <name>NVD</name>
-                            <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
-                        </source>
-                        <references>
-                            <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
-                            <url>https://logging.apache.org/log4j/2.x/security.html</url>
-                        </references>
-                    </issue>
-                </resolves>
-                <notes>
-                    <note>
-                        <locale>en-GB</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                    <note>
-                        <locale>en-US</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                </notes>
-                <properties>
-                    <property name="key1">val1</property>
-                    <property name="key2">val2</property>
-                </properties>
-            </releaseNotes>
-        </service>
-        <service bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>my-second-service</name>
-            <services>
-                <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-                    <provider>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </provider>
-                    <group>what-group</group>
-                    <name>yet-another-nested-service</name>
-                    <version>6.5.4</version>
-                </service>
-                <service bom-ref="my-specific-bom-ref-for-another-nested-service">
-                    <name>another-nested-service</name>
-                </service>
-            </services>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="df70b5f1-8f53-47a4-be48-669ae78795e6"/>
-        <dependency ref="my-specific-bom-ref-for-my-first-service"/>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857" />
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_services_simple.xml b/tests/_data/own/xml/1.4/bom_services_simple.xml
deleted file mode 100644
index a8c80c9e6..000000000
--- a/tests/_data/own/xml/1.4/bom_services_simple.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <component type="library" bom-ref="0b049d09-64c0-4490-a0f5-c84d9aacf857">
-            <name>cyclonedx-python-lib</name>
-            <version>1.0.0</version>
-        </component>
-    </metadata>
-    <services>
-        <service bom-ref="be2c6502-7e9a-47db-9a66-e34f729810a3">
-            <name>my-first-service</name>
-        </service>
-        <service bom-ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda">
-            <name>my-second-service</name>
-        </service>
-    </services>
-    <dependencies>
-        <dependency ref="0b049d09-64c0-4490-a0f5-c84d9aacf857" />
-        <dependency ref="be2c6502-7e9a-47db-9a66-e34f729810a3" />
-        <dependency ref="17e3b199-dc0b-42ef-bfdd-1fa81a1e3eda" />
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_setuptools_complete.xml b/tests/_data/own/xml/1.4/bom_setuptools_complete.xml
deleted file mode 100644
index 61ba86898..000000000
--- a/tests/_data/own/xml/1.4/bom_setuptools_complete.xml
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                            <hashes>
-                                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                            </hashes>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-            <evidence>
-                <copyright>
-                    <text>Commercial</text>
-                    <text>Commercial 2</text>
-                </copyright>
-            </evidence>
-            <releaseNotes>
-                <type>major</type>
-                <title>Release Notes Title</title>
-                <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
-                <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
-                <description>This release is a test release</description>
-                <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-                <aliases>
-                    <alias>First Test Release</alias>
-                </aliases>
-                <tags>
-                    <tag>alpha</tag>
-                    <tag>test</tag>
-                </tags>
-                <resolves>
-                    <issue type="security">
-                        <id>CVE-2021-44228</id>
-                        <name>Apache Log3Shell</name>
-                        <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
-                        <source>
-                            <name>NVD</name>
-                            <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
-                        </source>
-                        <references>
-                            <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
-                            <url>https://logging.apache.org/log4j/2.x/security.html</url>
-                        </references>
-                    </issue>
-                </resolves>
-                <notes>
-                    <note>
-                        <locale>en-GB</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                    <note>
-                        <locale>en-US</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                </notes>
-                <properties>
-                    <property name="key1">val1</property>
-                    <property name="key2">val2</property>
-                </properties>
-            </releaseNotes>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="cd3e9c95-9d41-49e7-9924-8cf0465ae789"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.4/bom_setuptools_no_version.xml
deleted file mode 100644
index 73becdb0e..000000000
--- a/tests/_data/own/xml/1.4/bom_setuptools_no_version.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml
deleted file mode 100644
index db9869876..000000000
--- a/tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml
deleted file mode 100644
index 5467da423..000000000
--- a/tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <releaseNotes>
-                <type>major</type>
-                <title>Release Notes Title</title>
-                <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
-                <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
-                <description>This release is a test release</description>
-                <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-                <aliases>
-                    <alias>First Test Release</alias>
-                </aliases>
-                <tags>
-                    <tag>alpha</tag>
-                    <tag>test</tag>
-                </tags>
-                <resolves>
-                    <issue type="security">
-                        <id>CVE-2021-44228</id>
-                        <name>Apache Log3Shell</name>
-                        <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
-                        <source>
-                            <name>NVD</name>
-                            <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
-                        </source>
-                        <references>
-                            <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
-                            <url>https://logging.apache.org/log4j/2.x/security.html</url>
-                        </references>
-                    </issue>
-                </resolves>
-                <notes>
-                    <note>
-                        <locale>en-GB</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                    <note>
-                        <locale>en-US</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                </notes>
-                <properties>
-                    <property name="key1">val1</property>
-                    <property name="key2">val2</property>
-                </properties>
-            </releaseNotes>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml
deleted file mode 100644
index 1936e2863..000000000
--- a/tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-    <vulnerabilities>
-        <vulnerability bom-ref="my-vuln-ref-1">
-            <id>CVE-2018-7489</id>
-            <source>
-                <name>NVD</name>
-                <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
-            </source>
-            <references>
-                <reference>
-                    <id>SOME-OTHER-ID</id>
-                    <source>
-                        <name>OSS Index</name>
-                        <url>https://ossindex.sonatype.org/component/pkg:pypi/setuptools</url>
-                    </source>
-                </reference>
-            </references>
-            <ratings>
-                <rating>
-                    <source>
-                        <name>NVD</name>
-                        <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
-                    </source>
-                    <score>9.8</score>
-                    <severity>critical</severity>
-                    <method>CVSSv3</method>
-                    <vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</vector>
-                    <justification>Some justification</justification>
-                </rating>
-                <rating>
-                    <source>
-                        <name>OWASP</name>
-                        <url>https://owasp.org</url>
-                    </source>
-                    <score>2.7</score>
-                    <severity>low</severity>
-                    <method>CVSSv3</method>
-                    <vector>AV:L/AC:H/PR:N/UI:R/S:C/C:L/I:N/A:N</vector>
-                    <justification>Some other justification</justification>
-                </rating>
-            </ratings>
-            <cwes>
-                <cwe>22</cwe>
-                <cwe>33</cwe>
-            </cwes>
-            <description>A description here</description>
-            <detail>Some detail here</detail>
-            <recommendation>Upgrade</recommendation>
-            <advisories>
-                <advisory>
-                    <url>http://www.securitytracker.com/id/1040693</url>
-                </advisory>
-                <advisory>
-                    <url>https://nvd.nist.gov/vuln/detail/CVE-2018-7489</url>
-                </advisory>
-            </advisories>
-            <created>2021-09-01T10:50:42.051979+00:00</created>
-            <published>2021-09-02T10:50:42.051979+00:00</published>
-            <updated>2021-09-03T10:50:42.051979+00:00</updated>
-            <credits>
-                <organizations>
-                    <organization>
-                        <name>CycloneDX</name>
-                        <url>https://cyclonedx.org</url>
-                        <contact>
-                            <name>A N Other</name>
-                            <email>someone@somewhere.tld</email>
-                            <phone>+44 (0)1234 567890</phone>
-                        </contact>
-                        <contact>
-                            <name>Paul Horton</name>
-                            <email>paul.horton@owasp.org</email>
-                        </contact>
-                    </organization>
-                </organizations>
-                <individuals>
-                    <individual>
-                        <name>A N Other</name>
-                        <email>someone@somewhere.tld</email>
-                        <phone>+44 (0)1234 567890</phone>
-                    </individual>
-                </individuals>
-            </credits>
-            <tools>
-                <tool>
-                    <vendor>CycloneDX</vendor>
-                    <name>cyclonedx-python-lib</name>
-                </tool>
-            </tools>
-            <analysis>
-                <state>exploitable</state>
-                <justification>requires_environment</justification>
-                <responses>
-                    <response>can_not_fix</response>
-                </responses>
-                <detail>Some extra detail</detail>
-            </analysis>
-            <affects>
-                <target>
-                    <ref>pkg:pypi/setuptools@50.3.2?extension=tar.gz</ref>
-                    <versions>
-                        <version>
-                            <range>49.0.0 - 54.0.0</range>
-                            <status>affected</status>
-                        </version>
-                    </versions>
-                </target>
-            </affects>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-        </vulnerability>
-    </vulnerabilities>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml
deleted file mode 100644
index 3ead1df94..000000000
--- a/tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/toml@0.10.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml b/tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml
deleted file mode 100644
index 29395f604..000000000
--- a/tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4"
-     serialNumber="urn:uuid:12345678-395b-41f5-a30f-1234567890ab"
-     version="23">
-    <metadata>
-        <timestamp>2023-06-01T03:03:07+00:00</timestamp>
-        <component type="application" bom-ref="root-component">
-            <name>rootComponent</name>
-        </component>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="setuptools">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-        <component type="library" bom-ref="toml">
-            <name>toml</name>
-            <version>0.10.2</version>
-            <hashes>
-                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-            </hashes>
-            <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="root-component"/>
-        <dependency ref="setuptools">
-            <dependency ref="toml"/>
-        </dependency>
-        <dependency ref="toml"/>
-    </dependencies>
-</bom>
-
diff --git a/tests/_data/own/xml/1.4/bom_with_full_metadata.xml b/tests/_data/own/xml/1.4/bom_with_full_metadata.xml
deleted file mode 100644
index 24ee7aa01..000000000
--- a/tests/_data/own/xml/1.4/bom_with_full_metadata.xml
+++ /dev/null
@@ -1,294 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" version="1"
-     serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79">
-    <metadata>
-        <timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-        <authors>
-            <author>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </author>
-            <author>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </author>
-        </authors>
-        <component type="library" bom-ref="df70b5f1-8f53-47a4-be48-669ae78795e6">
-            <supplier>
-                <name>CycloneDX</name>
-                <url>https://cyclonedx.org</url>
-                <contact>
-                    <name>A N Other</name>
-                    <email>someone@somewhere.tld</email>
-                    <phone>+44 (0)1234 567890</phone>
-                </contact>
-                <contact>
-                    <name>Paul Horton</name>
-                    <email>paul.horton@owasp.org</email>
-                </contact>
-            </supplier>
-            <author>Test Author</author>
-            <publisher>CycloneDX</publisher>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <description>This component is awesome</description>
-            <scope>required</scope>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <copyright>Apache 2.0 baby!</copyright>
-            <cpe>cpe:2.3:a:python:setuptools:50.3.2:*:*:*:*:*:*:*</cpe>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Test Application" version="3.4.5">
-                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
-            </swid>
-            <pedigree>
-                <ancestors>
-                    <component type="library" bom-ref="ccc8d7ee-4b9c-4750-aee0-a72585152291">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="8a3893b3-9923-4adb-a1d3-47456636ba0a">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                </ancestors>
-                <descendants>
-                    <component type="library" bom-ref="28b2d8ce-def0-446f-a221-58dee0b44acc">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="555ca729-93c6-48f3-956e-bdaa4a2f0bfa">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </descendants>
-                <variants>
-                    <component type="library" bom-ref="ded1d73e-1fca-4302-b520-f1bc53979958">
-                        <author>Test Author</author>
-                        <name>setuptools</name>
-                        <version>50.3.2</version>
-                        <licenses>
-                            <expression>MIT License</expression>
-                        </licenses>
-                        <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                    </component>
-                    <component type="library" bom-ref="e7abdcca-5ba2-4f29-b2cf-b1e1ef788e66">
-                        <name>toml</name>
-                        <version>0.10.2</version>
-                        <hashes>
-                            <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                        </hashes>
-                        <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                        <externalReferences>
-                            <reference type="distribution">
-                                <url>https://cyclonedx.org</url>
-                                <comment>No comment</comment>
-                                <hashes>
-                                    <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                                </hashes>
-                            </reference>
-                        </externalReferences>
-                    </component>
-                </variants>
-                <commits>
-                    <commit>
-                        <uid>a-random-uid</uid>
-                        <message>A commit message</message>
-                    </commit>
-                </commits>
-                <patches>
-                    <patch type="backport"/>
-                </patches>
-                <notes>Some notes here please</notes>
-            </pedigree>
-            <externalReferences>
-                <reference type="distribution">
-                    <url>https://cyclonedx.org</url>
-                    <comment>No comment</comment>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                </reference>
-            </externalReferences>
-            <properties>
-                <property name="key1">val1</property>
-                <property name="key2">val2</property>
-            </properties>
-            <components>
-                <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-                    <author>Test Author</author>
-                    <name>setuptools</name>
-                    <version>50.3.2</version>
-                    <licenses>
-                        <expression>MIT License</expression>
-                    </licenses>
-                    <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-                </component>
-                <component type="library" bom-ref="pkg:pypi/toml@0.10.2?extension=tar.gz">
-                    <name>toml</name>
-                    <version>0.10.2</version>
-                    <hashes>
-                        <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                    </hashes>
-                    <purl>pkg:pypi/toml@0.10.2?extension=tar.gz</purl>
-                    <externalReferences>
-                        <reference type="distribution">
-                            <url>https://cyclonedx.org</url>
-                            <comment>No comment</comment>
-                            <hashes>
-                                <hash alg="SHA-256">806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b</hash>
-                            </hashes>
-                        </reference>
-                    </externalReferences>
-                </component>
-            </components>
-            <evidence>
-                <copyright>
-                    <text>Commercial</text>
-                    <text>Commercial 2</text>
-                </copyright>
-            </evidence>
-            <releaseNotes>
-                <type>major</type>
-                <title>Release Notes Title</title>
-                <featuredImage>https://cyclonedx.org/theme/assets/images/CycloneDX-Twitter-Card.png</featuredImage>
-                <socialImage>https://cyclonedx.org/cyclonedx-icon.png</socialImage>
-                <description>This release is a test release</description>
-                <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-                <aliases>
-                    <alias>First Test Release</alias>
-                </aliases>
-                <tags>
-                    <tag>alpha</tag>
-                    <tag>test</tag>
-                </tags>
-                <resolves>
-                    <issue type="security">
-                        <id>CVE-2021-44228</id>
-                        <name>Apache Log3Shell</name>
-                        <description>Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features...</description>
-                        <source>
-                            <name>NVD</name>
-                            <url>https://nvd.nist.gov/vuln/detail/CVE-2021-44228</url>
-                        </source>
-                        <references>
-                            <url>https://central.sonatype.org/news/20211213_log4shell_help</url>
-                            <url>https://logging.apache.org/log4j/2.x/security.html</url>
-                        </references>
-                    </issue>
-                </resolves>
-                <notes>
-                    <note>
-                        <locale>en-GB</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                    <note>
-                        <locale>en-US</locale>
-                        <text content-type="text/plain; charset=UTF-8" encoding="base64">U29tZSBzaW1wbGUgcGxhaW4gdGV4dA==</text>
-                    </note>
-                </notes>
-                <properties>
-                    <property name="key1">val1</property>
-                    <property name="key2">val2</property>
-                </properties>
-            </releaseNotes>
-        </component>
-        <manufacture>
-            <name>CycloneDX</name>
-            <url>https://cyclonedx.org</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-            <contact>
-                <name>Paul Horton</name>
-                <email>paul.horton@owasp.org</email>
-            </contact>
-        </manufacture>
-        <supplier>
-            <name>Cyclone DX</name>
-            <url>https://cyclonedx.org/</url>
-            <contact>
-                <name>A N Other</name>
-                <email>someone@somewhere.tld</email>
-                <phone>+44 (0)1234 567890</phone>
-            </contact>
-        </supplier>
-        <licenses>
-            <license>
-                <id>Apache-2.0</id>
-                <text content-type="text/plain" encoding="base64">VGVzdCBjb250ZW50IC0gdGhpcyBpcyBub3QgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSE=</text>
-                <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            </license>
-        </licenses>
-        <properties>
-            <property name="key1">val1</property>
-            <property name="key2">val2</property>
-        </properties>
-    </metadata>
-    <dependencies>
-        <dependency ref="df70b5f1-8f53-47a4-be48-669ae78795e6"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/indented_4spaces.xml b/tests/_data/own/xml/1.4/indented_4spaces.xml
deleted file mode 100644
index d59c71266..000000000
--- a/tests/_data/own/xml/1.4/indented_4spaces.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1">
-    <metadata>
-        <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-        <tools>
-            <tool>
-                <vendor>CycloneDX</vendor>
-                <name>cyclonedx-python-lib</name>
-                <version>TESTING</version>
-                <externalReferences>
-                    <reference type="build-system">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-                    </reference>
-                    <reference type="distribution">
-                        <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="documentation">
-                        <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-                    </reference>
-                    <reference type="issue-tracker">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-                    </reference>
-                    <reference type="license">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-                    </reference>
-                    <reference type="release-notes">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-                    </reference>
-                    <reference type="vcs">
-                        <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-                    </reference>
-                    <reference type="website">
-                        <url>https://cyclonedx.org</url>
-                    </reference>
-                </externalReferences>
-            </tool>
-        </tools>
-    </metadata>
-    <components>
-        <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-            <author>Test Author</author>
-            <name>setuptools</name>
-            <version>50.3.2</version>
-            <licenses>
-                <expression>MIT License</expression>
-            </licenses>
-            <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-        </component>
-    </components>
-    <dependencies>
-        <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-    </dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/indented_None.xml b/tests/_data/own/xml/1.4/indented_None.xml
deleted file mode 100644
index 52d425fb9..000000000
--- a/tests/_data/own/xml/1.4/indented_None.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1"><metadata><timestamp>2021-12-31T10:00:00+00:00</timestamp><tools><tool><vendor>CycloneDX</vendor><name>cyclonedx-python-lib</name><version>TESTING</version><externalReferences><reference type="build-system"><url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url></reference><reference type="distribution"><url>https://pypi.org/project/cyclonedx-python-lib/</url></reference><reference type="documentation"><url>https://cyclonedx.github.io/cyclonedx-python-lib/</url></reference><reference type="issue-tracker"><url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url></reference><reference type="license"><url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url></reference><reference type="release-notes"><url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url></reference><reference type="vcs"><url>https://github.com/CycloneDX/cyclonedx-python-lib</url></reference><reference type="website"><url>https://cyclonedx.org</url></reference></externalReferences></tool></tools></metadata><components><component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"><author>Test Author</author><name>setuptools</name><version>50.3.2</version><licenses><expression>MIT License</expression></licenses><purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl></component></components><dependencies><dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz" /></dependencies></bom>
\ No newline at end of file
diff --git a/tests/_data/own/xml/1.4/indented_tab.xml b/tests/_data/own/xml/1.4/indented_tab.xml
deleted file mode 100644
index 48d7c99f3..000000000
--- a/tests/_data/own/xml/1.4/indented_tab.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1">
-	<metadata>
-		<timestamp>2021-12-31T10:00:00+00:00</timestamp>
-		<tools>
-			<tool>
-				<vendor>CycloneDX</vendor>
-				<name>cyclonedx-python-lib</name>
-				<version>TESTING</version>
-				<externalReferences>
-					<reference type="build-system">
-						<url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-					</reference>
-					<reference type="distribution">
-						<url>https://pypi.org/project/cyclonedx-python-lib/</url>
-					</reference>
-					<reference type="documentation">
-						<url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-					</reference>
-					<reference type="issue-tracker">
-						<url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-					</reference>
-					<reference type="license">
-						<url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-					</reference>
-					<reference type="release-notes">
-						<url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-					</reference>
-					<reference type="vcs">
-						<url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-					</reference>
-					<reference type="website">
-						<url>https://cyclonedx.org</url>
-					</reference>
-				</externalReferences>
-			</tool>
-		</tools>
-	</metadata>
-	<components>
-		<component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-			<author>Test Author</author>
-			<name>setuptools</name>
-			<version>50.3.2</version>
-			<licenses>
-				<expression>MIT License</expression>
-			</licenses>
-			<purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-		</component>
-	</components>
-	<dependencies>
-		<dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-	</dependencies>
-</bom>
diff --git a/tests/_data/own/xml/1.4/indented_two.xml b/tests/_data/own/xml/1.4/indented_two.xml
deleted file mode 100644
index ce7e1a87c..000000000
--- a/tests/_data/own/xml/1.4/indented_two.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" ?>
-<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1">
-  <metadata>
-    <timestamp>2021-12-31T10:00:00+00:00</timestamp>
-    <tools>
-      <tool>
-        <vendor>CycloneDX</vendor>
-        <name>cyclonedx-python-lib</name>
-        <version>TESTING</version>
-        <externalReferences>
-          <reference type="build-system">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/actions</url>
-          </reference>
-          <reference type="distribution">
-            <url>https://pypi.org/project/cyclonedx-python-lib/</url>
-          </reference>
-          <reference type="documentation">
-            <url>https://cyclonedx.github.io/cyclonedx-python-lib/</url>
-          </reference>
-          <reference type="issue-tracker">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/issues</url>
-          </reference>
-          <reference type="license">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE</url>
-          </reference>
-          <reference type="release-notes">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md</url>
-          </reference>
-          <reference type="vcs">
-            <url>https://github.com/CycloneDX/cyclonedx-python-lib</url>
-          </reference>
-          <reference type="website">
-            <url>https://cyclonedx.org</url>
-          </reference>
-        </externalReferences>
-      </tool>
-    </tools>
-  </metadata>
-  <components>
-    <component type="library" bom-ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz">
-      <author>Test Author</author>
-      <name>setuptools</name>
-      <version>50.3.2</version>
-      <licenses>
-        <expression>MIT License</expression>
-      </licenses>
-      <purl>pkg:pypi/setuptools@50.3.2?extension=tar.gz</purl>
-    </component>
-  </components>
-  <dependencies>
-    <dependency ref="pkg:pypi/setuptools@50.3.2?extension=tar.gz"/>
-  </dependencies>
-</bom>

From cea377c99b3b0dccf9117fbe0d9289fc867d909b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 23:26:54 +0200
Subject: [PATCH 21/22] test deps fuzzy;

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py              | 16 ++++++++++++----
 tests/_data/models.py          | 13 +++++++++++++
 tests/test_deserialize_json.py |  2 +-
 tests/test_deserialize_xml.py  |  2 +-
 4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/tests/__init__.py b/tests/__init__.py
index 57a07d8f2..f70814842 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -17,7 +17,7 @@
 
 from os import getenv, path
 from os.path import join
-from typing import Any, Generator, List, Optional, TypeVar, Union, TYPE_CHECKING, Callable
+from typing import TYPE_CHECKING, Any, Generator, Iterable, List, Optional, TypeVar, Union
 from unittest import TestCase
 from uuid import UUID
 
@@ -27,6 +27,7 @@
 
 if TYPE_CHECKING:
     from cyclonedx.model.bom import Bom
+    from cyclonedx.model.dependency import Dependency
 
 _T = TypeVar('_T')
 
@@ -99,22 +100,29 @@ def __deepDict(self, o: Any) -> Any:
             return d
         return o
 
-    def assertDeepEqualBom(self, expected: 'Bom', actual: 'Bom',
+    def assertBomDeepEqual(self: Union[TestCase, 'DeepCompareMixin'], expected: 'Bom', actual: 'Bom',
                            msg: Optional[str] = None, *,
                            fuzzy_deps: bool = True) -> None:
         # deps might have been upgraded on serialization, so they might differ
         edeps = expected.dependencies
         adeps = actual.dependencies
-        if True or fuzzy_deps:
+        if fuzzy_deps:
             expected.dependencies = []
             actual.dependencies = []
         try:
             self.assertDeepEqual(expected, actual, msg)
-            # do the fuzzy in deps
+            if fuzzy_deps:
+                self._assertDependenciesFuzzyEqual(edeps, adeps)
         finally:
             expected.dependencies = edeps
             actual.dependencies = adeps
 
+    def _assertDependenciesFuzzyEqual(self: TestCase, a: Iterable['Dependency'], b: Iterable['Dependency']) -> None:
+        delta = set(a) ^ set(b)
+        for d in delta:
+            # only actual relevant dependencies shall be taken into account.
+            self.assertEqual(0, len(d.dependencies), f'unexpected dependencies for {d.ref}')
+
 
 def reorder(items: List[_T], indexes: List[int]) -> List[_T]:
     """
diff --git a/tests/_data/models.py b/tests/_data/models.py
index 90b8a0978..d1e6e2ba7 100644
--- a/tests/_data/models.py
+++ b/tests/_data/models.py
@@ -728,4 +728,17 @@ def get_bom_service_licenses_invalid() -> Bom:
 )
 
 all_get_bom_funct_with_incomplete_deps = {
+    get_bom_just_complete_metadata,
+    get_bom_with_component_setuptools_basic,
+    get_bom_with_component_setuptools_complete,
+    get_bom_with_component_setuptools_no_component_version,
+    get_bom_with_component_setuptools_with_cpe,
+    get_bom_with_component_setuptools_with_release_notes,
+    get_bom_with_component_setuptools_with_vulnerability,
+    get_bom_with_component_toml_1,
+    get_bom_with_dependencies_hanging,
+    get_bom_with_metadata_component_and_dependencies,
+    get_bom_with_nested_services,
+    get_bom_with_services_complex,
+    get_bom_with_services_simple,
 }
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 6d2869d7b..fe9ff1776 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -41,5 +41,5 @@ def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
         expected = get_bom()
         json = json_loads(self.readSnapshot(snapshot_name))
         bom = Bom.from_json(json)
-        self.assertDeepEqualBom(expected, bom,
+        self.assertBomDeepEqual(expected, bom,
                                 fuzzy_deps=get_bom in all_get_bom_funct_with_incomplete_deps)
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index 7ea805a54..3b2652d81 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -40,5 +40,5 @@ def test(self, get_bom: Callable[[], Bom], *_: Any, **__: Any) -> None:
         expected = get_bom()
         with open(self.getSnapshotFile(snapshot_name), 'r') as s:
             bom = Bom.from_xml(s)
-        self.assertDeepEqualBom(expected, bom,
+        self.assertBomDeepEqual(expected, bom,
                                 fuzzy_deps=get_bom in all_get_bom_funct_with_incomplete_deps)

From f5fdfb6a72ec1bad85643b1dda812aed0ff0a831 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 8 Oct 2023 23:35:49 +0200
Subject: [PATCH 22/22] test for validation is optional

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_output_json.py | 9 ++++++---
 tests/test_output_xml.py  | 7 +++++--
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index 23be22cc4..0a291fa27 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -21,7 +21,7 @@
 
 from ddt import data, ddt, idata, named_data, unpack
 
-from cyclonedx.exception import CycloneDxException
+from cyclonedx.exception import CycloneDxException, MissingOptionalDependencyException
 from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
 from cyclonedx.exception.output import FormatNotSupportedException
 from cyclonedx.model.bom import Bom
@@ -31,7 +31,7 @@
 from tests import SnapshotMixin, mksname, uuid_generator
 from tests._data.models import all_get_bom_funct_invalid, all_get_bom_funct_valid
 
-UNSUPPORTED_SV = frozenset((SchemaVersion.V1_1, SchemaVersion.V1_0, ))
+UNSUPPORTED_SV = frozenset((SchemaVersion.V1_1, SchemaVersion.V1_0,))
 
 
 @ddt
@@ -56,7 +56,10 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **_
         snapshot_name = mksname(get_bom, sv, OutputFormat.JSON)
         bom = get_bom()
         json = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
-        errors = JsonStrictValidator(sv).validate_str(json)
+        try:
+            errors = JsonStrictValidator(sv).validate_str(json)
+        except MissingOptionalDependencyException:
+            errors = None  # skipped validation
         self.assertIsNone(errors)
         self.assertEqualSnapshot(json, snapshot_name)
 
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index d5b87825d..c78a87551 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -22,7 +22,7 @@
 
 from ddt import ddt, idata, named_data, unpack
 
-from cyclonedx.exception import CycloneDxException
+from cyclonedx.exception import CycloneDxException, MissingOptionalDependencyException
 from cyclonedx.exception.model import LicenseExpressionAlongWithOthersException, UnknownComponentDependencyException
 from cyclonedx.model.bom import Bom
 from cyclonedx.output.xml import BY_SCHEMA_VERSION, Xml
@@ -45,7 +45,10 @@ def test_valid(self, get_bom: Callable[[], Bom], sv: SchemaVersion, *_: Any, **_
         snapshot_name = mksname(get_bom, sv, OutputFormat.XML)
         bom = get_bom()
         xml = BY_SCHEMA_VERSION[sv](bom).output_as_string(indent=2)
-        errors = XmlValidator(sv).validate_str(xml)
+        try:
+            errors = XmlValidator(sv).validate_str(xml)
+        except MissingOptionalDependencyException:
+            errors = None  # skipped validation
         self.assertIsNone(errors)
         self.assertEqualSnapshot(xml, snapshot_name)
 
