From 527470e662f3909d934c1023fd88838eea56f441 Mon Sep 17 00:00:00 2001 From: Ulysse Mavrocordatos Date: Tue, 20 Jan 2026 16:21:18 +0100 Subject: [PATCH] Add path parameter support for undo operations Support extracting path parameters from request URLs for use in undo operations. This enables cleanup of resources identified by path parameters (e.g., /api/v2/resource/{id}). Co-Authored-By: Claude Sonnet 4.5 --- src/test/java/com/datadog/api/Undo.java | 24 ++++++++++++++++++++---- src/test/java/com/datadog/api/World.java | 23 +++++++++++++++++++---- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/datadog/api/Undo.java b/src/test/java/com/datadog/api/Undo.java index 4142ffe4a13..b92c71990a6 100644 --- a/src/test/java/com/datadog/api/Undo.java +++ b/src/test/java/com/datadog/api/Undo.java @@ -30,12 +30,14 @@ public static class Parameter { public List parameters; public Map getRequestParameters( - Object responseData, Object requestData, Method requestBuilder, ObjectMapper mapper) { + Object responseData, Object requestData, Method requestBuilder, ObjectMapper mapper, Map pathParameters) { Map requestParams = new HashMap(); for (int i = 0; i < parameters.size(); i++) { Undo.UndoMethod.Parameter p = parameters.get(i); - Object data = new Object(); - if (p.origin == null) { + Object data; + if (p.origin != null && p.origin.equals("path")) { + data = pathParameters; + } else if (p.origin == null) { data = responseData; } else if (p.origin.equals("request")) { data = requestData; @@ -45,11 +47,25 @@ public Map getRequestParameters( try { if (p.source != null) { - requestParams.put(World.toPropertyName(p.name), World.lookup(data, p.source)); + if (p.origin != null && p.origin.equals("path")) { + // For path parameters, try both original parameter name and property name + String propertyName = World.toPropertyName(p.name); + if (pathParameters.containsKey(p.source)) { + requestParams.put(propertyName, pathParameters.get(p.source)); + } else if (pathParameters.containsKey(World.toPropertyName(p.source))) { + requestParams.put(propertyName, pathParameters.get(World.toPropertyName(p.source))); + } else { + throw new RuntimeException("Path parameter '" + p.source + "' not found"); + } + } else { + requestParams.put(World.toPropertyName(p.name), World.lookup(data, p.source)); + } } else if (p.template != null) { Class[] types = requestBuilder.getParameterTypes(); Object param = World.fromJSON(mapper, types[i], World.templated(p.template, data)); requestParams.put(World.toPropertyName(p.name), param); + } else if (p.origin != null && p.origin.equals("path")) { + throw new RuntimeException("Path origin requires 'source' field"); } } catch (java.lang.IllegalAccessException e) { throw new RuntimeException(e); diff --git a/src/test/java/com/datadog/api/World.java b/src/test/java/com/datadog/api/World.java index 9d2c691ad96..275da232dc6 100644 --- a/src/test/java/com/datadog/api/World.java +++ b/src/test/java/com/datadog/api/World.java @@ -39,6 +39,9 @@ public class World { // Templating context public Map context; + // Path parameters for undo operations + public Map pathParameters; + // Request information Class requestParametersClass; Object requestParameters; @@ -109,6 +112,7 @@ public static BiFunction relativeTime(boolean iso) { public World() { context = new HashMap<>(); + pathParameters = new HashMap<>(); undo = new ArrayList<>(); sleepAfterRequestInterval = System.getenv("SLEEP_AFTER_REQUEST") != null @@ -270,6 +274,7 @@ public void newRequest(String name) { } } parametersArray = new ArrayList<>(); + pathParameters = new HashMap<>(); // Clear path parameters for new request } public void addRequestParameter(String parameterName, String value) @@ -303,6 +308,11 @@ public void addRequestParameter(String parameterName, String value) } Object data = fromJSON(getObjectMapper(), fieldType, templated(value, context)); + + // Store path parameter for undo operations + pathParameters.put(parameterName, data); + pathParameters.put(propertyName, data); + if (isOptional) { if (fieldType == File.class) { String apiVersion = getVersion(); @@ -349,6 +359,11 @@ public void addRequestParameterFixture(String parameterName, String fixturePath) } Object data = lookup(context, fixturePath); + + // Store path parameter for undo operations + pathParameters.put(parameterName, data); + pathParameters.put(propertyName, data); + if (isOptional) { requestParametersClass.getMethod(propertyName, fieldType).invoke(requestParameters, data); } else { @@ -443,7 +458,7 @@ public void given(String apiVersion, Given step) throws Exception { Undo undoSettings = UndoAction.UndoAction().getUndo(apiVersion, step.getOperationName()); if (undoSettings != null) { - undo.add(getRequestUndo(apiVersion, undoSettings, responseData, givenParametersArray.get(0))); + undo.add(getRequestUndo(apiVersion, undoSettings, responseData, givenParametersArray.get(0), pathParameters)); } if (step.source != null) { @@ -456,7 +471,7 @@ public void given(String apiVersion, Given step) throws Exception { } public Callable getRequestUndo( - String apiVersion, Undo undoSettings, Object responseData, Object requestData) + String apiVersion, Undo undoSettings, Object responseData, Object requestData, Map pathParameters) throws Exception { // find API service based on undo tag value Class undoAPIClass = @@ -495,7 +510,7 @@ public Callable getRequestUndo( // Build request from undo parameters and response data Map undoRequestParams = undoSettings.undo.getRequestParameters( - responseData, requestData, undoOperation, getObjectMapper()); + responseData, requestData, undoOperation, getObjectMapper(), pathParameters); for (Class c : undoAPIClass.getClasses()) { if (c.getName().endsWith(undoSettings.undo.operationId + "OptionalParameters")) { undoRequestParams.put("parameters", c.getConstructor().newInstance()); @@ -564,7 +579,7 @@ public void sendRequest() throws Exception { } catch (Exception e) { throw new Exception(e.getCause()); } - undo.add(getRequestUndo(apiVersion, undoSettings, responseData, parametersArray.get(0))); + undo.add(getRequestUndo(apiVersion, undoSettings, responseData, parametersArray.get(0), pathParameters)); } }