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

     1  /*
     2   * Copyright (c) 2022-present unTill Pro, Ltd.
     3   */
     4  
     5  package state
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"io"
    11  	"net/http"
    12  	"net/http/httptest"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/stretchr/testify/require"
    17  	"github.com/voedger/voedger/pkg/appdef"
    18  	"github.com/voedger/voedger/pkg/istructs"
    19  )
    20  
    21  func TestHttpStorage_BasicUsage(t *testing.T) {
    22  	require := require.New(t)
    23  	s := ProvideAsyncActualizerStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, 0, 0)
    24  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    25  		require.Equal(http.MethodPost, r.Method)
    26  		require.Equal("my-value", r.Header.Get("my-header"))
    27  		require.Equal("application/json", r.Header.Get("Content-Type"))
    28  		bb, err := io.ReadAll(r.Body)
    29  		require.NoError(err)
    30  		require.Equal(`{"hello":"api"}`, string(bb))
    31  		_, _ = w.Write([]byte(`{"hello":"storage"}`))
    32  	}))
    33  	defer ts.Close()
    34  
    35  	k, err := s.KeyBuilder(Http, appdef.NullQName)
    36  	require.NoError(err)
    37  
    38  	k.PutString(Field_Url, ts.URL)
    39  	k.PutString(Field_Method, http.MethodPost)
    40  	k.PutString(Field_Header, "my-header: my-value")
    41  	k.PutString(Field_Header, "Content-type: application/json")
    42  	k.PutBytes(Field_Body, []byte(`{"hello":"api"}`))
    43  	require.Equal(fmt.Sprintf(`%s %s {"hello":"api"}`, http.MethodPost, ts.URL), k.(fmt.Stringer).String())
    44  	var v istructs.IStateValue
    45  	err = s.Read(k, func(_ istructs.IKey, value istructs.IStateValue) (err error) {
    46  		v = value
    47  		return
    48  	})
    49  	require.NoError(err)
    50  	require.Equal([]byte(`{"hello":"storage"}`), v.AsBytes(Field_Body))
    51  	require.Equal(`{"hello":"storage"}`, v.AsString(Field_Body))
    52  	require.Equal(int32(http.StatusOK), v.AsInt32(Field_StatusCode))
    53  	require.Contains(v.AsString(Field_Header), "Content-Length: 19")
    54  	require.Contains(v.AsString(Field_Header), "Content-Type: text/plain")
    55  }
    56  func TestHttpStorage_Timeout(t *testing.T) {
    57  	t.Run("Should panic when url not found", func(t *testing.T) {
    58  		require := require.New(t)
    59  		s := ProvideAsyncActualizerStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, 0, 0)
    60  		k, err := s.KeyBuilder(Http, appdef.NullQName)
    61  		require.NoError(err)
    62  
    63  		require.ErrorIs(errorFromPanic(func() { _ = s.Read(k, func(istructs.IKey, istructs.IStateValue) error { return nil }) }), ErrNotFound)
    64  	})
    65  	t.Run("Should return error on timeout", func(t *testing.T) {
    66  		require := require.New(t)
    67  		s := ProvideAsyncActualizerStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, 0, 0)
    68  		ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    69  			time.Sleep(time.Millisecond * 200)
    70  		}))
    71  		defer ts.Close()
    72  
    73  		k, err := s.KeyBuilder(Http, appdef.NullQName)
    74  		require.NoError(err)
    75  		k.PutString(Field_Url, ts.URL)
    76  		k.PutInt64(Field_HTTPClientTimeoutMilliseconds, 100)
    77  
    78  		err = s.Read(k, func(istructs.IKey, istructs.IStateValue) error { return nil })
    79  
    80  		require.Error(err)
    81  	})
    82  }
    83  func TestHttpStorage_NewKeyBuilder_should_refresh_key_builder(t *testing.T) {
    84  	require := require.New(t)
    85  	s := &httpStorage{}
    86  	k := s.NewKeyBuilder(appdef.NullQName, nil)
    87  	k.PutString(Field_Url, "url")
    88  	k.PutString(Field_Method, http.MethodPost)
    89  	k.PutString(Field_Header, "my-header: my-value")
    90  	k.PutBytes(Field_Body, []byte(`{"hello":"api"}`))
    91  
    92  	hskb := s.NewKeyBuilder(appdef.NullQName, k).(*httpKeyBuilder)
    93  
    94  	require.Equal(Http, hskb.storage)
    95  	require.Empty(hskb.data)
    96  }