Skip to content

Commit efa3b40

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Ensure clients can handle empty oneOf objects (#2493)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent 8a317be commit efa3b40

File tree

5 files changed

+156
-4
lines changed

5 files changed

+156
-4
lines changed

.apigentools-info

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
"spec_versions": {
55
"v1": {
66
"apigentools_version": "1.6.6",
7-
"regenerated": "2024-09-30 13:57:08.451305",
8-
"spec_repo_commit": "eb66b1cf"
7+
"regenerated": "2024-09-30 14:37:33.047156",
8+
"spec_repo_commit": "60bc9127"
99
},
1010
"v2": {
1111
"apigentools_version": "1.6.6",
12-
"regenerated": "2024-09-30 13:57:08.465453",
13-
"spec_repo_commit": "eb66b1cf"
12+
"regenerated": "2024-09-30 14:37:33.070295",
13+
"spec_repo_commit": "60bc9127"
1414
}
1515
}
1616
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Clients deserialize a dashboard with a empty time object
2+
3+
import com.datadog.api.client.ApiClient;
4+
import com.datadog.api.client.ApiException;
5+
import com.datadog.api.client.v1.api.DashboardsApi;
6+
import com.datadog.api.client.v1.model.Dashboard;
7+
import com.datadog.api.client.v1.model.DashboardLayoutType;
8+
import com.datadog.api.client.v1.model.FormulaAndFunctionCloudCostDataSource;
9+
import com.datadog.api.client.v1.model.FormulaAndFunctionCloudCostQueryDefinition;
10+
import com.datadog.api.client.v1.model.FormulaAndFunctionQueryDefinition;
11+
import com.datadog.api.client.v1.model.FormulaAndFunctionResponseFormat;
12+
import com.datadog.api.client.v1.model.TimeseriesWidgetDefinition;
13+
import com.datadog.api.client.v1.model.TimeseriesWidgetDefinitionType;
14+
import com.datadog.api.client.v1.model.TimeseriesWidgetRequest;
15+
import com.datadog.api.client.v1.model.Widget;
16+
import com.datadog.api.client.v1.model.WidgetDefinition;
17+
import com.datadog.api.client.v1.model.WidgetDisplayType;
18+
import com.datadog.api.client.v1.model.WidgetFormula;
19+
import com.datadog.api.client.v1.model.WidgetLegacyLiveSpan;
20+
import com.datadog.api.client.v1.model.WidgetLineType;
21+
import com.datadog.api.client.v1.model.WidgetLineWidth;
22+
import com.datadog.api.client.v1.model.WidgetRequestStyle;
23+
import com.datadog.api.client.v1.model.WidgetTextAlign;
24+
import com.datadog.api.client.v1.model.WidgetTime;
25+
import java.util.Collections;
26+
27+
public class Example {
28+
public static void main(String[] args) {
29+
ApiClient defaultClient = ApiClient.getDefaultApiClient();
30+
DashboardsApi apiInstance = new DashboardsApi(defaultClient);
31+
32+
Dashboard body =
33+
new Dashboard()
34+
.title("Example-Dashboard")
35+
.widgets(
36+
Collections.singletonList(
37+
new Widget()
38+
.definition(
39+
new WidgetDefinition(
40+
new TimeseriesWidgetDefinition()
41+
.title("Example Cloud Cost Query")
42+
.titleSize("16")
43+
.titleAlign(WidgetTextAlign.LEFT)
44+
.type(TimeseriesWidgetDefinitionType.TIMESERIES)
45+
.requests(
46+
Collections.singletonList(
47+
new TimeseriesWidgetRequest()
48+
.formulas(
49+
Collections.singletonList(
50+
new WidgetFormula().formula("query1")))
51+
.queries(
52+
Collections.singletonList(
53+
new FormulaAndFunctionQueryDefinition(
54+
new FormulaAndFunctionCloudCostQueryDefinition()
55+
.dataSource(
56+
FormulaAndFunctionCloudCostDataSource
57+
.CLOUD_COST)
58+
.name("query1")
59+
.query(
60+
"sum:aws.cost.amortized{*} by"
61+
+ " {aws_product}.rollup(sum,"
62+
+ " monthly)"))))
63+
.responseFormat(
64+
FormulaAndFunctionResponseFormat.TIMESERIES)
65+
.style(
66+
new WidgetRequestStyle()
67+
.palette("dog_classic")
68+
.lineType(WidgetLineType.SOLID)
69+
.lineWidth(WidgetLineWidth.NORMAL))
70+
.displayType(WidgetDisplayType.BARS)))
71+
.time(new WidgetTime(new WidgetLegacyLiveSpan()))))))
72+
.layoutType(DashboardLayoutType.ORDERED);
73+
74+
try {
75+
Dashboard result = apiInstance.createDashboard(body);
76+
System.out.println(result);
77+
} catch (ApiException e) {
78+
System.err.println("Exception when calling DashboardsApi#createDashboard");
79+
System.err.println("Status code: " + e.getCode());
80+
System.err.println("Reason: " + e.getResponseBody());
81+
System.err.println("Response headers: " + e.getResponseHeaders());
82+
e.printStackTrace();
83+
}
84+
}
85+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2024-09-24T19:19:31.807Z
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
[
2+
{
3+
"httpRequest": {
4+
"body": {
5+
"type": "JSON",
6+
"json": "{\"layout_type\":\"ordered\",\"title\":\"Test-Clients_deserialize_a_dashboard_with_a_empty_time_object-1727205571\",\"widgets\":[{\"definition\":{\"requests\":[{\"display_type\":\"bars\",\"formulas\":[{\"formula\":\"query1\"}],\"queries\":[{\"data_source\":\"cloud_cost\",\"name\":\"query1\",\"query\":\"sum:aws.cost.amortized{*} by {aws_product}.rollup(sum, monthly)\"}],\"response_format\":\"timeseries\",\"style\":{\"line_type\":\"solid\",\"line_width\":\"normal\",\"palette\":\"dog_classic\"}}],\"time\":{},\"title\":\"Example Cloud Cost Query\",\"title_align\":\"left\",\"title_size\":\"16\",\"type\":\"timeseries\"}}]}"
7+
},
8+
"headers": {},
9+
"method": "POST",
10+
"path": "/api/v1/dashboard",
11+
"keepAlive": false,
12+
"secure": true
13+
},
14+
"httpResponse": {
15+
"body": "{\"id\":\"han-5zg-c32\",\"title\":\"Test-Clients_deserialize_a_dashboard_with_a_empty_time_object-1727205571\",\"description\":null,\"author_handle\":\"frog@datadoghq.com\",\"author_name\":null,\"layout_type\":\"ordered\",\"url\":\"/dashboard/han-5zg-c32/test-clientsdeserializeadashboardwithaemptytimeobject-1727205571\",\"is_read_only\":false,\"template_variables\":null,\"widgets\":[{\"definition\":{\"requests\":[{\"display_type\":\"bars\",\"formulas\":[{\"formula\":\"query1\"}],\"queries\":[{\"data_source\":\"cloud_cost\",\"name\":\"query1\",\"query\":\"sum:aws.cost.amortized{*} by {aws_product}.rollup(sum, monthly)\"}],\"response_format\":\"timeseries\",\"style\":{\"line_type\":\"solid\",\"line_width\":\"normal\",\"palette\":\"dog_classic\"}}],\"time\":{},\"title\":\"Example Cloud Cost Query\",\"title_align\":\"left\",\"title_size\":\"16\",\"type\":\"timeseries\"},\"id\":4274057372149908}],\"notify_list\":null,\"created_at\":\"2024-09-24T19:19:32.071328+00:00\",\"modified_at\":\"2024-09-24T19:19:32.071328+00:00\",\"experience_type\":\"default\",\"restricted_roles\":[]}\n",
16+
"headers": {
17+
"Content-Type": [
18+
"application/json"
19+
]
20+
},
21+
"statusCode": 200,
22+
"reasonPhrase": "OK"
23+
},
24+
"times": {
25+
"remainingTimes": 1
26+
},
27+
"timeToLive": {
28+
"unlimited": true
29+
},
30+
"id": "25f142c7-7556-d0a0-7f60-c9aea7b1aa17"
31+
},
32+
{
33+
"httpRequest": {
34+
"headers": {},
35+
"method": "DELETE",
36+
"path": "/api/v1/dashboard/han-5zg-c32",
37+
"keepAlive": false,
38+
"secure": true
39+
},
40+
"httpResponse": {
41+
"body": "{\"deleted_dashboard_id\":\"han-5zg-c32\"}\n",
42+
"headers": {
43+
"Content-Type": [
44+
"application/json"
45+
]
46+
},
47+
"statusCode": 200,
48+
"reasonPhrase": "OK"
49+
},
50+
"times": {
51+
"remainingTimes": 1
52+
},
53+
"timeToLive": {
54+
"unlimited": true
55+
},
56+
"id": "9350b5ff-5d55-807a-27b7-1a985a5d0edd"
57+
}
58+
]

src/test/resources/com/datadog/api/client/v1/api/dashboards.feature

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ Feature: Dashboards
99
And a valid "appKeyAuth" key in the system
1010
And an instance of "Dashboards" API
1111

12+
@replay-only @team:DataDog/dashboards-backend
13+
Scenario: Clients deserialize a dashboard with a empty time object
14+
Given new "CreateDashboard" request
15+
And body with value { "title": "{{ unique }}", "widgets": [ { "definition": { "title": "Example Cloud Cost Query", "title_size": "16", "title_align": "left", "type": "timeseries", "requests": [ { "formulas": [ { "formula": "query1" } ], "queries": [ { "data_source": "cloud_cost", "name": "query1", "query": "sum:aws.cost.amortized{*} by {aws_product}.rollup(sum, monthly)" } ], "response_format": "timeseries", "style": { "palette": "dog_classic", "line_type": "solid", "line_width": "normal" }, "display_type": "bars" } ], "time": {} } } ], "layout_type": "ordered" }
16+
When the request is sent
17+
Then the response status is 200 OK
18+
And the response "widgets[0].definition.time" is equal to {}
19+
1220
@team:DataDog/dashboards-backend
1321
Scenario: Create a distribution widget using a histogram request containing a formulas and functions APM Stats query
1422
Given new "CreateDashboard" request

0 commit comments

Comments
 (0)