quiz_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package file
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "git.andreafazzi.eu/andrea/probo/pkg/models"
  7. "git.andreafazzi.eu/andrea/probo/pkg/store"
  8. "github.com/remogatto/prettytest"
  9. )
  10. type quizTestSuite struct {
  11. prettytest.Suite
  12. }
  13. func (t *quizTestSuite) TestReadAll() {
  14. store, err := NewDefaultQuizFileStore()
  15. t.Nil(err)
  16. if !t.Failed() {
  17. result := store.ReadAll()
  18. t.Equal(
  19. 4,
  20. len(result),
  21. fmt.Sprintf(
  22. "The store contains 5 files but only 4 should be parsed (duplicated quiz). Total of parsed quizzes are instead %v",
  23. len(result),
  24. ),
  25. )
  26. files, _ := os.ReadDir(GetDefaultQuizzesDir())
  27. t.Equal(5, len(files))
  28. _, err = removeQuizHeader(filepath.Join(store.Dir, "quiz_5.md"))
  29. }
  30. }
  31. func (t *quizTestSuite) TestCreate() {
  32. store, err := NewQuizFileStore(
  33. &FileStoreConfig[*models.Quiz, *store.QuizStore]{
  34. FilePathConfig: FilePathConfig{GetDefaultQuizzesDir(), "quiz", ".md"},
  35. IndexDirFunc: DefaultQuizIndexDirFunc,
  36. NoIndexOnCreate: true,
  37. },
  38. )
  39. t.Nil(err)
  40. if !t.Failed() {
  41. quiz, err := store.Create(
  42. &models.Quiz{
  43. Question: &models.Question{Text: "Newly created question text with #tag1 #tag2."},
  44. Answers: []*models.Answer{
  45. {Text: "Answer 1"},
  46. {Text: "Answer 2"},
  47. {Text: "Answer 3"},
  48. {Text: "Answer 4"},
  49. },
  50. CorrectPos: 0,
  51. })
  52. t.Nil(err)
  53. t.Equal(2, len(quiz.Tags))
  54. if !t.Failed() {
  55. path := store.GetPath(quiz)
  56. t.True(path != "", "Path should not be empty.")
  57. exists, err := os.Stat(path)
  58. t.Nil(err)
  59. if !t.Failed() {
  60. t.True(exists != nil, "The new quiz file was not created.")
  61. if !t.Failed() {
  62. quizFromDisk, err := readQuizFromDisk(path)
  63. defer os.Remove(path)
  64. quizFromDisk.Correct = quiz.Answers[0]
  65. quizFromDisk.Tags = quiz.Tags
  66. t.Nil(err)
  67. if !t.Failed() {
  68. t.Equal(quizFromDisk.Question.Text, quiz.Question.Text)
  69. for i, a := range quizFromDisk.Answers {
  70. t.Equal(a.Text, quiz.Answers[i].Text)
  71. }
  72. for i, tag := range quizFromDisk.Tags {
  73. t.Equal(tag.Name, quiz.Tags[i].Name)
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. }
  81. func (t *quizTestSuite) TestDelete() {
  82. store, err := NewQuizFileStore(
  83. &FileStoreConfig[*models.Quiz, *store.QuizStore]{
  84. FilePathConfig: FilePathConfig{GetDefaultQuizzesDir(), "quiz", ".md"},
  85. IndexDirFunc: DefaultQuizIndexDirFunc,
  86. NoIndexOnCreate: true,
  87. },
  88. )
  89. t.Nil(err)
  90. if !t.Failed() {
  91. quiz, err := store.Create(
  92. &models.Quiz{
  93. Question: &models.Question{Text: "This quiz should be deleted."},
  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)
  103. if !t.Failed() {
  104. path := store.GetPath(quiz)
  105. _, err := store.Delete(quiz.ID)
  106. t.Nil(err, fmt.Sprintf("Quiz should be deleted without errors: %v", err))
  107. if !t.Failed() {
  108. _, err := os.Stat(path)
  109. t.Not(t.Nil(err))
  110. }
  111. }
  112. }
  113. }
  114. func (t *quizTestSuite) TestUpdate() {
  115. store, err := NewQuizFileStore(
  116. &FileStoreConfig[*models.Quiz, *store.QuizStore]{
  117. FilePathConfig: FilePathConfig{GetDefaultQuizzesDir(), "quiz", ".md"},
  118. IndexDirFunc: DefaultQuizIndexDirFunc,
  119. NoIndexOnCreate: true,
  120. },
  121. )
  122. t.Nil(err)
  123. if !t.Failed() {
  124. quiz, err := store.Create(
  125. &models.Quiz{
  126. Question: &models.Question{Text: "Newly created question text with #tag1 #tag2."},
  127. Answers: []*models.Answer{
  128. {Text: "Answer 1"},
  129. {Text: "Answer 2"},
  130. {Text: "Answer 3"},
  131. {Text: "Answer 4"},
  132. },
  133. CorrectPos: 0,
  134. })
  135. t.Nil(err)
  136. _, err = store.Update(&models.Quiz{
  137. Question: &models.Question{Text: "Newly created question text with #tag1 #tag2 #tag3."},
  138. Answers: []*models.Answer{
  139. {Text: "Answer 1"},
  140. {Text: "Answer 2"},
  141. {Text: "Answer 3"},
  142. {Text: "Answer 4"},
  143. },
  144. CorrectPos: 1,
  145. }, quiz.ID)
  146. t.Nil(err)
  147. updatedQuizFromMemory, err := store.Read(quiz.ID)
  148. t.Equal(len(updatedQuizFromMemory.Tags), 3)
  149. t.Equal("Answer 2", updatedQuizFromMemory.Correct.Text)
  150. defer os.Remove(store.GetPath(quiz))
  151. }
  152. }
  153. func (t *quizTestSuite) TestAutowriteHeader() {
  154. store, err := NewDefaultQuizFileStore()
  155. t.Nil(err)
  156. if !t.Failed() {
  157. meta, err := readQuizHeader(filepath.Join(store.Dir, "quiz_5.md"))
  158. t.Nil(err)
  159. if !t.Failed() {
  160. t.Not(t.Nil(meta))
  161. if !t.Failed() {
  162. t.True(meta.ID != "", "ID should not be empty")
  163. if !t.Failed() {
  164. _, err = removeQuizHeader(filepath.Join(store.Dir, "quiz_5.md"))
  165. t.True(err == nil)
  166. }
  167. }
  168. }
  169. }
  170. }
  171. func readQuizFromDisk(path string) (*models.Quiz, error) {
  172. content, err := os.ReadFile(path)
  173. if err != nil {
  174. return nil, err
  175. }
  176. result := new(models.Quiz)
  177. err = result.Unmarshal(content)
  178. if err != nil {
  179. return nil, err
  180. }
  181. return result, nil
  182. }