diff --git a/src/ssvc/api/main.py b/src/ssvc/api/main.py index be460440..9b4f58fc 100644 --- a/src/ssvc/api/main.py +++ b/src/ssvc/api/main.py @@ -27,17 +27,7 @@ from fastapi.responses import RedirectResponse import ssvc # noqa: F401 -from ssvc.api.routers import ( - decision_point, - decision_points, - decision_table, - decision_tables, - keys, - namespaces, - objects, - types, - versions, -) +from ssvc.api.v1 import router as router_v1 from ssvc.registry.base import ( get_registry, ) @@ -54,15 +44,8 @@ "email": "cert@cert.org", }, ) -app.include_router(decision_point.router) -app.include_router(decision_points.router) -app.include_router(decision_table.router) -app.include_router(decision_tables.router) -app.include_router(types.router) -app.include_router(namespaces.router) -app.include_router(keys.router) -app.include_router(versions.router) -app.include_router(objects.router) + +app.include_router(router_v1) # root should redirect to docs diff --git a/src/ssvc/api/v1/__init__.py b/src/ssvc/api/v1/__init__.py new file mode 100644 index 00000000..15b1b5c8 --- /dev/null +++ b/src/ssvc/api/v1/__init__.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +""" +API version 1 router for SSVC +""" +# Copyright (c) 2025 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 + +from ssvc.api.v1.routers.v1_router import router_v1 as router # noqa: F401 diff --git a/src/ssvc/api/response_models/__init__.py b/src/ssvc/api/v1/response_models/__init__.py similarity index 97% rename from src/ssvc/api/response_models/__init__.py rename to src/ssvc/api/v1/response_models/__init__.py index d6de6b3f..b66ceac9 100644 --- a/src/ssvc/api/response_models/__init__.py +++ b/src/ssvc/api/v1/response_models/__init__.py @@ -21,9 +21,16 @@ from pydantic import RootModel, model_validator -from ssvc.api.response_models._type_defs import (DecisionPointDictType, DecisionPointValuesListType, - DecisionTableDictType, KeyDictType, NamespaceDictType, StringsListType, - TypesDictType, VersionDictType) +from ssvc.api.v1.response_models._type_defs import ( + DecisionPointDictType, + DecisionPointValuesListType, + DecisionTableDictType, + KeyDictType, + NamespaceDictType, + StringsListType, + TypesDictType, + VersionDictType, +) from ssvc.decision_points.base import DecisionPoint, DecisionPointValue from ssvc.decision_tables.base import DecisionTable diff --git a/src/ssvc/api/response_models/_type_defs.py b/src/ssvc/api/v1/response_models/_type_defs.py similarity index 100% rename from src/ssvc/api/response_models/_type_defs.py rename to src/ssvc/api/v1/response_models/_type_defs.py diff --git a/src/ssvc/api/routers/__init__.py b/src/ssvc/api/v1/routers/__init__.py similarity index 100% rename from src/ssvc/api/routers/__init__.py rename to src/ssvc/api/v1/routers/__init__.py diff --git a/src/ssvc/api/routers/decision_point.py b/src/ssvc/api/v1/routers/decision_point.py similarity index 100% rename from src/ssvc/api/routers/decision_point.py rename to src/ssvc/api/v1/routers/decision_point.py diff --git a/src/ssvc/api/routers/decision_points.py b/src/ssvc/api/v1/routers/decision_points.py similarity index 99% rename from src/ssvc/api/routers/decision_points.py rename to src/ssvc/api/v1/routers/decision_points.py index 1259303b..d1af14e9 100644 --- a/src/ssvc/api/routers/decision_points.py +++ b/src/ssvc/api/v1/routers/decision_points.py @@ -21,7 +21,7 @@ from fastapi import APIRouter from ssvc.api.helpers import _404_on_none -from ssvc.api.response_models import ( +from ssvc.api.v1.response_models import ( DecisionPointDictResponse, DecisionPointDictType, DecisionPointValueListResponse, diff --git a/src/ssvc/api/routers/decision_table.py b/src/ssvc/api/v1/routers/decision_table.py similarity index 100% rename from src/ssvc/api/routers/decision_table.py rename to src/ssvc/api/v1/routers/decision_table.py diff --git a/src/ssvc/api/routers/decision_tables.py b/src/ssvc/api/v1/routers/decision_tables.py similarity index 99% rename from src/ssvc/api/routers/decision_tables.py rename to src/ssvc/api/v1/routers/decision_tables.py index 58083ce4..f8290215 100644 --- a/src/ssvc/api/routers/decision_tables.py +++ b/src/ssvc/api/v1/routers/decision_tables.py @@ -22,7 +22,7 @@ from fastapi import APIRouter from ssvc.api.helpers import _404_on_none -from ssvc.api.response_models import ( +from ssvc.api.v1.response_models import ( DecisionTableDictResponse, DecisionTableDictType, ) diff --git a/src/ssvc/api/routers/keys.py b/src/ssvc/api/v1/routers/keys.py similarity index 99% rename from src/ssvc/api/routers/keys.py rename to src/ssvc/api/v1/routers/keys.py index 03d343b3..10883ef1 100644 --- a/src/ssvc/api/routers/keys.py +++ b/src/ssvc/api/v1/routers/keys.py @@ -22,7 +22,7 @@ from fastapi import APIRouter from ssvc.api.helpers import _404_on_none -from ssvc.api.response_models import ( +from ssvc.api.v1.response_models import ( KeyDictResponse, ListOfStringsResponse, StringsListType, diff --git a/src/ssvc/api/routers/namespaces.py b/src/ssvc/api/v1/routers/namespaces.py similarity index 96% rename from src/ssvc/api/routers/namespaces.py rename to src/ssvc/api/v1/routers/namespaces.py index 59eb40a5..7efc3fd6 100644 --- a/src/ssvc/api/routers/namespaces.py +++ b/src/ssvc/api/v1/routers/namespaces.py @@ -22,7 +22,12 @@ from fastapi import APIRouter from ssvc.api.helpers import _404_on_none -from ssvc.api.response_models import (ListOfStringsResponse, NamespaceDictResponse, NamespaceDictType, StringsListType) +from ssvc.api.v1.response_models import ( + ListOfStringsResponse, + NamespaceDictResponse, + NamespaceDictType, + StringsListType, +) from ssvc.registry.base import get_registry, lookup_objtype router = APIRouter( diff --git a/src/ssvc/api/routers/objects.py b/src/ssvc/api/v1/routers/objects.py similarity index 100% rename from src/ssvc/api/routers/objects.py rename to src/ssvc/api/v1/routers/objects.py diff --git a/src/ssvc/api/routers/types.py b/src/ssvc/api/v1/routers/types.py similarity index 95% rename from src/ssvc/api/routers/types.py rename to src/ssvc/api/v1/routers/types.py index 3af3e80b..2fafd23a 100644 --- a/src/ssvc/api/routers/types.py +++ b/src/ssvc/api/v1/routers/types.py @@ -21,12 +21,12 @@ from fastapi import APIRouter -from ssvc.api.response_models import ( +from ssvc.api.v1.response_models import ( ListOfStringsResponse, StringsListType, TypesDictResponse, ) -from ssvc.api.response_models._type_defs import TypesDictType +from ssvc.api.v1.response_models._type_defs import TypesDictType from ssvc.registry.base import get_registry r = get_registry() diff --git a/src/ssvc/api/v1/routers/v1_router.py b/src/ssvc/api/v1/routers/v1_router.py new file mode 100644 index 00000000..9031079f --- /dev/null +++ b/src/ssvc/api/v1/routers/v1_router.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +""" +API version 1 router for SSVC +""" +# Copyright (c) 2025 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 +from fastapi import APIRouter + +from ssvc.api.v1.routers import ( + decision_point, + decision_table, + decision_tables, + objects, +) +from ssvc.api.v1.routers import ( + decision_points, + keys, + namespaces, + types, + versions, +) + +router_v1 = APIRouter(prefix="/v1", tags=["v1"]) +router_v1.include_router(decision_point.router) +router_v1.include_router(decision_points.router) +router_v1.include_router(decision_table.router) +router_v1.include_router(decision_tables.router) +router_v1.include_router(types.router) +router_v1.include_router(namespaces.router) +router_v1.include_router(keys.router) +router_v1.include_router(versions.router) +router_v1.include_router(objects.router) + + +def main(): + pass + + +if __name__ == "__main__": + main() diff --git a/src/ssvc/api/routers/versions.py b/src/ssvc/api/v1/routers/versions.py similarity index 98% rename from src/ssvc/api/routers/versions.py rename to src/ssvc/api/v1/routers/versions.py index b0e5bc6e..e9781b2a 100644 --- a/src/ssvc/api/routers/versions.py +++ b/src/ssvc/api/v1/routers/versions.py @@ -22,7 +22,7 @@ from fastapi import APIRouter from ssvc.api.helpers import _404_on_none -from ssvc.api.response_models import ( +from ssvc.api.v1.response_models import ( ListOfStringsResponse, StringsListType, VersionDictResponse, diff --git a/src/test/api/routers/test_decision_point.py b/src/test/api/routers/test_decision_point.py index 6132f0f7..380cc704 100644 --- a/src/test/api/routers/test_decision_point.py +++ b/src/test/api/routers/test_decision_point.py @@ -22,7 +22,7 @@ from fastapi import HTTPException from fastapi.testclient import TestClient -from ssvc.api.routers import decision_point +from ssvc.api.v1.routers import decision_point from ssvc.decision_points.base import DecisionPoint, DecisionPointValue from ssvc.registry.base import SsvcObjectRegistry diff --git a/src/test/api/routers/test_decision_points.py b/src/test/api/routers/test_decision_points.py index 9aad4442..4fc595d5 100644 --- a/src/test/api/routers/test_decision_points.py +++ b/src/test/api/routers/test_decision_points.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import decision_points +from ssvc.api.v1.routers import decision_points from ssvc.decision_points.base import DecisionPoint, DecisionPointValue @@ -52,7 +52,7 @@ def setUp(self): ), ) - @patch("ssvc.api.routers.decision_points.lookup_objtype") + @patch("ssvc.api.v1.routers.decision_points.lookup_objtype") def test_get_all_decision_points_success(self, mock_lookup): dp = self.dp result_mock = MagicMock() @@ -66,13 +66,13 @@ def test_get_all_decision_points_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertIn(dp.id, response.json()) - @patch("ssvc.api.routers.decision_points.lookup_objtype") + @patch("ssvc.api.v1.routers.decision_points.lookup_objtype") def test_get_all_decision_points_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/decision_points/") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_points.lookup_namespace") + @patch("ssvc.api.v1.routers.decision_points.lookup_namespace") def test_get_all_decision_points_for_namespace_success(self, mock_lookup): dp = self.dp result_mock = MagicMock() @@ -84,7 +84,7 @@ def test_get_all_decision_points_for_namespace_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertIn(dp.id, response.json()) - @patch("ssvc.api.routers.decision_points.lookup_namespace") + @patch("ssvc.api.v1.routers.decision_points.lookup_namespace") def test_get_all_decision_points_for_namespace_not_found( self, mock_lookup ): @@ -92,7 +92,7 @@ def test_get_all_decision_points_for_namespace_not_found( response = self.client.get("/decision_points/ns1") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_points.lookup_key") + @patch("ssvc.api.v1.routers.decision_points.lookup_key") def test_get_all_versions_of_decision_points_for_key_success( self, mock_lookup ): @@ -104,7 +104,7 @@ def test_get_all_versions_of_decision_points_for_key_success( self.assertEqual(response.status_code, 200) self.assertIn(dp.id, response.json()) - @patch("ssvc.api.routers.decision_points.lookup_key") + @patch("ssvc.api.v1.routers.decision_points.lookup_key") def test_get_all_versions_of_decision_points_for_key_not_found( self, mock_lookup ): @@ -112,7 +112,7 @@ def test_get_all_versions_of_decision_points_for_key_not_found( response = self.client.get("/decision_points/ns1/key1") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_points.lookup_latest") + @patch("ssvc.api.v1.routers.decision_points.lookup_latest") def test_get_latest_decision_point_for_key_success(self, mock_lookup): dp = self.dp mock_lookup.return_value = dp @@ -123,7 +123,7 @@ def test_get_latest_decision_point_for_key_success(self, mock_lookup): self.assertEqual(response.json()["version"], dp.version) self.assertEqual(response.json()["name"], dp.name) - @patch("ssvc.api.routers.decision_points.lookup_latest") + @patch("ssvc.api.v1.routers.decision_points.lookup_latest") def test_get_latest_decision_point_for_key_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/decision_points/ns1/key1/latest") diff --git a/src/test/api/routers/test_decision_table.py b/src/test/api/routers/test_decision_table.py index f4a3c777..ef842066 100644 --- a/src/test/api/routers/test_decision_table.py +++ b/src/test/api/routers/test_decision_table.py @@ -22,7 +22,7 @@ from fastapi import HTTPException from fastapi.testclient import TestClient -from ssvc.api.routers import decision_table +from ssvc.api.v1.routers import decision_table from ssvc.decision_points.base import DecisionPoint, DecisionPointValue from ssvc.decision_tables.base import DecisionTable from ssvc.registry.base import SsvcObjectRegistry diff --git a/src/test/api/routers/test_decision_tables.py b/src/test/api/routers/test_decision_tables.py index 7330f3a7..7fcd986f 100644 --- a/src/test/api/routers/test_decision_tables.py +++ b/src/test/api/routers/test_decision_tables.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import decision_tables +from ssvc.api.v1.routers import decision_tables from ssvc.decision_points.base import DecisionPoint, DecisionPointValue from ssvc.decision_tables.base import DecisionTable from ssvc.registry.base import SsvcObjectRegistry @@ -81,7 +81,7 @@ def setUp(self): registered=False, ) - @patch("ssvc.api.routers.decision_tables.lookup_objtype") + @patch("ssvc.api.v1.routers.decision_tables.lookup_objtype") def test_get_all_decision_tables_success(self, mock_lookup): result_mock = MagicMock() result_mock.namespaces = { @@ -98,13 +98,13 @@ def test_get_all_decision_tables_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertIn(self.dt.id, response.json()) - @patch("ssvc.api.routers.decision_tables.lookup_objtype") + @patch("ssvc.api.v1.routers.decision_tables.lookup_objtype") def test_get_all_decision_tables_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/decision_tables/") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_tables.lookup_namespace") + @patch("ssvc.api.v1.routers.decision_tables.lookup_namespace") def test_get_decision_tables_for_namespace_success(self, mock_lookup): ns_mock = MagicMock() ns_mock.keys = { @@ -117,13 +117,13 @@ def test_get_decision_tables_for_namespace_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertIn(self.dt.id, response.json()) - @patch("ssvc.api.routers.decision_tables.lookup_namespace") + @patch("ssvc.api.v1.routers.decision_tables.lookup_namespace") def test_get_decision_tables_for_namespace_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get(f"/decision_tables/{self.dt.namespace}") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_tables.lookup_key") + @patch("ssvc.api.v1.routers.decision_tables.lookup_key") def test_get_decision_tables_for_key_success(self, mock_lookup): key_mock = MagicMock() key_mock.versions = {self.dt.version: MagicMock(obj=self.dt)} @@ -134,7 +134,7 @@ def test_get_decision_tables_for_key_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertIn(self.dt.id, response.json()) - @patch("ssvc.api.routers.decision_tables.lookup_key") + @patch("ssvc.api.v1.routers.decision_tables.lookup_key") def test_get_decision_tables_for_key_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get( @@ -142,7 +142,7 @@ def test_get_decision_tables_for_key_not_found(self, mock_lookup): ) self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.decision_tables.lookup_latest") + @patch("ssvc.api.v1.routers.decision_tables.lookup_latest") def test_get_latest_decision_table_for_key_success(self, mock_lookup): latest_dt = self.dt mock_lookup.return_value = latest_dt @@ -155,7 +155,7 @@ def test_get_latest_decision_table_for_key_success(self, mock_lookup): self.assertEqual(response.json()["version"], latest_dt.version) self.assertEqual(response.json()["name"], latest_dt.name) - @patch("ssvc.api.routers.decision_tables.lookup_latest") + @patch("ssvc.api.v1.routers.decision_tables.lookup_latest") def test_get_latest_decision_table_for_key_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get(f"/decision_tables/test/key1/latest") diff --git a/src/test/api/routers/test_keys.py b/src/test/api/routers/test_keys.py index c001c445..206281f3 100644 --- a/src/test/api/routers/test_keys.py +++ b/src/test/api/routers/test_keys.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import keys +from ssvc.api.v1.routers import keys class TestKeysRouter(unittest.TestCase): @@ -57,7 +57,7 @@ def test_get_key_dict(self): }, ) - @patch("ssvc.api.routers.keys._404_on_none") + @patch("ssvc.api.v1.routers.keys._404_on_none") def test_get_key_dict_for_type(self, mock_404): ns_mock1 = MagicMock(keys={"k1": None}) type_mock = MagicMock(namespaces={"ns1": ns_mock1}) @@ -70,8 +70,8 @@ def test_get_key_dict_for_type(self, mock_404): ) mock_404.assert_called_once() - @patch("ssvc.api.routers.keys.lookup_namespace") - @patch("ssvc.api.routers.keys._404_on_none") + @patch("ssvc.api.v1.routers.keys.lookup_namespace") + @patch("ssvc.api.v1.routers.keys._404_on_none") def test_get_key_dict_for_type_and_namespace(self, mock_404, mock_lookup): ns_mock = MagicMock(keys={"k1": None, "k2": None}) mock_lookup.return_value = ns_mock @@ -91,8 +91,8 @@ def test_get_key_dict_for_type_and_namespace(self, mock_404, mock_lookup): ) mock_404.assert_called_once() - @patch("ssvc.api.routers.keys.lookup_namespace") - @patch("ssvc.api.routers.keys._404_on_none") + @patch("ssvc.api.v1.routers.keys.lookup_namespace") + @patch("ssvc.api.v1.routers.keys._404_on_none") def test_get_key_list_for_type_and_namespace(self, mock_404, mock_lookup): ns_mock = MagicMock(keys={"k1": None, "k2": None}) mock_lookup.return_value = ns_mock diff --git a/src/test/api/routers/test_namespaces.py b/src/test/api/routers/test_namespaces.py index 8922aa46..770733b1 100644 --- a/src/test/api/routers/test_namespaces.py +++ b/src/test/api/routers/test_namespaces.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import namespaces +from ssvc.api.v1.routers import namespaces class TestNamespacesRouter(unittest.TestCase): @@ -62,8 +62,8 @@ def test_get_namespace_list(self): self.assertEqual(response.status_code, 200) self.assertEqual(sorted(response.json()), ["ns1", "ns2", "ns3"]) - @patch("ssvc.api.routers.namespaces.lookup_objtype") - @patch("ssvc.api.routers.namespaces._404_on_none") + @patch("ssvc.api.v1.routers.namespaces.lookup_objtype") + @patch("ssvc.api.v1.routers.namespaces._404_on_none") def test_get_namespace_list_for_type(self, mock_404, mock_lookup): self.mock_registry.types = { diff --git a/src/test/api/routers/test_objects.py b/src/test/api/routers/test_objects.py index ca2386dd..dc3edd5b 100644 --- a/src/test/api/routers/test_objects.py +++ b/src/test/api/routers/test_objects.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import objects +from ssvc.api.v1.routers import objects from ssvc.decision_points.base import DecisionPoint, DecisionPointValue from ssvc.decision_tables.base import DecisionTable @@ -110,7 +110,7 @@ def setUp(self): outcome=self.dp3.id, ) - @patch("ssvc.api.routers.objects.lookup_by_id") + @patch("ssvc.api.v1.routers.objects.lookup_by_id") def test_get_decision_point_success(self, mock_lookup): dp = self.dp1 ver_obj = MagicMock(obj=dp) @@ -122,13 +122,13 @@ def test_get_decision_point_success(self, mock_lookup): self.assertEqual(response.json()["version"], dp.version) self.assertEqual(response.json()["name"], dp.name) - @patch("ssvc.api.routers.objects.lookup_by_id") + @patch("ssvc.api.v1.routers.objects.lookup_by_id") def test_get_decision_point_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/objects/DecisionPoint/ns1/key1/1.0.0") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.objects.lookup_by_id") + @patch("ssvc.api.v1.routers.objects.lookup_by_id") def test_get_decision_table_success(self, mock_lookup): dt = self.dt ver_obj = MagicMock(obj=dt) @@ -141,7 +141,7 @@ def test_get_decision_table_success(self, mock_lookup): self.assertEqual(response.json()["name"], dt.name) self.assertEqual(response.json()["definition"], dt.definition) - @patch("ssvc.api.routers.objects.lookup_by_id") + @patch("ssvc.api.v1.routers.objects.lookup_by_id") def test_get_decision_table_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/objects/DecisionTable/ns2/key2/2.0.0") diff --git a/src/test/api/routers/test_types.py b/src/test/api/routers/test_types.py index b3be9071..8a4248a4 100644 --- a/src/test/api/routers/test_types.py +++ b/src/test/api/routers/test_types.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import types +from ssvc.api.v1.routers import types class TestTypesRouter(unittest.TestCase): diff --git a/src/test/api/routers/test_versions.py b/src/test/api/routers/test_versions.py index 492f7f88..e4a7d810 100644 --- a/src/test/api/routers/test_versions.py +++ b/src/test/api/routers/test_versions.py @@ -23,7 +23,7 @@ from fastapi import FastAPI from fastapi.testclient import TestClient -from ssvc.api.routers import versions +from ssvc.api.v1.routers import versions class TestVersionsRouter(unittest.TestCase): @@ -32,7 +32,7 @@ def setUp(self): self.app.include_router(versions.router) self.client = TestClient(self.app) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_dict_for_key_success(self, mock_lookup): key_mock = MagicMock() key_mock.versions = {"1.0.0": None, "2.0.0": None} @@ -56,13 +56,13 @@ def test_get_version_dict_for_key_success(self, mock_lookup): }, ) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_dict_for_key_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/versions/TypeA/ns1/key1") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_dict_for_key_empty_versions(self, mock_lookup): key_mock = MagicMock() key_mock.versions = {} @@ -82,7 +82,7 @@ def test_get_version_dict_for_key_empty_versions(self, mock_lookup): }, ) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_list_for_key_success(self, mock_lookup): key_mock = MagicMock() key_mock.versions = {"1.0.0": None, "2.0.0": None} @@ -91,13 +91,13 @@ def test_get_version_list_for_key_success(self, mock_lookup): self.assertEqual(response.status_code, 200) self.assertEqual(sorted(response.json()), ["1.0.0", "2.0.0"]) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_list_for_key_not_found(self, mock_lookup): mock_lookup.return_value = None response = self.client.get("/versions/TypeA/ns1/key1/list") self.assertEqual(response.status_code, 404) - @patch("ssvc.api.routers.versions.lookup_key") + @patch("ssvc.api.v1.routers.versions.lookup_key") def test_get_version_list_for_key_empty_versions(self, mock_lookup): key_mock = MagicMock() key_mock.versions = {}