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 }