package Api import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "net/http/httptest" "strings" "testing" "git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Database" "git.tovijaeschke.xyz/tovi/SuddenImpactRecords/Models" "github.com/gorilla/mux" ) func Test_getPosts(t *testing.T) { log.SetOutput(ioutil.Discard) Database.Init() r := mux.NewRouter() r.HandleFunc("/post", getPosts).Methods("GET") ts := httptest.NewServer(r) defer ts.Close() for i := 0; i < 20; i++ { postData := Models.Post{ Title: "Test post", Content: "Test content", FrontPage: true, Order: i, PostLinks: []Models.PostLink{ { Type: "Facebook", Link: "http://google.com/", }, }, } Database.CreatePost(&postData) defer Database.DB.Unscoped().Delete(&postData) } 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) { log.SetOutput(ioutil.Discard) Database.Init() r := mux.NewRouter() r.HandleFunc("/post/{postID}", getPost).Methods("GET") 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://google.com/", }, }, } Database.CreatePost(&postData) res, err := http.Get(fmt.Sprintf( "%s/post/%s", ts.URL, postData.ID, )) 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) } getPostData := new(Models.Post) err = json.NewDecoder(res.Body).Decode(getPostData) if err != nil { t.Errorf("Expected nil, recieved %s", err.Error()) } Database.DB.Unscoped().Delete(&postData) } func Test_createPost(t *testing.T) { log.SetOutput(ioutil.Discard) Database.Init() r := mux.NewRouter() r.HandleFunc("/post", createPost).Methods("POST") ts := httptest.NewServer(r) defer ts.Close() postJson := ` { "title": "Test post", "content": "Test content", "front_page": true, "order": 1, "links": [{ "type": "Facebook", "link": "http://google.com/" }] } ` res, err := http.Post(ts.URL+"/post", "application/json", strings.NewReader(postJson)) 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) } 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) } Database.DB.Unscoped().Delete(&postData) } func Test_deletePost(t *testing.T) { log.SetOutput(ioutil.Discard) Database.Init() r := mux.NewRouter() r.HandleFunc("/post/{postID}", deletePost).Methods("DELETE") 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://google.com/", }, }, } Database.CreatePost(&postData) 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()) } // 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) } Database.DB.Unscoped().Delete(&postData) } func Test_updatePost(t *testing.T) { log.SetOutput(ioutil.Discard) Database.Init() r := mux.NewRouter() r.HandleFunc("/post/{postID}", updatePost).Methods("PUT") 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://google.com/", }, }, } Database.CreatePost(&postData) 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()) } // 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) } Database.DB.Unscoped().Delete(&postData) }