2023-07-31 11:22:00 +00:00
|
|
|
package acme
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func mustJSON(t *testing.T, m map[string]interface{}) string {
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
b, err := json.Marshal(m)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
return string(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestError_WithAdditionalErrorDetail(t *testing.T) {
|
|
|
|
internalJSON := mustJSON(t, map[string]interface{}{
|
|
|
|
"detail": "The server experienced an internal error",
|
|
|
|
"type": "urn:ietf:params:acme:error:serverInternal",
|
|
|
|
})
|
2023-08-04 09:24:22 +00:00
|
|
|
malformedErr := NewError(ErrorMalformedType, "malformed error") // will result in Err == nil behavior
|
2023-07-31 11:22:00 +00:00
|
|
|
malformedJSON := mustJSON(t, map[string]interface{}{
|
|
|
|
"detail": "The request message was malformed",
|
|
|
|
"type": "urn:ietf:params:acme:error:malformed",
|
|
|
|
})
|
|
|
|
withDetailJSON := mustJSON(t, map[string]interface{}{
|
|
|
|
"detail": "Attestation statement cannot be verified: invalid property",
|
|
|
|
"type": "urn:ietf:params:acme:error:badAttestationStatement",
|
|
|
|
})
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
err *Error
|
|
|
|
want string
|
|
|
|
}{
|
2023-08-04 09:24:22 +00:00
|
|
|
{"internal", NewDetailedError(ErrorServerInternalType, ""), internalJSON},
|
|
|
|
{"nil err", malformedErr, malformedJSON},
|
|
|
|
{"detailed", NewDetailedError(ErrorBadAttestationStatementType, "invalid property"), withDetailJSON},
|
2023-07-31 11:22:00 +00:00
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
b, err := json.Marshal(tt.err)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
// tests if the additional error detail is included in the JSON representation
|
|
|
|
// of the ACME error. This is what is returned to ACME clients and being logged
|
|
|
|
// by the CA.
|
|
|
|
assert.JSONEq(t, tt.want, string(b))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|