git_file_handlers_test.go

 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}