quiz_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package store
  2. import (
  3. "reflect"
  4. "git.andreafazzi.eu/andrea/probo/pkg/models"
  5. "github.com/remogatto/prettytest"
  6. )
  7. type quizTestSuite struct {
  8. prettytest.Suite
  9. }
  10. func (t *quizTestSuite) TestCreateQuiz() {
  11. store := NewQuizStore()
  12. quiz, err := store.Create(
  13. &models.Quiz{
  14. Question: &models.Question{Text: "Newly created question text with #tag."},
  15. Answers: []*models.Answer{
  16. {Text: "Answer 1"},
  17. {Text: "Answer 2"},
  18. {Text: "Answer 3"},
  19. {Text: "Answer 4"},
  20. },
  21. CorrectPos: 0,
  22. })
  23. t.Nil(err, "Quiz should be created without error")
  24. if !t.Failed() {
  25. quizFromMemory, err := store.Read(quiz.GetID())
  26. t.Nil(err, "Quiz should be found in the store")
  27. if !t.Failed() {
  28. t.True(quizFromMemory.GetID() != "")
  29. t.Equal(len(quizFromMemory.Tags), 1)
  30. t.Equal(len(store.questions.ids), 1)
  31. t.Equal(len(store.answers.ids), 4)
  32. if !t.Failed() {
  33. t.True(reflect.DeepEqual(quizFromMemory, quiz), "Quiz should be equal")
  34. }
  35. }
  36. }
  37. }
  38. func (t *quizTestSuite) TestDuplicateQuiz() {
  39. store := NewQuizStore()
  40. _, err := store.Create(
  41. &models.Quiz{
  42. Question: &models.Question{Text: "Newly created question text."},
  43. Answers: []*models.Answer{
  44. {Text: "Answer 1"},
  45. {Text: "Answer 2"},
  46. {Text: "Answer 3"},
  47. {Text: "Answer 4"},
  48. },
  49. CorrectPos: 0,
  50. })
  51. t.Nil(err, "Quiz 1 should be created without error")
  52. _, err = store.Create(
  53. &models.Quiz{
  54. Question: &models.Question{Text: "Newly created question text."},
  55. Answers: []*models.Answer{
  56. {Text: "Answer 2"},
  57. {Text: "Answer 1"},
  58. {Text: "Answer 3"},
  59. {Text: "Answer 4"},
  60. },
  61. CorrectPos: 1,
  62. })
  63. t.Not(t.Nil(err), "Quiz 2 should not be created")
  64. }
  65. func (t *quizTestSuite) TestReadQuiz() {
  66. store := NewQuizStore()
  67. quiz, err := store.Create(
  68. &models.Quiz{
  69. Question: &models.Question{Text: "Newly created question text."},
  70. Answers: []*models.Answer{
  71. {Text: "Answer 1"},
  72. {Text: "Answer 2"},
  73. {Text: "Answer 3"},
  74. {Text: "Answer 4"},
  75. },
  76. CorrectPos: 0,
  77. })
  78. t.Nil(err, "Quiz should be created without error")
  79. if !t.Failed() {
  80. quizzes := store.ReadAll()
  81. t.Equal(1, len(quizzes))
  82. storedQuiz, err := store.Read(quiz.GetID())
  83. t.Nil(err, "Quiz should be read without error")
  84. if !t.Failed() {
  85. t.Equal(quiz.ID, storedQuiz.ID)
  86. }
  87. }
  88. }
  89. func (t *quizTestSuite) TestUpdateQuiz() {
  90. store := NewQuizStore()
  91. quiz, err := store.Create(
  92. &models.Quiz{
  93. Question: &models.Question{Text: "Newly created question text."},
  94. Answers: []*models.Answer{
  95. {Text: "Answer 1"},
  96. {Text: "Answer 2"},
  97. {Text: "Answer 3"},
  98. {Text: "Answer 4"},
  99. },
  100. CorrectPos: 0,
  101. })
  102. t.Nil(err, "Quiz should be created without error")
  103. if !t.Failed() {
  104. updatedQuiz, err := store.Update(
  105. &models.Quiz{
  106. Question: &models.Question{Text: "Updated question text with #tag."},
  107. Answers: []*models.Answer{
  108. {Text: "Answer 1"},
  109. {Text: "Answer 2"},
  110. {Text: "Answer 3"},
  111. {Text: "Answer 4"},
  112. },
  113. CorrectPos: 0,
  114. }, quiz.GetID())
  115. updatedQuizFromMemory, err := store.Read(quiz.GetID())
  116. t.Nil(err, "Quiz should be found in the store")
  117. if !t.Failed() {
  118. t.Equal(updatedQuizFromMemory.GetID(), updatedQuiz.GetID())
  119. t.Equal(updatedQuizFromMemory.Question.Text, updatedQuiz.Question.Text)
  120. t.Equal(len(updatedQuizFromMemory.Tags), 1)
  121. }
  122. }
  123. }
  124. func (t *quizTestSuite) TestDeleteQuiz() {
  125. store := NewQuizStore()
  126. _, err := store.Create(
  127. &models.Quiz{
  128. Question: &models.Question{Text: "Newly created question text."},
  129. Answers: []*models.Answer{
  130. {Text: "Answer 1"},
  131. {Text: "Answer 2"},
  132. {Text: "Answer 3"},
  133. {Text: "Answer 4"},
  134. },
  135. CorrectPos: 0,
  136. })
  137. t.Nil(err, "Quiz should be created without error")
  138. if !t.Failed() {
  139. quiz_2, err := store.Create(
  140. &models.Quiz{
  141. Question: &models.Question{Text: "Newly created question text 2."},
  142. Answers: []*models.Answer{
  143. {Text: "Answer 1"},
  144. {Text: "Answer 2"},
  145. {Text: "Answer 3"},
  146. {Text: "Answer 4"},
  147. },
  148. CorrectPos: 0,
  149. })
  150. t.Nil(err, "Quiz should be created without error")
  151. if !t.Failed() {
  152. _, err := store.Delete(quiz_2.GetID())
  153. t.Nil(err, "Quiz should be deleted without error")
  154. t.Equal(1, len(store.ids))
  155. t.Equal(1, len(store.hashes))
  156. }
  157. }
  158. }
  159. func (t *quizTestSuite) TestFilter() {
  160. store := NewQuizStore()
  161. quiz_1, _ := store.Create(
  162. &models.Quiz{
  163. Question: &models.Question{Text: "Question text with #tag1."},
  164. Answers: []*models.Answer{
  165. {Text: "Answer 1"},
  166. {Text: "Answer 2 with #tag2"},
  167. {Text: "Answer 3"},
  168. {Text: "Answer 4"},
  169. },
  170. CorrectPos: 0,
  171. })
  172. quiz_2, _ := store.Create(
  173. &models.Quiz{
  174. Question: &models.Question{Text: "Question text with #tag3."},
  175. Answers: []*models.Answer{
  176. {Text: "Answer 1"},
  177. {Text: "Answer 2 with #tag4"},
  178. {Text: "Answer 3"},
  179. {Text: "Answer 4"},
  180. },
  181. CorrectPos: 0,
  182. })
  183. quizzes := store.Filter([]*models.Quiz{quiz_1, quiz_2}, func(q *models.Quiz) bool {
  184. for _, t := range q.Tags {
  185. if t.Name == "#tag1" {
  186. return true
  187. }
  188. }
  189. return false
  190. })
  191. t.Equal(1, len(quizzes))
  192. }
  193. func (t *quizTestSuite) TestParseTextForTags() {
  194. store := NewQuizStore()
  195. quiz, err := store.Create(
  196. &models.Quiz{
  197. Question: &models.Question{Text: "Question text with #tag1."},
  198. Answers: []*models.Answer{
  199. {Text: "Answer 1"},
  200. {Text: "Answer 2 with #tag2"},
  201. {Text: "Answer 3"},
  202. {Text: "Answer 4"},
  203. },
  204. CorrectPos: 0,
  205. })
  206. t.Nil(err, "Quiz should be created without errors.")
  207. if !t.Failed() {
  208. storedQuiz, err := store.Read(quiz.GetID())
  209. t.Nil(err, "Quiz should be found in the store.")
  210. t.Equal(2, len(storedQuiz.Tags))
  211. if !t.Failed() {
  212. t.Equal("#tag1", storedQuiz.Tags[0].Name)
  213. t.Equal("#tag2", storedQuiz.Tags[1].Name)
  214. }
  215. }
  216. }