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 mrc := cache.NewMultiRepoCache()
25 repoCache, events, err := mrc.RegisterDefaultRepository(repo)
26 require.NoError(t, err)
27 for event := range events {
28 require.NoError(t, event.Err)
29 }
30
31 author, err := repoCache.Identities().New("test identity", "test@test.org")
32 require.NoError(t, err)
33
34 err = repoCache.SetUserIdentity(author)
35 require.NoError(t, err)
36
37 // UPLOAD
38
39 uploadHandler := NewGitUploadFileHandler(mrc)
40
41 img := image.NewNRGBA(image.Rect(0, 0, 50, 50))
42 data := &bytes.Buffer{}
43 err = png.Encode(data, img)
44 require.NoError(t, err)
45
46 body := &bytes.Buffer{}
47 writer := multipart.NewWriter(body)
48 part, err := writer.CreateFormFile("uploadfile", "noname")
49 assert.NoError(t, err)
50
51 _, err = part.Write(data.Bytes())
52 assert.NoError(t, err)
53
54 err = writer.Close()
55 assert.NoError(t, err)
56
57 w := httptest.NewRecorder()
58 r, _ := http.NewRequest("GET", "/", body)
59 r.Header.Add("Content-Type", writer.FormDataContentType())
60
61 // Simulate auth
62 r = r.WithContext(auth.CtxWithUser(r.Context(), author.Id()))
63
64 // Handler's params
65 r = mux.SetURLVars(r, map[string]string{
66 "repo": "",
67 })
68
69 uploadHandler.ServeHTTP(w, r)
70
71 assert.Equal(t, http.StatusOK, w.Code)
72 assert.Equal(t, `{"hash":"3426a1488292d8f3f3c59ca679681336542b986f"}`, w.Body.String())
73 // DOWNLOAD
74
75 downloadHandler := NewGitFileHandler(mrc)
76
77 w = httptest.NewRecorder()
78 r, _ = http.NewRequest("GET", "/", nil)
79
80 // Simulate auth
81 r = r.WithContext(auth.CtxWithUser(r.Context(), author.Id()))
82
83 // Handler's params
84 r = mux.SetURLVars(r, map[string]string{
85 "repo": "",
86 "hash": "3426a1488292d8f3f3c59ca679681336542b986f",
87 })
88
89 downloadHandler.ServeHTTP(w, r)
90 assert.Equal(t, http.StatusOK, w.Code)
91
92 assert.Equal(t, data.Bytes(), w.Body.Bytes())
93}