github.com/posener/gitfs@v1.2.2-0.20200410105819-ea4e48d73ab9/internal/githubfs/githubtfs_test.go (about)

     1  package githubfs
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/posener/gitfs/internal/testfs"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  	"golang.org/x/oauth2"
    15  )
    16  
    17  var token = os.Getenv("GITHUB_TOKEN")
    18  
    19  func TestNew(t *testing.T) {
    20  	t.Run("NoPrefetch", func(t *testing.T) { testfs.TestFS(t, testFileSystemNoPrefetch) })
    21  	t.Run("Prefetch", func(t *testing.T) { testfs.TestFS(t, testFileSystemPrefetch) })
    22  }
    23  
    24  func TestNewWithGlob(t *testing.T) {
    25  	tests := []struct {
    26  		name     string
    27  		prefetch bool
    28  	}{
    29  		{"no prefetch", false},
    30  		{"prefetch", true},
    31  	}
    32  
    33  	for _, tt := range tests {
    34  		t.Run(tt.name, func(t *testing.T) {
    35  			fs, err := testFilesystem(t, "github.com/posener/gitfs/internal/testdata", tt.prefetch, []string{"*/*1"})
    36  			require.NoError(t, err)
    37  			_, err = fs.Open("d1/d11")
    38  			assert.NoError(t, err)
    39  			_, err = fs.Open("d1")
    40  			assert.NoError(t, err)
    41  			_, err = fs.Open("f01")
    42  			assert.Error(t, err)
    43  		})
    44  	}
    45  }
    46  
    47  type contexter interface {
    48  	WithContext(context.Context) http.File
    49  }
    50  
    51  func TestOpen_cancelledContext(t *testing.T) {
    52  	t.Parallel()
    53  	fs, err := testFileSystemNoPrefetch(t, "github.com/posener/gitfs")
    54  	require.NoError(t, err)
    55  
    56  	ctx, cancel := context.WithCancel(context.Background())
    57  	cancel()
    58  	f21, err := fs.Open("internal/testdata/f01")
    59  	require.NoError(t, err)
    60  
    61  	f21Ctx, ok := f21.(contexter)
    62  	require.True(t, ok)
    63  	f21 = f21Ctx.WithContext(ctx)
    64  
    65  	_, err = ioutil.ReadAll(f21)
    66  	require.Error(t, err)
    67  }
    68  
    69  func TestNewGithubProject(t *testing.T) {
    70  	t.Parallel()
    71  	p, err := newGithubFS(context.Background(), mockClient(), "github.com/x/y", nil)
    72  	require.NoError(t, err)
    73  	assert.Equal(t, "heads/master", p.ref)
    74  }
    75  
    76  func testFileSystemNoPrefetch(t *testing.T, project string) (http.FileSystem, error) {
    77  	return testFilesystem(t, project, false, nil)
    78  }
    79  
    80  func testFileSystemPrefetch(t *testing.T, project string) (http.FileSystem, error) {
    81  	return testFilesystem(t, project, true, nil)
    82  }
    83  
    84  func testFilesystem(t *testing.T, project string, prefetch bool, glob []string) (http.FileSystem, error) {
    85  	t.Helper()
    86  	if token == "" {
    87  		t.Skip("no github token provided")
    88  	}
    89  	c := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}))
    90  	return New(context.Background(), c, project, prefetch, glob)
    91  }
    92  
    93  func mockClient() *http.Client {
    94  	return &http.Client{Transport: &mockTransport{}}
    95  }
    96  
    97  type mockTransport struct{}
    98  
    99  func (*mockTransport) RoundTrip(req *http.Request) (*http.Response, error) {
   100  	switch {
   101  	case req.Method == http.MethodGet && req.URL.Path == "/repos/x/y":
   102  		return &http.Response{
   103  			StatusCode: http.StatusOK,
   104  			Header:     make(http.Header),
   105  			Body:       ioutil.NopCloser(bytes.NewReader([]byte(`{"default_branch":"master"}`))),
   106  			Request:    req,
   107  		}, nil
   108  	default:
   109  		return &http.Response{
   110  			StatusCode: http.StatusNotFound,
   111  			Header:     make(http.Header),
   112  			Body:       ioutil.NopCloser(bytes.NewReader([]byte(`{}`))),
   113  			Request:    req,
   114  		}, nil
   115  	}
   116  }