Skip to content

Commit 2fd1528

Browse files
Adding a happy path system tests for images
1 parent 5656fc0 commit 2fd1528

File tree

9 files changed

+151
-92
lines changed

9 files changed

+151
-92
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ ADMIN_BINARY_NAME=urchin-admin
1212
all: build test
1313

1414
prepare_env:
15-
cp -r migrations tests/system_tests/helpers/
15+
cp -r migrations tests/helpers/
1616

1717
build: prepare_env
1818
$(TEMPL) generate

admin-app/admin_responses.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type ImageIdResponse struct {
1616
}
1717

1818
type GetImageResponse struct {
19-
Id string `json:"id"`
19+
Id string `json:"uuid"`
2020
Name string `json:"name"`
2121
AltText string `json:"alt_text"`
2222
Extension string `json:"extension"`

tests/admin_app_tests/endpoint_tests/images_test.go

Lines changed: 25 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,17 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
"image"
98
"image/png"
109
"io"
1110
"mime/multipart"
1211
"net/http"
1312
"net/http/httptest"
14-
"net/textproto"
1513
"testing"
1614

1715
"github.com/fossoreslp/go-uuid-v4"
1816
admin_app "github.com/matheusgomes28/urchin/admin-app"
1917
"github.com/matheusgomes28/urchin/common"
18+
"github.com/matheusgomes28/urchin/tests/helpers"
2019
"github.com/matheusgomes28/urchin/tests/mocks"
2120
"github.com/stretchr/testify/assert"
2221
"github.com/stretchr/testify/require"
@@ -42,20 +41,11 @@ func TestPostImage(t *testing.T) {
4241
go func() {
4342
defer writer.Close()
4443

45-
part, err := createTestForm(writer, "file", "test.png", "image/png")
46-
if err != nil {
47-
t.Error(err)
48-
}
44+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
45+
require.Nil(t, err)
4946

50-
img := createImage()
51-
if err != nil {
52-
t.Error(err)
53-
}
54-
55-
err = png.Encode(part, img)
56-
if err != nil {
57-
t.Error(err)
58-
}
47+
err = png.Encode(part, helpers.CreateImage())
48+
require.Nil(t, err)
5949
}()
6050

6151
req, _ := http.NewRequest("POST", "/images", pr)
@@ -87,16 +77,12 @@ func TestPostImageNotAnImageFile(t *testing.T) {
8777
go func() {
8878
defer writer.Close()
8979

90-
part, err := createTestForm(writer, "file", "test.png", "image/png")
91-
if err != nil {
92-
t.Error(err)
93-
}
80+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
81+
require.Nil(t, err)
9482

9583
text := bytes.NewBufferString("This is some dumy text to check the content test")
9684
_, err = io.Copy(part, text)
97-
if err != nil {
98-
t.Error(err)
99-
}
85+
require.Nil(t, err)
10086
}()
10187

10288
req, _ := http.NewRequest("POST", "/images", pr)
@@ -122,21 +108,14 @@ func TestPostImageWrongFileContentType(t *testing.T) {
122108
go func() {
123109
defer writer.Close()
124110

125-
part, err := createTestForm(writer, "file", "test.png", "application/json")
126-
if err != nil {
127-
t.Error(err)
128-
}
129-
130-
img := createImage()
111+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "application/json")
112+
require.Nil(t, err)
113+
require.Nil(t, err)
131114

132-
if err != nil {
133-
t.Error(err)
134-
}
115+
img := helpers.CreateImage()
135116

136117
err = png.Encode(part, img)
137-
if err != nil {
138-
t.Error(err)
139-
}
118+
require.Nil(t, err)
140119
}()
141120

142121
req, _ := http.NewRequest("POST", "/images", pr)
@@ -162,20 +141,13 @@ func TestPostImageFailedToCreateDatabaseEntry(t *testing.T) {
162141
go func() {
163142
defer writer.Close()
164143

165-
part, err := createTestForm(writer, "file", "test.png", "image/png")
166-
if err != nil {
167-
t.Error(err)
168-
}
144+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
145+
require.Nil(t, err)
169146

170-
img := createImage()
171-
if err != nil {
172-
t.Error(err)
173-
}
147+
img := helpers.CreateImage()
174148

175149
err = png.Encode(part, img)
176-
if err != nil {
177-
t.Error(err)
178-
}
150+
require.Nil(t, err)
179151
}()
180152

181153
req, _ := http.NewRequest("POST", "/images", pr)
@@ -210,20 +182,13 @@ func TestGetImage(t *testing.T) {
210182
go func() {
211183
defer writer.Close()
212184

213-
part, err := createTestForm(writer, "file", "test.png", "image/png")
214-
if err != nil {
215-
t.Error(err)
216-
}
185+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
186+
require.Nil(t, err)
217187

218-
img := createImage()
219-
if err != nil {
220-
t.Error(err)
221-
}
188+
img := helpers.CreateImage()
222189

223190
err = png.Encode(part, img)
224-
if err != nil {
225-
t.Error(err)
226-
}
191+
require.Nil(t, err)
227192
}()
228193

229194
// TODO: We have to create the image first. Maybe there's a better way to do this?
@@ -315,20 +280,13 @@ func TestDeleteImage(t *testing.T) {
315280
go func() {
316281
defer writer.Close()
317282

318-
part, err := createTestForm(writer, "file", "test.png", "image/png")
319-
if err != nil {
320-
t.Error(err)
321-
}
283+
part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
284+
require.Nil(t, err)
322285

323-
img := createImage()
324-
if err != nil {
325-
t.Error(err)
326-
}
286+
img := helpers.CreateImage()
327287

328288
err = png.Encode(part, img)
329-
if err != nil {
330-
t.Error(err)
331-
}
289+
require.Nil(t, err)
332290
}()
333291

334292
// TODO: We have to create the image first. Maybe there's a better way to do this?
@@ -402,22 +360,3 @@ func TestDeleteImageNoImageFile(t *testing.T) {
402360

403361
assert.Equal(t, 200, delete_recorder.Code)
404362
}
405-
406-
func createTestForm(writer *multipart.Writer, fieldname string, filename string, contentType string) (io.Writer, error) {
407-
h := make(textproto.MIMEHeader)
408-
h.Set("Content-Disposition",
409-
fmt.Sprintf(`form-data; name="%s"; filename="%s"`, fieldname, filename))
410-
h.Set("Content-Type", contentType)
411-
return writer.CreatePart(h)
412-
}
413-
414-
// Creating an image in memory for testing: https://yourbasic.org/golang/create-image/
415-
func createImage() image.Image {
416-
width := 1
417-
height := 1
418-
419-
upLeft := image.Point{0, 0}
420-
lowRight := image.Point{width, height}
421-
422-
return image.NewRGBA(image.Rectangle{upLeft, lowRight})
423-
}
File renamed without changes.

tests/helpers/images.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package helpers
2+
3+
import (
4+
"fmt"
5+
"image"
6+
"io"
7+
"mime/multipart"
8+
"net/textproto"
9+
)
10+
11+
func CreateFormImagePart(writer *multipart.Writer, fieldname string, filename string, contentType string) (io.Writer, error) {
12+
h := make(textproto.MIMEHeader)
13+
h.Set("Content-Disposition",
14+
fmt.Sprintf(`form-data; name="%s"; filename="%s"`, fieldname, filename))
15+
h.Set("Content-Type", contentType)
16+
return writer.CreatePart(h)
17+
}
18+
19+
func CreateTextFormHeader(writer *multipart.Writer, fieldname string) (io.Writer, error) {
20+
h := make(textproto.MIMEHeader)
21+
h.Set("Content-Disposition",
22+
fmt.Sprintf(`form-data; name="%s"`, fieldname))
23+
return writer.CreatePart(h)
24+
}
25+
26+
// Creating an image in memory for testing: https://yourbasic.org/golang/create-image/
27+
func CreateImage() image.Image {
28+
width := 1
29+
height := 1
30+
31+
upLeft := image.Point{0, 0}
32+
lowRight := image.Point{width, height}
33+
34+
return image.NewRGBA(image.Rectangle{upLeft, lowRight})
35+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package admin_endpoint_tests
2+
3+
import (
4+
_ "database/sql"
5+
"encoding/json"
6+
"fmt"
7+
"image/png"
8+
"io"
9+
"mime/multipart"
10+
"net/http"
11+
"net/http/httptest"
12+
"testing"
13+
14+
_ "github.com/go-sql-driver/mysql"
15+
"github.com/stretchr/testify/require"
16+
17+
admin_app "github.com/matheusgomes28/urchin/admin-app"
18+
"github.com/matheusgomes28/urchin/tests/helpers"
19+
"github.com/pressly/goose/v3"
20+
)
21+
22+
func TestImageUpload(t *testing.T) {
23+
24+
// This is gonna be the in-memory mysql
25+
app_settings := helpers.GetAppSettings(30)
26+
go helpers.RunDatabaseServer(app_settings)
27+
database, err := helpers.WaitForDb(app_settings)
28+
require.Nil(t, err)
29+
goose.SetBaseFS(helpers.EmbedMigrations)
30+
31+
err = goose.SetDialect("mysql")
32+
require.Nil(t, err)
33+
34+
err = goose.Up(database.Connection, "migrations")
35+
require.Nil(t, err)
36+
37+
// Multipart image form creation
38+
pr, pw := io.Pipe()
39+
writer := multipart.NewWriter(pw)
40+
41+
go func() {
42+
defer writer.Close()
43+
44+
// Create the image part
45+
image_part, err := helpers.CreateFormImagePart(writer, "file", "test.png", "image/png")
46+
require.Nil(t, err)
47+
err = png.Encode(image_part, helpers.CreateImage())
48+
require.Nil(t, err)
49+
50+
// Create the alt part
51+
text_part, err := helpers.CreateTextFormHeader(writer, "alt")
52+
require.Nil(t, err)
53+
text_part.Write([]byte("test alt"))
54+
}()
55+
56+
// Execute multiform request
57+
post_recorder := httptest.NewRecorder()
58+
r := admin_app.SetupRoutes(app_settings, database)
59+
require.Nil(t, err)
60+
61+
req, _ := http.NewRequest("POST", "/images", pr)
62+
req.Header.Add("Content-Type", writer.FormDataContentType())
63+
r.ServeHTTP(post_recorder, req)
64+
65+
require.Equal(t, http.StatusOK, post_recorder.Code)
66+
67+
// Make sure returned an ID
68+
var image_id_response admin_app.ImageIdResponse
69+
err = json.Unmarshal(post_recorder.Body.Bytes(), &image_id_response)
70+
require.Nil(t, err)
71+
72+
// Make sure that we can request the image details from the DB
73+
get_recorder := httptest.NewRecorder()
74+
req, _ = http.NewRequest("GET", fmt.Sprintf("/images/%s", image_id_response.Id), nil)
75+
r.ServeHTTP(get_recorder, req)
76+
77+
var image_response admin_app.GetImageResponse
78+
err = json.Unmarshal(get_recorder.Body.Bytes(), &image_response)
79+
require.Nil(t, err)
80+
81+
require.Equal(t, image_id_response.Id, image_response.Id)
82+
require.Equal(t, image_response.AltText, "test alt")
83+
require.Equal(t, image_response.Extension, ".png")
84+
require.Equal(t, image_response.Name, "test.png")
85+
}

tests/system_tests/admin_app/endpoint_tests/post_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package admin_post_tests
1+
package admin_endpoint_tests
22

33
import (
44
"bytes"
@@ -13,7 +13,7 @@ import (
1313
"github.com/stretchr/testify/require"
1414

1515
admin_app "github.com/matheusgomes28/urchin/admin-app"
16-
"github.com/matheusgomes28/urchin/tests/system_tests/helpers"
16+
"github.com/matheusgomes28/urchin/tests/helpers"
1717
"github.com/pressly/goose/v3"
1818
)
1919

tests/system_tests/app/endpoint_tests/index_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/stretchr/testify/require"
1111

1212
"github.com/matheusgomes28/urchin/app"
13-
"github.com/matheusgomes28/urchin/tests/system_tests/helpers"
13+
"github.com/matheusgomes28/urchin/tests/helpers"
1414
"github.com/pressly/goose/v3"
1515
)
1616

tests/system_tests/app/endpoint_tests/post_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/stretchr/testify/require"
1111

1212
"github.com/matheusgomes28/urchin/app"
13-
"github.com/matheusgomes28/urchin/tests/system_tests/helpers"
13+
"github.com/matheusgomes28/urchin/tests/helpers"
1414
"github.com/pressly/goose/v3"
1515
)
1616

0 commit comments

Comments
 (0)