This commit is contained in:
		
							parent
							
								
									3de0aaeec8
								
							
						
					
					
						commit
						7e27745bf7
					
				
							
								
								
									
										226
									
								
								internal/web/web_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								internal/web/web_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					package web_test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/http/httptest"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.kapelle.org/niklas/s3share/internal/client"
 | 
				
			||||||
 | 
						"git.kapelle.org/niklas/s3share/internal/db"
 | 
				
			||||||
 | 
						"git.kapelle.org/niklas/s3share/internal/s3"
 | 
				
			||||||
 | 
						"git.kapelle.org/niklas/s3share/internal/web"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setup(t *testing.T) (*httptest.Server, *assert.Assertions) {
 | 
				
			||||||
 | 
						client := client.NewClient(db.NewMock(), s3.NewMockS3())
 | 
				
			||||||
 | 
						router := web.CreateRouter(client, "admin", "hunter2")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ts := httptest.NewServer(router)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert := assert.New(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ts, assert
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func genCreateShareRequest(ts *httptest.Server, key string) *http.Request {
 | 
				
			||||||
 | 
						body := "{\"key\": \"" + key + "\"}"
 | 
				
			||||||
 | 
						req, _ := http.NewRequest("POST", ts.URL+"/api/share", bytes.NewReader([]byte(body)))
 | 
				
			||||||
 | 
						req.Header.Add("Authorization", "Basic YWRtaW46aHVudGVyMg==")
 | 
				
			||||||
 | 
						req.Header.Add("Content-Type", "application/json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return req
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCreateShare(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "test.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusCreated, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// check json response
 | 
				
			||||||
 | 
						var jsonResponse map[string]interface{}
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal("test.txt", jsonResponse["key"])
 | 
				
			||||||
 | 
						assert.NotNil(jsonResponse["slug"])
 | 
				
			||||||
 | 
						assert.NotEmpty(jsonResponse["slug"])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCreateShareInvalidKey(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "not_existing.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusBadRequest, res.StatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetShare(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "test.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusCreated, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var jsonResponse map[string]string
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err = http.NewRequest("GET", ts.URL+"/s/"+jsonResponse["slug"], nil)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err = http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusOK, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// check response
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal("inline; filename=\"test.txt\"", res.Header.Get("Content-Disposition"))
 | 
				
			||||||
 | 
						assert.Equal("text/plain", res.Header.Get("Content-Type"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						body, err := ioutil.ReadAll(res.Body)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal("test.txt", string(body))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetShareInvalidSlug(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", ts.URL+"/s/123456", nil)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusNotFound, res.StatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetShareFileExt(t *testing.T) {
 | 
				
			||||||
 | 
						// Basically the same as TestGetShare, but with a file extension in the slug
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "test.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusCreated, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var jsonResponse map[string]string
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err = http.NewRequest("GET", ts.URL+"/s/"+jsonResponse["slug"]+".txt", nil)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err = http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusOK, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// check response
 | 
				
			||||||
 | 
						assert.Equal("inline; filename=\"test.txt\"", res.Header.Get("Content-Disposition"))
 | 
				
			||||||
 | 
						assert.Equal("text/plain", res.Header.Get("Content-Type"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						body, err := ioutil.ReadAll(res.Body)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal("test.txt", string(body))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDeleteShare(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "test.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusCreated, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var jsonResponse map[string]string
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err = http.NewRequest("DELETE", ts.URL+"/api/share/"+jsonResponse["slug"], nil)
 | 
				
			||||||
 | 
						req.Header.Add("Authorization", "Basic YWRtaW46aHVudGVyMg==")
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err = http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusNoContent, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err = http.NewRequest("GET", ts.URL+"/s/"+jsonResponse["slug"], nil)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err = http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusNotFound, res.StatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDeleteShareInvalidSlug(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err := http.NewRequest("DELETE", ts.URL+"/api/share/123456", nil)
 | 
				
			||||||
 | 
						req.Header.Add("Authorization", "Basic YWRtaW46aHVudGVyMg==")
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusNotFound, res.StatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetAll(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := genCreateShareRequest(ts, "test.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusCreated, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var jsonResponse map[string]string
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err = http.NewRequest("GET", ts.URL+"/api/share", nil)
 | 
				
			||||||
 | 
						req.Header.Add("Authorization", "Basic YWRtaW46aHVudGVyMg==")
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err = http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusOK, res.StatusCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// check response
 | 
				
			||||||
 | 
						var jsonResponse2 []map[string]string
 | 
				
			||||||
 | 
						err = json.NewDecoder(res.Body).Decode(&jsonResponse2)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(1, len(jsonResponse2))
 | 
				
			||||||
 | 
						assert.Equal(jsonResponse["slug"], jsonResponse2[0]["slug"])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestInvalidAuth(t *testing.T) {
 | 
				
			||||||
 | 
						ts, assert := setup(t)
 | 
				
			||||||
 | 
						defer ts.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", ts.URL+"/api/share", nil)
 | 
				
			||||||
 | 
						req.Header.Add("Authorization", "Basic YWRtaW46aHVudGVyMw==")
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, err := http.DefaultClient.Do(req)
 | 
				
			||||||
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.Equal(http.StatusUnauthorized, res.StatusCode)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user