github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/utils/syserror_test.go (about)

     1  /*
     2   * Copyright (c) 2020-present unTill Pro, Ltd.
     3   */
     4  
     5  package coreutils
     6  
     7  import (
     8  	"errors"
     9  	"net/http"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/voedger/voedger/pkg/appdef"
    15  )
    16  
    17  func TestBasicUsage_SysError(t *testing.T) {
    18  	require := require.New(t)
    19  
    20  	t.Run("basic", func(t *testing.T) {
    21  		testError := errors.New("test")
    22  		err := WrapSysError(testError, http.StatusInternalServerError)
    23  		var sysError SysError
    24  		require.ErrorAs(err, &sysError)
    25  		require.Equal("test", sysError.Message)
    26  		require.Equal(http.StatusInternalServerError, sysError.HTTPStatus)
    27  		require.Empty(sysError.Data)
    28  		require.Empty(sysError.QName)
    29  		require.Equal("test", sysError.Error())
    30  		require.Equal(`{"sys.Error":{"HTTPStatus":500,"Message":"test"}}`, sysError.ToJSON())
    31  	})
    32  
    33  	t.Run("nil on nil", func(t *testing.T) {
    34  		require.NoError(WrapSysError(nil, http.StatusInternalServerError))
    35  	})
    36  
    37  	t.Run("wrap error that is SysError already", func(t *testing.T) {
    38  		err := SysError{
    39  			HTTPStatus: http.StatusOK,
    40  			QName:      appdef.NewQName("my", "test"),
    41  			Message:    "test",
    42  			Data:       "data",
    43  		}
    44  		wrapped := WrapSysError(err, http.StatusInternalServerError)
    45  		require.Equal(err, wrapped)
    46  	})
    47  
    48  	t.Run("ToJSON", func(t *testing.T) {
    49  		err := SysError{
    50  			HTTPStatus: http.StatusOK,
    51  			QName:      appdef.NewQName("my", "test"),
    52  			Message:    "test",
    53  			Data:       "data",
    54  		}
    55  		require.Equal(`{"sys.Error":{"HTTPStatus":200,"Message":"test","QName":"my.test","Data":"data"}}`, err.ToJSON())
    56  	})
    57  
    58  	t.Run("NewSysError", func(t *testing.T) {
    59  		var sysErr SysError
    60  		require.ErrorAs(NewSysError(http.StatusContinue), &sysErr)
    61  		require.Empty(sysErr.Data)
    62  		require.Equal(http.StatusContinue, sysErr.HTTPStatus)
    63  		require.Empty(sysErr.Message)
    64  		require.Equal(appdef.NullQName, sysErr.QName)
    65  	})
    66  
    67  	t.Run("emit status code with desc if message is empty but code > 0", func(t *testing.T) {
    68  		var sysErr SysError
    69  		require.ErrorAs(NewSysError(http.StatusContinue), &sysErr)
    70  		require.Equal("100 Continue", sysErr.Error())
    71  	})
    72  
    73  	t.Run("empty", func(t *testing.T) {
    74  		sysErr := SysError{}
    75  		require.Empty(sysErr.Error())
    76  	})
    77  }