2021-10-27 09:37:14 -04:00
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"io/ioutil"
|
2022-04-15 12:20:44 -04:00
|
|
|
"reflect"
|
2021-10-27 09:37:14 -04:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/hashicorp/eventlogger/filters/encrypt"
|
|
|
|
|
"github.com/hashicorp/eventlogger/formatter_filters/cloudevents"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// CloudEventFromFile will marshal a single cloud event from the provided file
|
|
|
|
|
// name
|
2022-04-25 15:52:44 -04:00
|
|
|
func CloudEventFromFile(t testing.TB, fileName string) *cloudevents.Event {
|
2021-10-27 09:37:14 -04:00
|
|
|
t.Helper()
|
|
|
|
|
b, err := ioutil.ReadFile(fileName)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
got := &cloudevents.Event{}
|
|
|
|
|
err = json.Unmarshal(b, got)
|
|
|
|
|
require.NoErrorf(t, err, "json: %s", string(b))
|
|
|
|
|
return got
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetEventDetails is a testing helper will return the details from the event
|
|
|
|
|
// payload for a given messageType (request or response)
|
2022-10-25 18:29:38 -05:00
|
|
|
func GetEventDetails(t testing.TB, e *cloudevents.Event, messageType string) map[string]any {
|
2021-10-27 09:37:14 -04:00
|
|
|
t.Helper()
|
|
|
|
|
require := require.New(t)
|
|
|
|
|
require.NotNil(e)
|
|
|
|
|
require.NotEmpty(messageType)
|
2022-10-25 18:29:38 -05:00
|
|
|
data, ok := e.Data.(map[string]any)
|
2022-04-15 12:20:44 -04:00
|
|
|
require.Truef(ok, "event was not a map[string]interface")
|
2022-10-25 18:29:38 -05:00
|
|
|
msgType, ok := data[messageType].(map[string]any)
|
2022-04-15 12:20:44 -04:00
|
|
|
require.Truef(ok, "event data did not contain a %q. Current keys: %q", messageType, reflect.ValueOf(data).MapKeys())
|
2022-10-25 18:29:38 -05:00
|
|
|
details, ok := msgType["details"].(map[string]any)
|
2022-04-15 12:20:44 -04:00
|
|
|
require.Truef(ok, `%q of event did not contain "details"`, messageType)
|
2021-10-27 09:37:14 -04:00
|
|
|
return details
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AssertRedactedValues will assert that the values for the given keys within
|
|
|
|
|
// the data have been redacted
|
2022-10-25 18:29:38 -05:00
|
|
|
func AssertRedactedValues(t testing.TB, data any, keys ...string) {
|
2021-10-27 09:37:14 -04:00
|
|
|
t.Helper()
|
|
|
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
|
require.NotNil(data)
|
2022-10-25 18:29:38 -05:00
|
|
|
dataMap, ok := data.(map[string]any)
|
2021-10-27 09:37:14 -04:00
|
|
|
require.Truef(ok, "data must be a map[string]interface{}")
|
|
|
|
|
|
|
|
|
|
rMap := make(map[string]bool, len(keys))
|
|
|
|
|
for _, s := range keys {
|
|
|
|
|
rMap[s] = true
|
|
|
|
|
}
|
|
|
|
|
for k, v := range dataMap {
|
|
|
|
|
switch typ := v.(type) {
|
2022-10-25 18:29:38 -05:00
|
|
|
case []any:
|
2021-10-27 09:37:14 -04:00
|
|
|
for _, s := range typ {
|
|
|
|
|
if _, ok := rMap[k]; ok {
|
|
|
|
|
assert.Equalf(encrypt.RedactedData, s, "expected %s to be redacted and it was set to: %s", k, v)
|
|
|
|
|
} else {
|
|
|
|
|
assert.NotEqualf(encrypt.RedactedData, s, "did not expect %s to be redacted", k)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
if _, ok := rMap[k]; ok {
|
|
|
|
|
assert.Equalf(encrypt.RedactedData, v, "expected %s to be redacted and it was set to: %s", k, v)
|
|
|
|
|
} else {
|
|
|
|
|
assert.NotEqualf(encrypt.RedactedData, v, "did not expect %s to be redacted", k)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|