package apitest import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "net/url" "testing" "git.artlef.fr/PersonalLibraryManager/internal/testutils" "github.com/stretchr/testify/assert" ) type bookSearchGet struct { Count int64 `json:"count"` Books []bookSearchGetBook `json:"books"` } type bookSearchGetBook struct { Id uint `json:"id"` Title string `json:"title" binding:"required,max=300"` Author string `json:"author" binding:"max=100"` Rating int `json:"rating"` Read bool `json:"read"` WantRead bool `json:"wantread"` CoverPath string `json:"coverPath"` } func TestSearchBook_MultipleBooks(t *testing.T) { result := testSearchBook(t, "san", "", "") assert.Equal(t, int64(2), result.Count) assert.Equal(t, 2, len(result.Books)) } func TestSearchBook_OneBookNotUserBook(t *testing.T) { result := testSearchBook(t, "iliade", "", "") assert.Equal(t, int64(1), result.Count) assert.Equal(t, []bookSearchGetBook{{ Title: "Iliade", Author: "Homère", Id: 29, Rating: 0, Read: false, WantRead: false, CoverPath: "/bookcover/iliade.jpeg", }}, result.Books) } func TestSearchBook_OneBookRead(t *testing.T) { result := testSearchBook(t, "dieux", "", "") assert.Equal(t, int64(1), result.Count) assert.Equal(t, []bookSearchGetBook{{ Title: "Les dieux ont soif", Author: "Anatole France", Id: 4, Rating: 7, Read: true, WantRead: false, CoverPath: "/bookcover/lesdieuxontsoif.jpg", }}, result.Books) } //func TestSearchBook_ISBN(t *testing.T) { // result := testSearchBook(t, "9782070337903", "", "") // assert.Equal(t, int64(1), result.Count) // assert.Equal(t, // []bookSearchGetBook{{ // Title: "Le complot contre l'Amérique", // Author: "Philip Roth", // Id: 22, // Rating: 6, // Read: true, // WantRead: false, // CoverPath: "/bookcover/lecomplotcontrelamerique.jpg", // }}, // result) //} func TestSearchBook_Limit(t *testing.T) { result := testSearchBook(t, "a", "10", "") assert.Equal(t, 10, len(result.Books)) } func TestSearchBook_Offset(t *testing.T) { result := testSearchBook(t, "sa", "", "2") assert.Equal(t, int64(5), result.Count) assert.Equal(t, 3, len(result.Books)) } func testSearchBook(t *testing.T, searchterm string, limit string, offset string) bookSearchGet { router := testutils.TestSetup() u, err := url.Parse("/search/" + searchterm) if err != nil { t.Error(err) } if limit != "" { q := u.Query() q.Set("limit", limit) u.RawQuery = q.Encode() } if offset != "" { q := u.Query() q.Set("offset", offset) u.RawQuery = q.Encode() } token := testutils.ConnectDemoUser(router) req, _ := http.NewRequest("GET", u.String(), nil) req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) w := httptest.NewRecorder() router.ServeHTTP(w, req) var result bookSearchGet s := w.Body.String() err = json.Unmarshal([]byte(s), &result) if err != nil { t.Error(err) } assert.Equal(t, 200, w.Code) return result }