github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/cloudlets/errors_test.go (about)

     1  package cloudlets
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v2/pkg/session"
    11  	"github.com/stretchr/testify/require"
    12  	"github.com/tj/assert"
    13  )
    14  
    15  func TestNewError(t *testing.T) {
    16  	sess, err := session.New()
    17  	require.NoError(t, err)
    18  
    19  	req, err := http.NewRequest(
    20  		http.MethodHead,
    21  		"/",
    22  		nil)
    23  	require.NoError(t, err)
    24  
    25  	tests := map[string]struct {
    26  		response *http.Response
    27  		expected *Error
    28  	}{
    29  		"valid response, status code 500": {
    30  			response: &http.Response{
    31  				Status:     "Internal Server Error",
    32  				StatusCode: http.StatusInternalServerError,
    33  				Body: ioutil.NopCloser(strings.NewReader(
    34  					`{"type":"a","title":"b","detail":"c"}`),
    35  				),
    36  				Request: req,
    37  			},
    38  			expected: &Error{
    39  				Type:       "a",
    40  				Title:      "b",
    41  				Detail:     "c",
    42  				StatusCode: http.StatusInternalServerError,
    43  			},
    44  		},
    45  		"invalid response body, assign status code": {
    46  			response: &http.Response{
    47  				Status:     "Internal Server Error",
    48  				StatusCode: http.StatusInternalServerError,
    49  				Body: ioutil.NopCloser(strings.NewReader(
    50  					`test`),
    51  				),
    52  				Request: req,
    53  			},
    54  			expected: &Error{
    55  				Title:      "test",
    56  				Detail:     "",
    57  				StatusCode: http.StatusInternalServerError,
    58  			},
    59  		},
    60  	}
    61  	for name, test := range tests {
    62  		t.Run(name, func(t *testing.T) {
    63  			res := Client(sess).(*cloudlets).Error(test.response)
    64  			assert.Equal(t, test.expected, res)
    65  		})
    66  	}
    67  }
    68  
    69  func TestAs(t *testing.T) {
    70  	someErrorMarshalled, _ := json.Marshal("some error")
    71  	tests := map[string]struct {
    72  		err      Error
    73  		target   Error
    74  		expected bool
    75  	}{
    76  		"different error code": {
    77  			err:      Error{StatusCode: 404},
    78  			target:   Error{StatusCode: 401},
    79  			expected: false,
    80  		},
    81  		"same error code": {
    82  			err:      Error{StatusCode: 404},
    83  			target:   Error{StatusCode: 404},
    84  			expected: true,
    85  		},
    86  		"same error code and error message": {
    87  			err:      Error{StatusCode: 404, Errors: someErrorMarshalled},
    88  			target:   Error{StatusCode: 404, Errors: someErrorMarshalled},
    89  			expected: true,
    90  		},
    91  		"same error code and different error message": {
    92  			err:      Error{StatusCode: 404, Errors: someErrorMarshalled},
    93  			target:   Error{StatusCode: 404},
    94  			expected: false,
    95  		},
    96  	}
    97  
    98  	for name, test := range tests {
    99  		t.Run(name, func(t *testing.T) {
   100  			assert.Equal(t, test.err.Is(&test.target), test.expected)
   101  		})
   102  	}
   103  }