1package http
2
3import (
4 "bytes"
5 "image"
6 "image/png"
7 "mime/multipart"
8 "net/http"
9 "net/http/httptest"
10 "testing"
11
12 "github.com/gorilla/mux"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15
16 "github.com/MichaelMure/git-bug/api/auth"
17 "github.com/MichaelMure/git-bug/cache"
18 "github.com/MichaelMure/git-bug/repository"
19)
20
21func TestGitFileHandlers(t *testing.T) {
22 repo := repository.CreateGoGitTestRepo(t, false)
23
24 stderr := &bytes.Buffer{}
25
26 mrc := cache.NewMultiRepoCache()
27 repoCache, err := mrc.RegisterDefaultRepository(repo, stderr)
28 require.NoError(t, err)
29
30 author, err := repoCache.NewIdentity("test identity", "test@test.org")
31 require.NoError(t, err)
32
33 err = repoCache.SetUserIdentity(author)
34 require.NoError(t, err)
35
36 // UPLOAD
37
38 uploadHandler := NewGitUploadFileHandler(mrc)
39
40 img := image.NewNRGBA(image.Rect(0, 0, 50, 50))
41 data := &bytes.Buffer{}
42 err = png.Encode(data, img)
43 require.NoError(t, err)
44
45 body := &bytes.Buffer{}
46 writer := multipart.NewWriter(body)
47 part, err := writer.CreateFormFile("uploadfile", "noname")
48 assert.NoError(t, err)
49
50 _, err = part.Write(data.Bytes())
51 assert.NoError(t, err)
52
53 err = writer.Close()
54 assert.NoError(t, err)
55
56 w := httptest.NewRecorder()
57 r, _ := http.NewRequest("GET", "/", body)
58 r.Header.Add("Content-Type", writer.FormDataContentType())
59
60 // Simulate auth
61 r = r.WithContext(auth.CtxWithUser(r.Context(), author.Id()))
62
63 // Handler's params
64 r = mux.SetURLVars(r, map[string]string{
65 "repo": "",
66 })
67
68 uploadHandler.ServeHTTP(w, r)
69
70 assert.Equal(t, http.StatusOK, w.Code)
71 assert.Equal(t, `{"hash":"3426a1488292d8f3f3c59ca679681336542b986f"}`, w.Body.String())
72 // DOWNLOAD
73
74 downloadHandler := NewGitFileHandler(mrc)
75
76 w = httptest.NewRecorder()
77 r, _ = http.NewRequest("GET", "/", nil)
78
79 // Simulate auth
80 r = r.WithContext(auth.CtxWithUser(r.Context(), author.Id()))
81
82 // Handler's params
83 r = mux.SetURLVars(r, map[string]string{
84 "repo": "",
85 "hash": "3426a1488292d8f3f3c59ca679681336542b986f",
86 })
87
88 downloadHandler.ServeHTTP(w, r)
89 assert.Equal(t, http.StatusOK, w.Code)
90
91 assert.Equal(t, data.Bytes(), w.Body.Bytes())
92
93 require.Equal(t, cache.ExpectedCacheInitializationMessage, stderr.String())
94}