orm_test.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. package orm
  2. import (
  3. "strings"
  4. "testing"
  5. "github.com/remogatto/prettytest"
  6. )
  7. var (
  8. dummy_classes []string = []string{"1A", "1B", "2A", "2B"}
  9. dummy_teachers []string = []string{"Marco Rossi", "Gino Bianchi", "Piero Verdi", "Gaia Rossa"}
  10. dummy_subjects []string = []string{"Italiano", "Latino", "Matematica", "Fisica", "Storia dell'arte"}
  11. teacher_max_hours = 18
  12. )
  13. type testSuite struct {
  14. prettytest.Suite
  15. }
  16. func createSubject(name string) {
  17. if err := DB().Create(&Subject{Name: name}).Error; err != nil {
  18. panic(err)
  19. }
  20. }
  21. func createClass(name string) {
  22. if err := DB().Create(&Class{Name: name}).Error; err != nil {
  23. panic(err)
  24. }
  25. }
  26. func createTeacher(name string, surname string) {
  27. if err := DB().Create(&Teacher{
  28. Credential: Credential{Name: name, Surname: surname},
  29. Hours: teacher_max_hours,
  30. }).Error; err != nil {
  31. panic(err)
  32. }
  33. }
  34. func createDummyData() {
  35. // Create subjects
  36. for _, s := range dummy_subjects {
  37. createSubject(s)
  38. }
  39. // Create classes
  40. for _, c := range dummy_classes {
  41. createClass(c)
  42. }
  43. // Create teachers
  44. for _, t := range dummy_teachers {
  45. splits := strings.Split(t, " ")
  46. createTeacher(splits[0], splits[1])
  47. }
  48. }
  49. func TestRunner(t *testing.T) {
  50. prettytest.Run(
  51. t,
  52. new(testSuite),
  53. )
  54. }
  55. func (t *testSuite) BeforeAll() {
  56. db, err := New("root:password@/karmen_test?charset=utf8&parseTime=True&loc=Local")
  57. if err != nil {
  58. panic(err)
  59. }
  60. Use(db)
  61. Reset()
  62. AutoMigrate()
  63. // Create dummy data on the DB
  64. createDummyData()
  65. }
  66. func (t *testSuite) Before() {
  67. var activities []Activity
  68. if err := DB().Find(&activities).Error; err != nil {
  69. panic(err)
  70. }
  71. for _, a := range activities {
  72. DB().Unscoped().Delete(&a)
  73. }
  74. if err := DB().Exec("ALTER TABLE activities AUTO_INCREMENT = 1").Error; err != nil {
  75. panic(err)
  76. }
  77. }
  78. func (t *testSuite) TestCredential() {
  79. var teacher Teacher
  80. teacher.Name = "John"
  81. teacher.Surname = "Doe"
  82. if err := DB().Create(&teacher).Error; err != nil {
  83. panic(err)
  84. }
  85. if err := DB().Find(&teacher).Error; err != nil {
  86. panic(err)
  87. }
  88. t.Equal(teacher.Username, "john.doe")
  89. t.Equal(teacher.Email, "john.doe@foo.org")
  90. t.Equal(teacher.Password, "RKDb/GzQw8jzfAFwiAjclA81oBtzYWx0")
  91. }
  92. func (t *testSuite) TestCreateUpdateActivity() {
  93. var (
  94. class Class
  95. subject Subject
  96. )
  97. activity := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  98. // Activity 1
  99. if err := DB().Create(&activity).Error; err != nil {
  100. panic(err)
  101. }
  102. // Marco Rossi
  103. teacher := Teacher{}
  104. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  105. panic(err)
  106. }
  107. // 1A
  108. if err := DB().Find(&class, 1).Error; err != nil {
  109. panic(err)
  110. }
  111. // Italiano
  112. if err := DB().Find(&subject, 1).Error; err != nil {
  113. panic(err)
  114. }
  115. t.Equal(5, teacher.CurrHours)
  116. t.Equal("1A", teacher.Classes[0].Name)
  117. t.Equal("Italiano", teacher.Subjects[0].Name)
  118. // Add another activity and check for teacher's hours, subjects and classes
  119. // Subject: "Latino"
  120. // Class: "1B"
  121. activity = Activity{Hours: 3, TeacherID: 1, ClassID: 2, SubjectID: 2}
  122. // Activity 2
  123. if err := DB().Create(&activity).Error; err != nil {
  124. panic(err)
  125. }
  126. // Marco Rossi
  127. teacher = Teacher{}
  128. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  129. panic(err)
  130. }
  131. t.Equal(8, teacher.CurrHours)
  132. t.Equal("1A", teacher.Classes[0].Name)
  133. t.Equal("1B", teacher.Classes[1].Name)
  134. t.Equal("Italiano", teacher.Subjects[0].Name)
  135. t.Equal("Latino", teacher.Subjects[1].Name)
  136. // Add an activity without teacher
  137. // Subject: "Latino"
  138. // Class: "2A"
  139. activity = Activity{Hours: 3, TeacherID: 0, ClassID: 3, SubjectID: 2}
  140. // Activity 3
  141. if err := DB().Create(&activity).Error; err != nil {
  142. panic(err)
  143. }
  144. // Test update activty
  145. activity = Activity{}
  146. if err := DB().Find(&activity, 1).Error; err != nil {
  147. panic(err)
  148. }
  149. activity.Hours = 4
  150. if err := DB().Save(&activity).Error; err != nil {
  151. panic(err)
  152. }
  153. // Marco Rossi
  154. teacher = Teacher{}
  155. if err := DB().Find(&teacher, 1).Error; err != nil {
  156. panic(err)
  157. }
  158. t.Equal(7, teacher.CurrHours)
  159. // Delete an activity and check for the right number of hours and associations
  160. if err := DB().Delete(&activity).Error; err != nil {
  161. panic(err)
  162. }
  163. // Marco Rossi
  164. teacher = Teacher{}
  165. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  166. panic(err)
  167. }
  168. t.Equal(3, teacher.CurrHours)
  169. t.Equal(1, len(teacher.Classes))
  170. t.Equal(1, len(teacher.Subjects))
  171. t.Equal("1B", teacher.Classes[0].Name)
  172. t.Equal("Latino", teacher.Subjects[0].Name)
  173. // Remove teacher from activity and check for consistency
  174. activity = Activity{}
  175. teacher = Teacher{}
  176. if err := DB().Find(&activity, 2).Error; err != nil {
  177. panic(err)
  178. }
  179. activity.TeacherID = 0
  180. if err := DB().Save(&activity).Error; err != nil {
  181. panic(err)
  182. }
  183. // Marco Rossi
  184. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  185. panic(err)
  186. }
  187. t.Equal(0, teacher.CurrHours)
  188. t.Equal(0, len(teacher.Classes))
  189. t.Equal(0, len(teacher.Subjects))
  190. // Change teacher in activity and check for consistency
  191. // Subject: "Latino"
  192. // Class: "1B"
  193. activity = Activity{Hours: 3, TeacherID: 1, ClassID: 2, SubjectID: 2}
  194. // Activity 3
  195. if err := DB().Create(&activity).Error; err != nil {
  196. panic(err)
  197. }
  198. activity.TeacherID = 2
  199. if err := DB().Save(&activity).Error; err != nil {
  200. panic(err)
  201. }
  202. // Marco Rossi
  203. teacher = Teacher{}
  204. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  205. panic(err)
  206. }
  207. t.Equal(0, teacher.CurrHours)
  208. t.Equal(0, len(teacher.Classes))
  209. t.Equal(0, len(teacher.Subjects))
  210. }
  211. func (t *testSuite) TestClassTeachers() {
  212. var class Class
  213. activity_1 := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  214. if err := DB().Create(&activity_1).Error; err != nil {
  215. panic(err)
  216. }
  217. activity_2 := Activity{Hours: 3, TeacherID: 1, ClassID: 2, SubjectID: 2}
  218. if err := DB().Create(&activity_2).Error; err != nil {
  219. panic(err)
  220. }
  221. if err := DB().Preload("Teachers").First(&class, 1).Error; err != nil {
  222. panic(err)
  223. }
  224. subjects := class.Teachers[0].GetSubjectsByClassID(class.ID)
  225. t.Equal(1, len(subjects))
  226. t.Equal("Italiano", subjects[0].Name)
  227. }
  228. func (t *testSuite) TestCoordinatorMinuter() {
  229. var (
  230. class Class
  231. teacher_1 Teacher
  232. teacher_2 Teacher
  233. )
  234. activity_1 := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  235. if err := DB().Create(&activity_1).Error; err != nil {
  236. panic(err)
  237. }
  238. activity_2 := Activity{Hours: 5, TeacherID: 2, ClassID: 1, SubjectID: 1}
  239. if err := DB().Create(&activity_2).Error; err != nil {
  240. panic(err)
  241. }
  242. if err := DB().First(&class, 1).Error; err != nil {
  243. panic(err)
  244. }
  245. class.CoordinatorID = 1
  246. class.MinuterID = 2
  247. if err := DB().Save(&class).Error; err != nil {
  248. panic(err)
  249. }
  250. if err := DB().Find(&teacher_1, 1).Error; err != nil {
  251. panic(err)
  252. }
  253. if err := DB().Find(&teacher_2, 2).Error; err != nil {
  254. panic(err)
  255. }
  256. classes_1 := teacher_1.IsCoordinator()
  257. t.Equal(1, len(classes_1))
  258. if len(classes_1) > 0 {
  259. t.Equal("1A", classes_1[0].Name)
  260. }
  261. classes_2 := teacher_2.IsMinuter()
  262. t.Equal(1, len(classes_2))
  263. if len(classes_2) > 0 {
  264. t.Equal("1A", classes_2[0].Name)
  265. }
  266. }
  267. func (t *testSuite) TestTeacherHasClass() {
  268. activity := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  269. // Activity 1
  270. if err := DB().Create(&activity).Error; err != nil {
  271. panic(err)
  272. }
  273. // Marco Rossi
  274. teacher := Teacher{}
  275. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  276. panic(err)
  277. }
  278. t.True(teacher.HasClass("1A"))
  279. }
  280. func (t *testSuite) TestTeacherHasSubject() {
  281. activity := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  282. // Activity 1
  283. if err := DB().Create(&activity).Error; err != nil {
  284. panic(err)
  285. }
  286. // Marco Rossi
  287. teacher := Teacher{}
  288. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  289. panic(err)
  290. }
  291. t.True(teacher.HasSubject("Italiano"))
  292. }
  293. func (t *testSuite) TestTeacherHasSubjectInClass() {
  294. activity := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  295. // Activity 1
  296. if err := DB().Create(&activity).Error; err != nil {
  297. panic(err)
  298. }
  299. // Marco Rossi
  300. teacher := Teacher{}
  301. if err := DB().Preload("Classes").Preload("Subjects").Find(&teacher, 1).Error; err != nil {
  302. panic(err)
  303. }
  304. t.True(teacher.HasSubjectInClass("Italiano", "1A"))
  305. }
  306. func (t *testSuite) TestTeacherIsCoordinatorInClass() {
  307. activity := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  308. // Activity 1
  309. if err := DB().Create(&activity).Error; err != nil {
  310. panic(err)
  311. }
  312. var class Class
  313. if err := DB().First(&class, 1).Error; err != nil {
  314. panic(err)
  315. }
  316. class.CoordinatorID = 1
  317. // Marco Rossi
  318. teacher := Teacher{}
  319. if err := DB().Preload("Classes").Find(&teacher, 1).Error; err != nil {
  320. panic(err)
  321. }
  322. t.True(teacher.IsCoordinatorInClass("1A"))
  323. }
  324. func (t *testSuite) TestTeacherIssues() {
  325. // activity_1 := Activity{Hours: 5, TeacherID: 1, ClassID: 1, SubjectID: 1}
  326. // activity_2 := Activity{Hours: 10, TeacherID: 1, ClassID: 2, SubjectID: 1}
  327. // if err := DB().Create(&activity_1).Error; err != nil {
  328. // panic(err)
  329. // }
  330. // if err := DB().Create(&activity_2).Error; err != nil {
  331. // panic(err)
  332. // }
  333. // // Marco Rossi
  334. // teacher := Teacher{}
  335. // if err := DB().Preload("Issues").Find(&teacher, 1).Error; err != nil {
  336. // panic(err)
  337. // }
  338. // t.Equal(1, len(teacher.Issues))
  339. // t.Equal(IssueTeacherHours, teacher.Issues[0].Type)
  340. }