package Api import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "os" "path" "runtime" "strings" "testing" "git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Database" "git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Models" "github.com/gorilla/mux" ) var ( r *mux.Router ) 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 createTestPost() (Models.Post, error) { userData, err := createTestUser(true) postData := Models.Post{ UserID: userData.ID, Title: "Test post", Content: "Test content", FrontPage: true, Order: 1, PostLinks: []Models.PostLink{ { Type: "Facebook", Link: "http://facebook.com/", }, }, } err = Database.CreatePost(&postData) return postData, err } func Test_getPosts(t *testing.T) { t.Log("Testing getPosts...") r.HandleFunc("/post", getPosts).Methods("GET") ts := httptest.NewServer(r) defer ts.Close() var err error for i := 0; i < 20; i++ { createTestPost() } res, err := http.Get(ts.URL + "/post?page=1&pageSize=10") 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) } getPostsData := new([]Models.Post) err = json.NewDecoder(res.Body).Decode(getPostsData) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } if len(*getPostsData) != 10 { t.Errorf("Expected 10, recieved %d", len(*getPostsData)) } } func Test_getPost(t *testing.T) { t.Log("Testing getPost...") r.HandleFunc("/post/{postID}", getPost).Methods("GET") ts := httptest.NewServer(r) defer ts.Close() postData, err := createTestPost() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) t.FailNow() } res, err := http.Get(fmt.Sprintf( "%s/post/%s", ts.URL, postData.ID, )) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) t.FailNow() } if res.StatusCode != http.StatusOK { t.Errorf("Expected %d, recieved %d", http.StatusOK, res.StatusCode) t.FailNow() } getPostData := new(Models.Post) err = json.NewDecoder(res.Body).Decode(getPostData) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) t.FailNow() } if getPostData.Title != "Test post" { t.Errorf("Expected title \"Test post\", recieved %s", getPostData.Title) t.FailNow() } if getPostData.Content != "Test content" { t.Errorf("Expected content \"Test content\", recieved %s", getPostData.Content) t.FailNow() } if len(getPostData.PostLinks) != 1 { t.Errorf("Expected len(PostLinks) == 1, recieved %d", len(getPostData.PostLinks)) t.FailNow() } } func Test_createPost(t *testing.T) { t.Log("Testing createPost...") r.HandleFunc("/post", createPost).Methods("POST") ts := httptest.NewServer(r) defer ts.Close() c, u, err := login() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) return } postJson := ` { "user_id": "%s", "title": "Test post", "content": "Test content", "front_page": true, "order": 1, "links": [{ "type": "Facebook", "link": "http://facebook.com/" }] } ` postJson = fmt.Sprintf(postJson, u.ID.String()) req, err := http.NewRequest("POST", ts.URL+"/post", strings.NewReader(postJson)) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) return } req.AddCookie(c) res, err := http.DefaultClient.Do(req) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) return } if res.StatusCode != http.StatusOK { t.Errorf("Expected %d, recieved %d", http.StatusOK, res.StatusCode) return } postData := new(Models.Post) err = json.NewDecoder(res.Body).Decode(postData) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } if postData.Title != "Test post" { t.Errorf("Expected title \"Test post\", recieved \"%s\"", postData.Title) } if postData.Content != "Test content" { t.Errorf("Expected content \"Test content\", recieved \"%s\"", postData.Content) } } func Test_deletePost(t *testing.T) { t.Log("Testing deletePost...") r.HandleFunc("/post/{postID}", deletePost).Methods("DELETE") ts := httptest.NewServer(r) defer ts.Close() c, _, err := login() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) return } postData, err := createTestPost() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) t.FailNow() } req, err := http.NewRequest("DELETE", fmt.Sprintf( "%s/post/%s", ts.URL, postData.ID, ), nil) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } req.AddCookie(c) // Fetch Request 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) } } func Test_updatePost(t *testing.T) { t.Log("Testing updatePost...") r.HandleFunc("/post/{postID}", updatePost).Methods("PUT") ts := httptest.NewServer(r) defer ts.Close() c, _, err := login() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) return } postData, err := createTestPost() if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } postJson := ` { "content": "New test content", "front_page": false, "order": 2 } ` req, err := http.NewRequest("PUT", fmt.Sprintf( "%s/post/%s", ts.URL, postData.ID, ), strings.NewReader(postJson)) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } req.AddCookie(c) // Fetch Request res, err := http.DefaultClient.Do(req) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } defer res.Body.Close() if res.StatusCode != http.StatusOK { t.Errorf("Expected %d, recieved %d", http.StatusOK, res.StatusCode) } updatePostData := new(Models.Post) err = json.NewDecoder(res.Body).Decode(updatePostData) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } if updatePostData.Content != "New test content" { t.Errorf("Expected \"New test content\", recieved %s", updatePostData.Content) } if updatePostData.FrontPage != false { t.Errorf("Expected false, recieved %t", updatePostData.FrontPage) } if updatePostData.Order != 2 { t.Errorf("Expected 2, recieved %d", updatePostData.Order) } }