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  }