collection_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package ezdb
  2. import (
  3. "errors"
  4. "testing"
  5. )
  6. // Basic struct for testing.
  7. type Student struct {
  8. Name string `json:"name"`
  9. Age int `json:"age"`
  10. }
  11. var invalidStudents = map[string]*Student{
  12. "": {},
  13. }
  14. var nonexistentStudentKey = "nonexistent"
  15. // Basic marshaler for testing.
  16. var studentMarshaler = JSON(func() *Student {
  17. return &Student{}
  18. })
  19. // Sample data.
  20. var students = map[string]*Student{
  21. "annie": {Name: "Annie", Age: 32},
  22. "ben": {Name: "Ben", Age: 50},
  23. "clive": {Name: "Clive", Age: 21},
  24. }
  25. // Sample data (marshaled).
  26. var studentsMarshaled = map[string][]byte{
  27. "annie": []byte("{\"name\":\"Annie\",\"age\":32}"),
  28. "ben": []byte("{\"name\":\"Ben\",\"age\":50}"),
  29. "clive": []byte("{\"name\":\"Clive\",\"age\":21}"),
  30. }
  31. type CollectionTest struct {
  32. C Collection[*Student]
  33. T *testing.T
  34. F map[string]func() error
  35. }
  36. func (c *CollectionTest) open() error {
  37. if err := c.C.Open(); err != nil {
  38. c.T.Errorf("(open) failed to open collection: %v", err)
  39. return err
  40. }
  41. return nil
  42. }
  43. func (c *CollectionTest) put() error {
  44. // Test collection can store all students
  45. for key, value := range students {
  46. if err := c.C.Put(key, value); err != nil {
  47. c.T.Errorf("(put) failed to put student '%s': %v", key, err)
  48. return err
  49. }
  50. c.T.Logf("(put) put student '%s'", key)
  51. }
  52. // Test collection does not accept invalid keys
  53. for key, value := range invalidStudents {
  54. if err := c.C.Put(key, value); err == nil {
  55. c.T.Errorf("(put) should not have put invalid student '%s'", key)
  56. return err
  57. }
  58. c.T.Logf("(put) skipped invalid student '%s'", key)
  59. }
  60. return nil
  61. }
  62. func (c *CollectionTest) has() error {
  63. // Test collection has all students
  64. for key := range students {
  65. has, err := c.C.Has(key)
  66. if err != nil {
  67. c.T.Errorf("(has) failed to test whether collection has student '%s': %v", key, err)
  68. return err
  69. } else if !has {
  70. c.T.Errorf("(has) expected collection to have student '%s'", key)
  71. return err
  72. }
  73. c.T.Logf("(has) found student '%s'", key)
  74. }
  75. // Test collection does claim to have a student that doesn't exist
  76. has, err := c.C.Has(nonexistentStudentKey)
  77. if err != nil {
  78. c.T.Errorf("(has) failed to test whether collection has nonexistent student: %v", err)
  79. } else if has {
  80. c.T.Error("(has) expected collection not to have nonexistent student")
  81. } else {
  82. c.T.Logf("(has) collection does not have nonexistent student")
  83. }
  84. return nil
  85. }
  86. func (c *CollectionTest) get() error {
  87. // Test collection can retrieve all students
  88. for key, expected := range students {
  89. actual, err := c.C.Get(key)
  90. if err != nil {
  91. c.T.Errorf("(get) failed to get student '%s': %v", key, err)
  92. continue
  93. } else if actual.Name != expected.Name {
  94. c.T.Errorf("(get) student '%s' has wrong name (expected '%s', got '%s')", key, expected.Name, actual.Name)
  95. } else if actual.Age != expected.Age {
  96. c.T.Errorf("(get) student '%s' has wrong age (expected '%s', got '%s')", key, expected.Name, actual.Name)
  97. } else {
  98. c.T.Logf("(get) correctly got student '%s'", key)
  99. }
  100. }
  101. // Test collection does not retrieve a nonexistent student
  102. _, err := c.C.Get(nonexistentStudentKey)
  103. if err == nil {
  104. c.T.Error("(get) expected collection to return an error for nonexistent student")
  105. } else {
  106. c.T.Log("(get) collection did not get a nonexistent student")
  107. }
  108. return nil
  109. }
  110. func (c *CollectionTest) delete() error {
  111. if err := c.C.Delete("annie"); err != nil {
  112. c.T.Errorf("(delete) failed to delete student '%s': %v", "annie", err)
  113. return err
  114. }
  115. // Confirm student has been deleted
  116. has, err := c.C.Has("annie")
  117. if err != nil {
  118. c.T.Errorf("(delete) failed to test whether collection has deleted student 'annie': %v", err)
  119. return err
  120. } else if has {
  121. c.T.Error("(delete) expected collection not to have deleted student 'annie'")
  122. return err
  123. } else {
  124. c.T.Log("(delete) collection did not get the deleted student 'annie'")
  125. }
  126. // Reinsert deleted student
  127. if err := c.C.Put("annie", students["annie"]); err != nil {
  128. c.T.Errorf("(delete) failed to reinsert student 'annie': %v", err)
  129. return err
  130. } else {
  131. c.T.Log("(delete) reinserted student 'annie'")
  132. }
  133. return nil
  134. }
  135. func (c *CollectionTest) iterCount() error {
  136. iter := c.C.Iter()
  137. defer iter.Release()
  138. expected := len(students)
  139. actual := iter.Count()
  140. if expected != actual {
  141. c.T.Errorf("(iterCount) incorrect count of students (expected %d, got %d)", expected, actual)
  142. return errors.New("incorrect count")
  143. } else {
  144. c.T.Logf("(iterCount) correct count of students (expected %d, got %d)", expected, actual)
  145. }
  146. return nil
  147. }
  148. func (c *CollectionTest) close() error {
  149. if c.F["close"] != nil {
  150. if err := c.F["close"](); err != nil {
  151. c.T.Errorf("(close) failed to close collection: %v", err)
  152. return err
  153. }
  154. } else if err := c.C.Close(); err != nil {
  155. c.T.Errorf("(close) failed to close collection: %v", err)
  156. return err
  157. }
  158. c.T.Log("(close) closed database")
  159. return nil
  160. }
  161. func (c *CollectionTest) Run() {
  162. tests := []func() error{
  163. c.open,
  164. c.put,
  165. c.has,
  166. c.get,
  167. c.delete,
  168. c.iterCount,
  169. c.close,
  170. }
  171. for _, test := range tests {
  172. if err := test(); err != nil {
  173. return
  174. }
  175. }
  176. }