From d93ab447f69c5224e0ea8dcabb23e78d8ef9832b Mon Sep 17 00:00:00 2001 From: "sewon.jeon" Date: Tue, 24 Feb 2026 21:50:18 +0900 Subject: [PATCH 1/3] test(gateway): add unit tests for DataHandlers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds 13 unit tests covering DataHandlers methods: - handle_data_categories and handle_data_groups both return 501 with a SOVD-compliant error body (error_code: "not-implemented", message) per ISO 17978-3 §7.9 which is not yet implemented for ROS 2 - Verifies both 501 endpoints return identical error_code and status - handle_list_data, handle_get_data_item, handle_put_data_item each return 400 when req.matches is empty (missing route capture groups), exercising the guard check before ctx_.node() is accessed Tests use a null GatewayNode and null AuthManager, which is safe because: - handle_data_categories/groups call only HandlerContext::send_error() (static) - The other three handlers check req.matches.size() before using ctx_.node() Closes #180 Co-Authored-By: Claude Sonnet 4.6 --- src/ros2_medkit_gateway/CMakeLists.txt | 5 + .../test/test_data_handlers.cpp | 203 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 src/ros2_medkit_gateway/test/test_data_handlers.cpp diff --git a/src/ros2_medkit_gateway/CMakeLists.txt b/src/ros2_medkit_gateway/CMakeLists.txt index 984c442..e0f6b12 100644 --- a/src/ros2_medkit_gateway/CMakeLists.txt +++ b/src/ros2_medkit_gateway/CMakeLists.txt @@ -366,6 +366,10 @@ if(BUILD_TESTING) ament_add_gtest(test_update_manager test/test_update_manager.cpp) target_link_libraries(test_update_manager gateway_lib) + # Add data handler tests + ament_add_gtest(test_data_handlers test/test_data_handlers.cpp) + target_link_libraries(test_data_handlers gateway_lib) + # Demo update backend plugin (.so for integration tests) add_library(test_update_backend MODULE test/demo_nodes/test_update_backend.cpp @@ -408,6 +412,7 @@ if(BUILD_TESTING) test_subscription_manager test_cyclic_subscription_handlers test_update_manager + test_data_handlers ) foreach(_target ${_test_targets}) target_compile_options(${_target} PRIVATE --coverage -O0 -g) diff --git a/src/ros2_medkit_gateway/test/test_data_handlers.cpp b/src/ros2_medkit_gateway/test/test_data_handlers.cpp new file mode 100644 index 0000000..627b00c --- /dev/null +++ b/src/ros2_medkit_gateway/test/test_data_handlers.cpp @@ -0,0 +1,203 @@ +// Copyright 2026 bburda +// +// 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. + +#include + +#include +#include + +#include "ros2_medkit_gateway/http/error_codes.hpp" +#include "ros2_medkit_gateway/http/handlers/data_handlers.hpp" + +using json = nlohmann::json; +using ros2_medkit_gateway::AuthConfig; +using ros2_medkit_gateway::CorsConfig; +using ros2_medkit_gateway::TlsConfig; +using ros2_medkit_gateway::handlers::DataHandlers; +using ros2_medkit_gateway::handlers::HandlerContext; + +// DataHandlers uses a null GatewayNode and null AuthManager. +// This is safe because: +// - handle_data_categories/handle_data_groups only call HandlerContext::send_error() (static) +// - handle_list_data/handle_get_data_item/handle_put_data_item check req.matches.size() +// before accessing ctx_.node(), so default-constructed requests (size 0) return 400 first + +class DataHandlersTest : public ::testing::Test +{ +protected: + CorsConfig cors_{}; + AuthConfig auth_{}; + TlsConfig tls_{}; + HandlerContext ctx_{nullptr, cors_, auth_, tls_, nullptr}; + DataHandlers handlers_{ctx_}; +}; + +// ============================================================================ +// handle_data_categories — always returns 501 Not Implemented (ISO 17978-3 §7.9) +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesReturns501) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_categories(req, res); + EXPECT_EQ(res.status, 501); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_categories(req, res); + EXPECT_NO_THROW(json::parse(res.body)); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_categories(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("error_code")); + EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_NOT_IMPLEMENTED); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_categories(req, res); + auto body = json::parse(res.body); + EXPECT_TRUE(body.contains("message")); +} + +// ============================================================================ +// handle_data_groups — always returns 501 Not Implemented (ISO 17978-3 §7.9) +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataGroupsReturns501) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_groups(req, res); + EXPECT_EQ(res.status, 501); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_groups(req, res); + EXPECT_NO_THROW(json::parse(res.body)); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_groups(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("error_code")); + EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_NOT_IMPLEMENTED); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_data_groups(req, res); + auto body = json::parse(res.body); + EXPECT_TRUE(body.contains("message")); +} + +// ============================================================================ +// Shared error response format — verify SOVD GenericError schema compliance +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesAndGroupsReturnSameErrorCode) +{ + httplib::Request req; + httplib::Response categories_res; + httplib::Response groups_res; + + handlers_.handle_data_categories(req, categories_res); + handlers_.handle_data_groups(req, groups_res); + + auto categories_body = json::parse(categories_res.body); + auto groups_body = json::parse(groups_res.body); + + EXPECT_EQ(categories_body["error_code"], groups_body["error_code"]); + EXPECT_EQ(categories_res.status, groups_res.status); +} + +// ============================================================================ +// handle_list_data — returns 400 when route matches are missing +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) +{ + // Default-constructed req has empty matches (size 0 < 2) + httplib::Request req; + httplib::Response res; + handlers_.handle_list_data(req, res); + EXPECT_EQ(res.status, 400); +} + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) +{ + httplib::Request req; + httplib::Response res; + handlers_.handle_list_data(req, res); + auto body = json::parse(res.body); + EXPECT_TRUE(body.contains("error_code")); +} + +// ============================================================================ +// handle_get_data_item — returns 400 when route matches are missing +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) +{ + // Default-constructed req has empty matches (size 0 < 3) + httplib::Request req; + httplib::Response res; + handlers_.handle_get_data_item(req, res); + EXPECT_EQ(res.status, 400); +} + +// ============================================================================ +// handle_put_data_item — returns 400 when route matches are missing +// ============================================================================ + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, PutDataItemReturnsBadRequestWhenMatchesMissing) +{ + // Default-constructed req has empty matches (size 0 < 3) + httplib::Request req; + httplib::Response res; + handlers_.handle_put_data_item(req, res); + EXPECT_EQ(res.status, 400); +} From 4a9dbb434a0d8b69b9f3dc5ab3894d7448105b52 Mon Sep 17 00:00:00 2001 From: "sewon.jeon" Date: Tue, 24 Feb 2026 22:16:57 +0900 Subject: [PATCH 2/3] test(gateway): strengthen data handlers unit checks --- .../test/test_data_handlers.cpp | 84 ++++++++++++------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/src/ros2_medkit_gateway/test/test_data_handlers.cpp b/src/ros2_medkit_gateway/test/test_data_handlers.cpp index 627b00c..9991cd5 100644 --- a/src/ros2_medkit_gateway/test/test_data_handlers.cpp +++ b/src/ros2_medkit_gateway/test/test_data_handlers.cpp @@ -33,9 +33,8 @@ using ros2_medkit_gateway::handlers::HandlerContext; // - handle_list_data/handle_get_data_item/handle_put_data_item check req.matches.size() // before accessing ctx_.node(), so default-constructed requests (size 0) return 400 first -class DataHandlersTest : public ::testing::Test -{ -protected: +class DataHandlersTest : public ::testing::Test { + protected: CorsConfig cors_{}; AuthConfig auth_{}; TlsConfig tls_{}; @@ -48,8 +47,7 @@ class DataHandlersTest : public ::testing::Test // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesReturns501) -{ +TEST_F(DataHandlersTest, DataCategoriesReturns501) { httplib::Request req; httplib::Response res; handlers_.handle_data_categories(req, res); @@ -57,8 +55,7 @@ TEST_F(DataHandlersTest, DataCategoriesReturns501) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) -{ +TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) { httplib::Request req; httplib::Response res; handlers_.handle_data_categories(req, res); @@ -66,8 +63,7 @@ TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) -{ +TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) { httplib::Request req; httplib::Response res; handlers_.handle_data_categories(req, res); @@ -77,8 +73,7 @@ TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) -{ +TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) { httplib::Request req; httplib::Response res; handlers_.handle_data_categories(req, res); @@ -86,13 +81,22 @@ TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) EXPECT_TRUE(body.contains("message")); } +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsFeatureParameter) { + httplib::Request req; + httplib::Response res; + handlers_.handle_data_categories(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("parameters")); + EXPECT_EQ(body["parameters"]["feature"], "data-categories"); +} + // ============================================================================ // handle_data_groups — always returns 501 Not Implemented (ISO 17978-3 §7.9) // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataGroupsReturns501) -{ +TEST_F(DataHandlersTest, DataGroupsReturns501) { httplib::Request req; httplib::Response res; handlers_.handle_data_groups(req, res); @@ -100,8 +104,7 @@ TEST_F(DataHandlersTest, DataGroupsReturns501) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) -{ +TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) { httplib::Request req; httplib::Response res; handlers_.handle_data_groups(req, res); @@ -109,8 +112,7 @@ TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) -{ +TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) { httplib::Request req; httplib::Response res; handlers_.handle_data_groups(req, res); @@ -120,8 +122,7 @@ TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) -{ +TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) { httplib::Request req; httplib::Response res; handlers_.handle_data_groups(req, res); @@ -129,13 +130,22 @@ TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) EXPECT_TRUE(body.contains("message")); } +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsFeatureParameter) { + httplib::Request req; + httplib::Response res; + handlers_.handle_data_groups(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("parameters")); + EXPECT_EQ(body["parameters"]["feature"], "data-groups"); +} + // ============================================================================ // Shared error response format — verify SOVD GenericError schema compliance // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesAndGroupsReturnSameErrorCode) -{ +TEST_F(DataHandlersTest, DataCategoriesAndGroupsReturnSameErrorCode) { httplib::Request req; httplib::Response categories_res; httplib::Response groups_res; @@ -155,8 +165,7 @@ TEST_F(DataHandlersTest, DataCategoriesAndGroupsReturnSameErrorCode) // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) -{ +TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 2) httplib::Request req; httplib::Response res; @@ -165,8 +174,7 @@ TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) } // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) -{ +TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) { httplib::Request req; httplib::Response res; handlers_.handle_list_data(req, res); @@ -179,8 +187,7 @@ TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) -{ +TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 3) httplib::Request req; httplib::Response res; @@ -188,16 +195,35 @@ TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) EXPECT_EQ(res.status, 400); } +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, GetDataItemBadRequestBodyContainsInvalidRequestErrorCode) { + httplib::Request req; + httplib::Response res; + handlers_.handle_get_data_item(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("error_code")); + EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_INVALID_REQUEST); +} + // ============================================================================ // handle_put_data_item — returns 400 when route matches are missing // ============================================================================ // @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, PutDataItemReturnsBadRequestWhenMatchesMissing) -{ +TEST_F(DataHandlersTest, PutDataItemReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 3) httplib::Request req; httplib::Response res; handlers_.handle_put_data_item(req, res); EXPECT_EQ(res.status, 400); } + +// @verifies REQ_INTEROP_001 +TEST_F(DataHandlersTest, PutDataItemBadRequestBodyContainsInvalidRequestErrorCode) { + httplib::Request req; + httplib::Response res; + handlers_.handle_put_data_item(req, res); + auto body = json::parse(res.body); + ASSERT_TRUE(body.contains("error_code")); + EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_INVALID_REQUEST); +} From f22a9714b486bf61e44bb917d88a02863d82f45a Mon Sep 17 00:00:00 2001 From: sewon jeon Date: Wed, 25 Feb 2026 10:26:26 +0900 Subject: [PATCH 3/3] test(gateway): address PR #234 review comments Fixes incorrect REQ_INTEROP tags and removes redundant test methods. Formatted with host clang-format-14. --- .../test/test_data_handlers.cpp | 52 ++++++------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/src/ros2_medkit_gateway/test/test_data_handlers.cpp b/src/ros2_medkit_gateway/test/test_data_handlers.cpp index 9991cd5..62d708d 100644 --- a/src/ros2_medkit_gateway/test/test_data_handlers.cpp +++ b/src/ros2_medkit_gateway/test/test_data_handlers.cpp @@ -46,7 +46,7 @@ class DataHandlersTest : public ::testing::Test { // handle_data_categories — always returns 501 Not Implemented (ISO 17978-3 §7.9) // ============================================================================ -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_016 TEST_F(DataHandlersTest, DataCategoriesReturns501) { httplib::Request req; httplib::Response res; @@ -54,7 +54,7 @@ TEST_F(DataHandlersTest, DataCategoriesReturns501) { EXPECT_EQ(res.status, 501); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_016 TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) { httplib::Request req; httplib::Response res; @@ -62,7 +62,7 @@ TEST_F(DataHandlersTest, DataCategoriesResponseBodyIsValidJson) { EXPECT_NO_THROW(json::parse(res.body)); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_016 TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) { httplib::Request req; httplib::Response res; @@ -72,7 +72,7 @@ TEST_F(DataHandlersTest, DataCategoriesErrorCodeIsNotImplemented) { EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_NOT_IMPLEMENTED); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_016 TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) { httplib::Request req; httplib::Response res; @@ -81,7 +81,7 @@ TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsMessage) { EXPECT_TRUE(body.contains("message")); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_016 TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsFeatureParameter) { httplib::Request req; httplib::Response res; @@ -95,7 +95,7 @@ TEST_F(DataHandlersTest, DataCategoriesErrorBodyContainsFeatureParameter) { // handle_data_groups — always returns 501 Not Implemented (ISO 17978-3 §7.9) // ============================================================================ -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_017 TEST_F(DataHandlersTest, DataGroupsReturns501) { httplib::Request req; httplib::Response res; @@ -103,7 +103,7 @@ TEST_F(DataHandlersTest, DataGroupsReturns501) { EXPECT_EQ(res.status, 501); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_017 TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) { httplib::Request req; httplib::Response res; @@ -111,7 +111,7 @@ TEST_F(DataHandlersTest, DataGroupsResponseBodyIsValidJson) { EXPECT_NO_THROW(json::parse(res.body)); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_017 TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) { httplib::Request req; httplib::Response res; @@ -121,7 +121,7 @@ TEST_F(DataHandlersTest, DataGroupsErrorCodeIsNotImplemented) { EXPECT_EQ(body["error_code"], ros2_medkit_gateway::ERR_NOT_IMPLEMENTED); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_017 TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) { httplib::Request req; httplib::Response res; @@ -130,7 +130,7 @@ TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsMessage) { EXPECT_TRUE(body.contains("message")); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_017 TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsFeatureParameter) { httplib::Request req; httplib::Response res; @@ -140,31 +140,11 @@ TEST_F(DataHandlersTest, DataGroupsErrorBodyContainsFeatureParameter) { EXPECT_EQ(body["parameters"]["feature"], "data-groups"); } -// ============================================================================ -// Shared error response format — verify SOVD GenericError schema compliance -// ============================================================================ - -// @verifies REQ_INTEROP_001 -TEST_F(DataHandlersTest, DataCategoriesAndGroupsReturnSameErrorCode) { - httplib::Request req; - httplib::Response categories_res; - httplib::Response groups_res; - - handlers_.handle_data_categories(req, categories_res); - handlers_.handle_data_groups(req, groups_res); - - auto categories_body = json::parse(categories_res.body); - auto groups_body = json::parse(groups_res.body); - - EXPECT_EQ(categories_body["error_code"], groups_body["error_code"]); - EXPECT_EQ(categories_res.status, groups_res.status); -} - // ============================================================================ // handle_list_data — returns 400 when route matches are missing // ============================================================================ -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_018 TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 2) httplib::Request req; @@ -173,7 +153,7 @@ TEST_F(DataHandlersTest, ListDataReturnsBadRequestWhenMatchesMissing) { EXPECT_EQ(res.status, 400); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_018 TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) { httplib::Request req; httplib::Response res; @@ -186,7 +166,7 @@ TEST_F(DataHandlersTest, ListDataBadRequestBodyContainsErrorCode) { // handle_get_data_item — returns 400 when route matches are missing // ============================================================================ -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_019 TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 3) httplib::Request req; @@ -195,7 +175,7 @@ TEST_F(DataHandlersTest, GetDataItemReturnsBadRequestWhenMatchesMissing) { EXPECT_EQ(res.status, 400); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_019 TEST_F(DataHandlersTest, GetDataItemBadRequestBodyContainsInvalidRequestErrorCode) { httplib::Request req; httplib::Response res; @@ -209,7 +189,7 @@ TEST_F(DataHandlersTest, GetDataItemBadRequestBodyContainsInvalidRequestErrorCod // handle_put_data_item — returns 400 when route matches are missing // ============================================================================ -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_020 TEST_F(DataHandlersTest, PutDataItemReturnsBadRequestWhenMatchesMissing) { // Default-constructed req has empty matches (size 0 < 3) httplib::Request req; @@ -218,7 +198,7 @@ TEST_F(DataHandlersTest, PutDataItemReturnsBadRequestWhenMatchesMissing) { EXPECT_EQ(res.status, 400); } -// @verifies REQ_INTEROP_001 +// @verifies REQ_INTEROP_020 TEST_F(DataHandlersTest, PutDataItemBadRequestBodyContainsInvalidRequestErrorCode) { httplib::Request req; httplib::Response res;