207 lines
6.0 KiB
Go
207 lines
6.0 KiB
Go
package actions_test
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/actions/actions-runner-controller/github/actions"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestActionsError(t *testing.T) {
|
|
t.Run("contains the status code, activity ID, and error", func(t *testing.T) {
|
|
err := &actions.ActionsError{
|
|
ActivityID: "activity-id",
|
|
StatusCode: 404,
|
|
Err: errors.New("example error description"),
|
|
}
|
|
|
|
s := err.Error()
|
|
assert.Contains(t, s, "StatusCode 404")
|
|
assert.Contains(t, s, "AcivityId \"activity-id\"")
|
|
assert.Contains(t, s, "example error description")
|
|
})
|
|
|
|
t.Run("unwraps the error", func(t *testing.T) {
|
|
err := &actions.ActionsError{
|
|
ActivityID: "activity-id",
|
|
StatusCode: 404,
|
|
Err: &actions.ActionsExceptionError{
|
|
ExceptionName: "exception-name",
|
|
Message: "example error message",
|
|
},
|
|
}
|
|
|
|
assert.Equal(t, err.Unwrap(), err.Err)
|
|
})
|
|
|
|
t.Run("is exception is ok", func(t *testing.T) {
|
|
err := &actions.ActionsError{
|
|
ActivityID: "activity-id",
|
|
StatusCode: 404,
|
|
Err: &actions.ActionsExceptionError{
|
|
ExceptionName: "exception-name",
|
|
Message: "example error message",
|
|
},
|
|
}
|
|
|
|
var exception *actions.ActionsExceptionError
|
|
assert.True(t, errors.As(err, &exception))
|
|
|
|
assert.True(t, err.IsException("exception-name"))
|
|
})
|
|
|
|
t.Run("is exception is not ok", func(t *testing.T) {
|
|
tt := map[string]*actions.ActionsError{
|
|
"not an exception": {
|
|
ActivityID: "activity-id",
|
|
StatusCode: 404,
|
|
Err: errors.New("example error description"),
|
|
},
|
|
"not target exception": {
|
|
ActivityID: "activity-id",
|
|
StatusCode: 404,
|
|
Err: &actions.ActionsExceptionError{
|
|
ExceptionName: "exception-name",
|
|
Message: "example error message",
|
|
},
|
|
},
|
|
}
|
|
|
|
targetException := "target-exception"
|
|
for name, err := range tt {
|
|
t.Run(name, func(t *testing.T) {
|
|
assert.False(t, err.IsException(targetException))
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestActionsExceptionError(t *testing.T) {
|
|
t.Run("contains the exception name and message", func(t *testing.T) {
|
|
err := &actions.ActionsExceptionError{
|
|
ExceptionName: "exception-name",
|
|
Message: "example error message",
|
|
}
|
|
|
|
s := err.Error()
|
|
assert.Contains(t, s, "exception-name")
|
|
assert.Contains(t, s, "example error message")
|
|
})
|
|
}
|
|
|
|
func TestGitHubAPIError(t *testing.T) {
|
|
t.Run("contains the status code, request ID, and error", func(t *testing.T) {
|
|
err := &actions.GitHubAPIError{
|
|
StatusCode: 404,
|
|
RequestID: "request-id",
|
|
Err: errors.New("example error description"),
|
|
}
|
|
|
|
s := err.Error()
|
|
assert.Contains(t, s, "StatusCode 404")
|
|
assert.Contains(t, s, "RequestID \"request-id\"")
|
|
assert.Contains(t, s, "example error description")
|
|
})
|
|
|
|
t.Run("unwraps the error", func(t *testing.T) {
|
|
err := &actions.GitHubAPIError{
|
|
StatusCode: 404,
|
|
RequestID: "request-id",
|
|
Err: errors.New("example error description"),
|
|
}
|
|
|
|
assert.Equal(t, err.Unwrap(), err.Err)
|
|
})
|
|
}
|
|
|
|
func ParseActionsErrorFromResponse(t *testing.T) {
|
|
t.Run("empty content length", func(t *testing.T) {
|
|
response := &http.Response{
|
|
ContentLength: 0,
|
|
Header: http.Header{
|
|
actions.HeaderActionsActivityID: []string{"activity-id"},
|
|
},
|
|
StatusCode: 404,
|
|
}
|
|
|
|
err := actions.ParseActionsErrorFromResponse(response)
|
|
require.Error(t, err)
|
|
assert.Equal(t, err.(*actions.ActionsError).ActivityID, "activity-id")
|
|
assert.Equal(t, err.(*actions.ActionsError).StatusCode, 404)
|
|
assert.Equal(t, err.(*actions.ActionsError).Err.Error(), "unknown exception")
|
|
})
|
|
|
|
t.Run("contains text plain error", func(t *testing.T) {
|
|
errorMessage := "example error message"
|
|
response := &http.Response{
|
|
ContentLength: int64(len(errorMessage)),
|
|
Header: http.Header{
|
|
actions.HeaderActionsActivityID: []string{"activity-id"},
|
|
"Content-Type": []string{"text/plain"},
|
|
},
|
|
StatusCode: 404,
|
|
Body: io.NopCloser(strings.NewReader(errorMessage)),
|
|
}
|
|
|
|
err := actions.ParseActionsErrorFromResponse(response)
|
|
require.Error(t, err)
|
|
var actionsError *actions.ActionsError
|
|
assert.ErrorAs(t, err, &actionsError)
|
|
assert.Equal(t, actionsError.ActivityID, "activity-id")
|
|
assert.Equal(t, actionsError.StatusCode, 404)
|
|
assert.Equal(t, actionsError.Err.Error(), errorMessage)
|
|
})
|
|
|
|
t.Run("contains json error", func(t *testing.T) {
|
|
errorMessage := `{"typeName":"exception-name","message":"example error message"}`
|
|
response := &http.Response{
|
|
ContentLength: int64(len(errorMessage)),
|
|
Header: http.Header{
|
|
actions.HeaderActionsActivityID: []string{"activity-id"},
|
|
"Content-Type": []string{"application/json"},
|
|
},
|
|
StatusCode: 404,
|
|
Body: io.NopCloser(strings.NewReader(errorMessage)),
|
|
}
|
|
|
|
err := actions.ParseActionsErrorFromResponse(response)
|
|
require.Error(t, err)
|
|
var actionsError *actions.ActionsError
|
|
assert.ErrorAs(t, err, &actionsError)
|
|
assert.Equal(t, actionsError.ActivityID, "activity-id")
|
|
assert.Equal(t, actionsError.StatusCode, 404)
|
|
|
|
inner, ok := actionsError.Err.(*actions.ActionsExceptionError)
|
|
require.True(t, ok)
|
|
assert.Equal(t, inner.ExceptionName, "exception-name")
|
|
assert.Equal(t, inner.Message, "example error message")
|
|
})
|
|
|
|
t.Run("wrapped exception error", func(t *testing.T) {
|
|
errorMessage := `{"typeName":"exception-name","message":"example error message"}`
|
|
response := &http.Response{
|
|
ContentLength: int64(len(errorMessage)),
|
|
Header: http.Header{
|
|
actions.HeaderActionsActivityID: []string{"activity-id"},
|
|
"Content-Type": []string{"application/json"},
|
|
},
|
|
StatusCode: 404,
|
|
Body: io.NopCloser(strings.NewReader(errorMessage)),
|
|
}
|
|
|
|
err := actions.ParseActionsErrorFromResponse(response)
|
|
require.Error(t, err)
|
|
|
|
var actionsExceptionError *actions.ActionsExceptionError
|
|
assert.ErrorAs(t, err, &actionsExceptionError)
|
|
|
|
assert.Equal(t, actionsExceptionError.ExceptionName, "exception-name")
|
|
assert.Equal(t, actionsExceptionError.Message, "example error message")
|
|
})
|
|
}
|