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 }