github.com/icyphox/x@v0.0.355-0.20220311094250-029bd783e8b8/fetcher/fetcher_test.go (about) 1 package fetcher 2 3 import ( 4 "encoding/base64" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "os" 9 "testing" 10 11 "github.com/ory/x/httpx" 12 13 "github.com/gobuffalo/httptest" 14 "github.com/julienschmidt/httprouter" 15 "github.com/pkg/errors" 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestFetcher(t *testing.T) { 21 router := httprouter.New() 22 router.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { 23 _, _ = w.Write([]byte(`{"foo":"bar"}`)) 24 }) 25 ts := httptest.NewServer(router) 26 t.Cleanup(ts.Close) 27 28 file, err := ioutil.TempFile(os.TempDir(), "source.*.json") 29 require.NoError(t, err) 30 31 _, err = file.WriteString(`{"foo":"baz"}`) 32 require.NoError(t, err) 33 require.NoError(t, file.Close()) 34 35 for fc, fetcher := range []*Fetcher{ 36 NewFetcher(WithClient(httpx.NewResilientClient(httpx.ResilientClientWithClient(ts.Client())))), 37 NewFetcher(), 38 } { 39 for k, tc := range []struct { 40 source string 41 expect string 42 }{ 43 { 44 source: "base64://" + base64.StdEncoding.EncodeToString([]byte(`{"foo":"zab"}`)), 45 expect: `{"foo":"zab"}`, 46 }, 47 { 48 source: "file://" + file.Name(), 49 expect: `{"foo":"baz"}`, 50 }, 51 { 52 source: ts.URL, 53 expect: `{"foo":"bar"}`, 54 }, 55 } { 56 t.Run(fmt.Sprintf("config=%d/case=%d", fc, k), func(t *testing.T) { 57 actual, err := fetcher.Fetch(tc.source) 58 require.NoError(t, err) 59 assert.JSONEq(t, tc.expect, actual.String()) 60 }) 61 } 62 } 63 64 t.Run("case=returns proper error on unknown scheme", func(t *testing.T) { 65 _, err := NewFetcher().Fetch("unknown-scheme://foo") 66 require.NotNil(t, err) 67 68 assert.True(t, errors.Is(err, ErrUnknownScheme)) 69 assert.Contains(t, err.Error(), "unknown-scheme") 70 }) 71 }