github.com/safing/portbase@v0.19.5/api/endpoints_test.go (about)

     1  package api
     2  
     3  import (
     4  	"errors"
     5  	"sync"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"github.com/safing/portbase/database/record"
    11  )
    12  
    13  const (
    14  	successMsg = "endpoint api success"
    15  	failedMsg  = "endpoint api failed"
    16  )
    17  
    18  type actionTestRecord struct {
    19  	record.Base
    20  	sync.Mutex
    21  	Msg string
    22  }
    23  
    24  func TestEndpoints(t *testing.T) {
    25  	t.Parallel()
    26  
    27  	testHandler := &mainHandler{
    28  		mux: mainMux,
    29  	}
    30  
    31  	// ActionFn
    32  
    33  	assert.NoError(t, RegisterEndpoint(Endpoint{
    34  		Path: "test/action",
    35  		Read: PermitAnyone,
    36  		ActionFunc: func(_ *Request) (msg string, err error) {
    37  			return successMsg, nil
    38  		},
    39  	}))
    40  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/action", nil, successMsg)
    41  
    42  	assert.NoError(t, RegisterEndpoint(Endpoint{
    43  		Path: "test/action-err",
    44  		Read: PermitAnyone,
    45  		ActionFunc: func(_ *Request) (msg string, err error) {
    46  			return "", errors.New(failedMsg)
    47  		},
    48  	}))
    49  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/action-err", nil, failedMsg)
    50  
    51  	// DataFn
    52  
    53  	assert.NoError(t, RegisterEndpoint(Endpoint{
    54  		Path: "test/data",
    55  		Read: PermitAnyone,
    56  		DataFunc: func(_ *Request) (data []byte, err error) {
    57  			return []byte(successMsg), nil
    58  		},
    59  	}))
    60  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/data", nil, successMsg)
    61  
    62  	assert.NoError(t, RegisterEndpoint(Endpoint{
    63  		Path: "test/data-err",
    64  		Read: PermitAnyone,
    65  		DataFunc: func(_ *Request) (data []byte, err error) {
    66  			return nil, errors.New(failedMsg)
    67  		},
    68  	}))
    69  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/data-err", nil, failedMsg)
    70  
    71  	// StructFn
    72  
    73  	assert.NoError(t, RegisterEndpoint(Endpoint{
    74  		Path: "test/struct",
    75  		Read: PermitAnyone,
    76  		StructFunc: func(_ *Request) (i interface{}, err error) {
    77  			return &actionTestRecord{
    78  				Msg: successMsg,
    79  			}, nil
    80  		},
    81  	}))
    82  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/struct", nil, successMsg)
    83  
    84  	assert.NoError(t, RegisterEndpoint(Endpoint{
    85  		Path: "test/struct-err",
    86  		Read: PermitAnyone,
    87  		StructFunc: func(_ *Request) (i interface{}, err error) {
    88  			return nil, errors.New(failedMsg)
    89  		},
    90  	}))
    91  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/struct-err", nil, failedMsg)
    92  
    93  	// RecordFn
    94  
    95  	assert.NoError(t, RegisterEndpoint(Endpoint{
    96  		Path: "test/record",
    97  		Read: PermitAnyone,
    98  		RecordFunc: func(_ *Request) (r record.Record, err error) {
    99  			r = &actionTestRecord{
   100  				Msg: successMsg,
   101  			}
   102  			r.CreateMeta()
   103  			return r, nil
   104  		},
   105  	}))
   106  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/record", nil, successMsg)
   107  
   108  	assert.NoError(t, RegisterEndpoint(Endpoint{
   109  		Path: "test/record-err",
   110  		Read: PermitAnyone,
   111  		RecordFunc: func(_ *Request) (r record.Record, err error) {
   112  			return nil, errors.New(failedMsg)
   113  		},
   114  	}))
   115  	assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/record-err", nil, failedMsg)
   116  }
   117  
   118  func TestActionRegistration(t *testing.T) {
   119  	t.Parallel()
   120  
   121  	assert.Error(t, RegisterEndpoint(Endpoint{}))
   122  
   123  	assert.Error(t, RegisterEndpoint(Endpoint{
   124  		Path: "test/err",
   125  		Read: NotFound,
   126  	}))
   127  	assert.Error(t, RegisterEndpoint(Endpoint{
   128  		Path: "test/err",
   129  		Read: PermitSelf + 1,
   130  	}))
   131  
   132  	assert.Error(t, RegisterEndpoint(Endpoint{
   133  		Path:  "test/err",
   134  		Write: NotFound,
   135  	}))
   136  	assert.Error(t, RegisterEndpoint(Endpoint{
   137  		Path:  "test/err",
   138  		Write: PermitSelf + 1,
   139  	}))
   140  
   141  	assert.Error(t, RegisterEndpoint(Endpoint{
   142  		Path: "test/err",
   143  	}))
   144  
   145  	assert.Error(t, RegisterEndpoint(Endpoint{
   146  		Path: "test/err",
   147  		ActionFunc: func(_ *Request) (msg string, err error) {
   148  			return successMsg, nil
   149  		},
   150  		DataFunc: func(_ *Request) (data []byte, err error) {
   151  			return []byte(successMsg), nil
   152  		},
   153  	}))
   154  
   155  	assert.NoError(t, RegisterEndpoint(Endpoint{
   156  		Path: "test/err",
   157  		ActionFunc: func(_ *Request) (msg string, err error) {
   158  			return successMsg, nil
   159  		},
   160  	}))
   161  }