Glue: Add configuration support to PATCH (#56117)

* feat: add config to tests v0

* feat: add config to UpdateCorrelationCommand

* refactor: repair some tests

* refactor: repair another test

* refactor: repair last test

* refactor: remove possible test

* refactor: add comments

* refactor: add changes from code review

* refactor: implement more detailed patch

* feat: add tests for partial config update

* refactor: make error handling more detailed

Co-authored-by: Giordano Ricci <me@giordanoricci.com>

Co-authored-by: Giordano Ricci <me@giordanoricci.com>
This commit is contained in:
Laura Benz
2022-10-10 15:36:14 +02:00
committed by GitHub
co-authored by Giordano Ricci
parent 680dfde90d
commit bc9a37ee8d
5 changed files with 152 additions and 28 deletions
@@ -162,7 +162,7 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
require.NoError(t, res.Body.Close())
})
t.Run("updating a without data should result in a 400", func(t *testing.T) {
t.Run("updating a correlation without data should result in a 400", func(t *testing.T) {
correlation := ctx.createCorrelation(correlations.CreateCorrelationCommand{
SourceUID: writableDs,
TargetUID: &writableDs,
@@ -184,7 +184,7 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "At least one of label, description is required", response.Message)
require.Equal(t, "At least one of label, description or config is required", response.Message)
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
require.NoError(t, res.Body.Close())
@@ -202,7 +202,7 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "At least one of label, description is required", response.Message)
require.Equal(t, "At least one of label, description or config is required", response.Message)
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
require.NoError(t, res.Body.Close())
@@ -212,7 +212,8 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
user: adminUser,
body: `{
"label": null,
"description": null
"description": null,
"config": null
}`,
})
require.Equal(t, http.StatusBadRequest, res.StatusCode)
@@ -223,7 +224,7 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "At least one of label, description is required", response.Message)
require.Equal(t, "At least one of label, description or config is required", response.Message)
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
require.NoError(t, res.Body.Close())
})
@@ -264,6 +265,11 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
OrgId: writableDsOrgId,
Label: "0",
Description: "0",
Config: correlations.CorrelationConfig{
Field: "fieldName",
Type: "query",
Target: map[string]interface{}{"expr": "foo"},
},
})
// updating all
@@ -272,7 +278,12 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
user: adminUser,
body: `{
"label": "1",
"description": "1"
"description": "1",
"config": {
"field": "field",
"type": "query",
"target": { "expr": "bar" }
}
}`,
})
require.Equal(t, http.StatusOK, res.StatusCode)
@@ -286,7 +297,9 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "1", response.Result.Label)
require.Equal(t, "1", response.Result.Label)
require.Equal(t, "1", response.Result.Description)
require.Equal(t, "field", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "bar"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// partially updating only label
@@ -308,6 +321,8 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "2", response.Result.Label)
require.Equal(t, "1", response.Result.Description)
require.Equal(t, "field", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "bar"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// partially updating only description
@@ -329,15 +344,97 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "2", response.Result.Label)
require.Equal(t, "2", response.Result.Description)
require.Equal(t, "field", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "bar"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// setting both to empty strings (testing wether empty strings are handled correctly)
// partially updating whole config
res = ctx.Patch(PatchParams{
url: fmt.Sprintf("/api/datasources/uid/%s/correlations/%s", correlation.SourceUID, correlation.UID),
user: adminUser,
body: `{
"config": {
"field": "name",
"type": "query",
"target": { "expr": "baz" }
}
}`,
})
require.Equal(t, http.StatusOK, res.StatusCode)
responseBody, err = io.ReadAll(res.Body)
require.NoError(t, err)
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "2", response.Result.Label)
require.Equal(t, "2", response.Result.Description)
require.Equal(t, "name", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "baz"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// partially updating only config field
res = ctx.Patch(PatchParams{
url: fmt.Sprintf("/api/datasources/uid/%s/correlations/%s", correlation.SourceUID, correlation.UID),
user: adminUser,
body: `{
"config": {
"field": "newName"
}
}`,
})
require.Equal(t, http.StatusOK, res.StatusCode)
responseBody, err = io.ReadAll(res.Body)
require.NoError(t, err)
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "2", response.Result.Label)
require.Equal(t, "2", response.Result.Description)
require.Equal(t, "newName", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "baz"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// partially updating only config target
res = ctx.Patch(PatchParams{
url: fmt.Sprintf("/api/datasources/uid/%s/correlations/%s", correlation.SourceUID, correlation.UID),
user: adminUser,
body: `{
"config": {
"target": { "expr": "foo" }
}
}`,
})
require.Equal(t, http.StatusOK, res.StatusCode)
responseBody, err = io.ReadAll(res.Body)
require.NoError(t, err)
err = json.Unmarshal(responseBody, &response)
require.NoError(t, err)
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "2", response.Result.Label)
require.Equal(t, "2", response.Result.Description)
require.Equal(t, "newName", response.Result.Config.Field)
require.Equal(t, map[string]interface{}{"expr": "foo"}, response.Result.Config.Target)
require.NoError(t, res.Body.Close())
// setting label, description and config field to empty strings (testing whether empty strings are handled correctly)
res = ctx.Patch(PatchParams{
url: fmt.Sprintf("/api/datasources/uid/%s/correlations/%s", correlation.SourceUID, correlation.UID),
user: adminUser,
body: `{
"label": "",
"description": ""
"description": "",
"config": {
"field": ""
}
}`,
})
require.Equal(t, http.StatusOK, res.StatusCode)
@@ -351,6 +448,7 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
require.Equal(t, "Correlation updated", response.Message)
require.Equal(t, "", response.Result.Label)
require.Equal(t, "", response.Result.Description)
require.Equal(t, "", response.Result.Config.Field)
require.NoError(t, res.Body.Close())
})
}