server_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "reflect"
  9. "strings"
  10. "testing"
  11. "git.andreafazzi.eu/andrea/probo/client"
  12. "git.andreafazzi.eu/andrea/probo/logger"
  13. "git.andreafazzi.eu/andrea/probo/models"
  14. "github.com/remogatto/prettytest"
  15. )
  16. type testSuite struct {
  17. prettytest.Suite
  18. }
  19. type StubTestHubCollectorStore struct {
  20. tests []*models.Quiz
  21. }
  22. func (store *StubTestHubCollectorStore) CreateQuiz(test *client.CreateUpdateQuizRequest) (*models.Quiz, error) {
  23. return nil, nil
  24. }
  25. func (store *StubTestHubCollectorStore) UpdateQuiz(quiz *client.CreateUpdateQuizRequest, id string) (*models.Quiz, error) {
  26. store.tests[0].Question.Text = quiz.Question.Text
  27. return store.tests[0], nil
  28. }
  29. func (store *StubTestHubCollectorStore) ReadAllQuizzes() ([]*models.Quiz, error) {
  30. return store.tests, nil
  31. }
  32. func TestRunner(t *testing.T) {
  33. prettytest.Run(
  34. t,
  35. new(testSuite),
  36. new(integrationTestSuite),
  37. )
  38. }
  39. func (t *testSuite) BeforeAll() {
  40. logger.SetLevel(logger.Disabled)
  41. }
  42. func (t *testSuite) TestReadAllQuizzes() {
  43. expectedResult := &client.ReadAllQuizResponse{
  44. BaseResponse: client.BaseResponse{Status: "success"},
  45. Content: []*models.Quiz{
  46. {
  47. Question: &models.Question{ID: "1", Text: "Question 1"},
  48. Answers: []*models.Answer{{}, {}, {}},
  49. },
  50. },
  51. }
  52. store := &StubTestHubCollectorStore{[]*models.Quiz{
  53. {
  54. Question: &models.Question{ID: "1", Text: "Question 1"},
  55. Answers: []*models.Answer{{}, {}, {}},
  56. },
  57. }}
  58. server := NewProboCollectorServer(store)
  59. request, _ := http.NewRequest(http.MethodGet, "/quizzes", nil)
  60. response := httptest.NewRecorder()
  61. server.ServeHTTP(response, request)
  62. result := getResponse(response.Body)
  63. t.Equal("application/json", response.Header().Get("Content-Type"))
  64. t.True(testsAreEqual(result, expectedResult))
  65. t.Equal(http.StatusOK, response.Code)
  66. }
  67. func (t *testSuite) TestUpdateQuiz() {
  68. expectedResponse := &client.UpdateQuizResponse{
  69. BaseResponse: client.BaseResponse{Status: "success"},
  70. Content: &models.Quiz{
  71. Question: &models.Question{ID: "1", Text: "Updated Question 1"},
  72. Answers: []*models.Answer{{}, {}, {}},
  73. },
  74. }
  75. store := &StubTestHubCollectorStore{[]*models.Quiz{
  76. {
  77. Question: &models.Question{ID: "1", Text: "Question 1"},
  78. Answers: []*models.Answer{{}, {}, {}},
  79. },
  80. }}
  81. server := NewProboCollectorServer(store)
  82. payload := `
  83. {
  84. "question": {"text": "Updated Question 1"},
  85. "answers": [
  86. {"text": "Text of the answer 1", "correct": true},
  87. {"text": "Text of the answer 2"},
  88. {"text": "Text of the answer 3"},
  89. {"text": "Text of the answer 4"}
  90. ]
  91. }
  92. `
  93. request, _ := http.NewRequest(http.MethodPut, "/quizzes/update/1", strings.NewReader(payload))
  94. response := httptest.NewRecorder()
  95. server.ServeHTTP(response, request)
  96. result, err := decodeUpdateQuizResponse(response.Body)
  97. t.True(err == nil, fmt.Sprintf("Response should be decoded without errors: %v", err))
  98. if !t.Failed() {
  99. t.True(result.Status == expectedResponse.Status)
  100. t.True(reflect.DeepEqual(result, expectedResponse))
  101. t.Equal("application/json", response.Header().Get("Content-Type"))
  102. t.Equal(http.StatusAccepted, response.Code)
  103. }
  104. }
  105. func getResponse(body io.Reader) (response *client.ReadAllQuizResponse) {
  106. err := json.NewDecoder(body).Decode(&response)
  107. if err != nil {
  108. panic(fmt.Errorf("Unable to parse response from server %q: %v", body, err))
  109. }
  110. return
  111. }
  112. func decodeUpdateQuizResponse(body io.Reader) (response *client.UpdateQuizResponse, err error) {
  113. err = json.NewDecoder(body).Decode(&response)
  114. if err != nil {
  115. return nil, fmt.Errorf("Unable to parse the response %q from the server: %v", body, err)
  116. }
  117. return
  118. }
  119. func testsAreEqual(got, want *client.ReadAllQuizResponse) bool {
  120. return reflect.DeepEqual(got, want)
  121. }