You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
4.9 KiB

package Api
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"net/http/httptest"
"os"
"path"
"path/filepath"
"runtime"
"strconv"
"testing"
"git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Database"
"git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Models"
"github.com/gorilla/mux"
)
func init() {
// Fix working directory for tests
_, filename, _, _ := runtime.Caller(0)
dir := path.Join(path.Dir(filename), "..")
err := os.Chdir(dir)
if err != nil {
panic(err)
}
Database.InitTest()
r = mux.NewRouter()
}
func get(url string) (resp *http.Response, err error) {
for i := 0; i < 5; i++ {
resp, err = http.Get(url)
if err == nil {
return resp, err
}
}
return resp, err
}
// Image generates a *os.File with a random image using the loremflickr.com service
func fakeImage(width, height int, categories []string, prefix string, categoriesStrict bool) *os.File {
url := "https://loremflickr.com"
switch prefix {
case "g":
url += "/g"
case "p":
url += "/p"
case "red":
url += "/red"
case "green":
url += "/green"
case "blue":
url += "/blue"
}
url += string('/') + strconv.Itoa(width) + string('/') + strconv.Itoa(height)
if len(categories) > 0 {
url += string('/')
for _, category := range categories {
url += category + string(',')
}
if categoriesStrict {
url += "/all"
}
}
resp, err := get(url)
defer resp.Body.Close()
if err != nil {
panic(err)
}
f, err := ioutil.TempFile(os.TempDir(), "loremflickr-img-*.jpg")
if err != nil {
panic(err)
}
io.Copy(f, resp.Body)
err = f.Close()
if err != nil {
panic(err)
}
return f
}
func Test_createPostImages(t *testing.T) {
t.Log("Testing createPostImages...")
r.HandleFunc("/post/{postID}/image", createPostImage).Methods("POST")
ts := httptest.NewServer(r)
defer ts.Close()
postData := Models.Post{
Title: "Test post",
Content: "Test content",
FrontPage: true,
Order: 1,
PostLinks: []Models.PostLink{
{
Type: "Facebook",
Link: "http://facebook.com/",
},
},
}
err := Database.CreatePost(&postData)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
image := fakeImage(100, 100, []string{}, "", false)
image, err = os.Open(image.Name())
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("files", filepath.Base(image.Name()))
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
io.Copy(part, image)
writer.Close()
request, err := http.NewRequest(
"POST",
fmt.Sprintf(
"%s/post/%s/image",
ts.URL,
postData.ID,
),
body,
)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
request.Header.Add("Content-Type", writer.FormDataContentType())
client := &http.Client{}
res, err := client.Do(request)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
if res.StatusCode != http.StatusOK {
t.Errorf("Expected %d, recieved %d", http.StatusOK, res.StatusCode)
}
defer res.Body.Close()
updatePostData := new(Models.Post)
err = json.NewDecoder(res.Body).Decode(updatePostData)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
if len(updatePostData.PostImages) != 1 {
t.Errorf("Expected len(updatePostData.PostImages) == 1, recieved %d", len(updatePostData.PostImages))
}
for _, f := range updatePostData.PostImages {
if _, err := os.Stat("./" + f.Filepath); errors.Is(err, os.ErrNotExist) {
t.Errorf(
"File ./%s does not exist",
f.Filepath,
)
} else {
os.Remove("./" + f.Filepath)
}
}
}
func Test_deletePostImages(t *testing.T) {
t.Log("Testing createPostImages...")
r.HandleFunc("/post/{postID}/image/{imageID}", deletePostImage).Methods("DELETE")
ts := httptest.NewServer(r)
defer ts.Close()
image := fakeImage(100, 100, []string{}, "", false)
image, err := os.Open(image.Name())
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
defer image.Close()
postData := Models.Post{
Title: "Test post",
Content: "Test content",
FrontPage: true,
Order: 1,
PostLinks: []Models.PostLink{
{
Type: "Facebook",
Link: "http://facebook.com/",
},
},
PostImages: []Models.PostImage{
{
Filepath: image.Name(),
},
},
}
err = Database.CreatePost(&postData)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
req, err := http.NewRequest("DELETE", fmt.Sprintf(
"%s/post/%s/image/%s",
ts.URL,
postData.ID,
postData.PostImages[0].ID,
), nil)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
}
res, err := http.DefaultClient.Do(req)
if err != nil {
t.Errorf("Expected nil, recieved %s", err.Error())
return
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
t.Errorf("Expected %d, recieved %d", http.StatusOK, res.StatusCode)
}
}