sync_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package sync_test
  2. import (
  3. "fmt"
  4. "log"
  5. "testing"
  6. "time"
  7. "github.com/remogatto/prettytest"
  8. karmen_client "gogs.carduccidante.edu.it/karmen/core/client"
  9. "gogs.carduccidante.edu.it/karmen/core/config"
  10. "gogs.carduccidante.edu.it/karmen/core/cron/sync"
  11. karmen_ldap "gogs.carduccidante.edu.it/karmen/core/ldap"
  12. "gogs.carduccidante.edu.it/karmen/core/orm"
  13. )
  14. type testSuite struct {
  15. prettytest.Suite
  16. }
  17. var (
  18. ldap *karmen_ldap.Client
  19. karmen *karmen_client.Client
  20. conf *config.ConfigT
  21. )
  22. func TestRunner(t *testing.T) {
  23. prettytest.Run(
  24. t,
  25. new(testSuite),
  26. )
  27. }
  28. func (t *testSuite) BeforeAll() {
  29. var err error
  30. time.Sleep(time.Second * 10) // Wait for the server to go up...
  31. conf = new(config.ConfigT)
  32. err = config.ReadFile("config.yaml", conf)
  33. if err != nil {
  34. panic(err)
  35. }
  36. ldap, err = karmen_ldap.NewClient("localhost:389", conf)
  37. if err != nil {
  38. panic(err)
  39. }
  40. karmen, err = karmen_client.Dial(conf.Url, conf.Admin.Username, conf.Admin.Password)
  41. if err != nil {
  42. log.Println(err)
  43. }
  44. }
  45. func (t *testSuite) AfterAll() {
  46. ldap.Close()
  47. }
  48. func (t *testSuite) TestSyncUsers() {
  49. syncJob := sync.NewSyncJob(conf)
  50. teachers, err := karmen.GetTeachers()
  51. t.Nil(err)
  52. entries, err := ldap.Users(conf.Sync.TeachersSearchBase)
  53. t.Nil(err)
  54. users := make([]orm.User, 0)
  55. for _, teacher := range teachers {
  56. users = append(users, teacher)
  57. }
  58. result, err := syncJob.SyncUsers(ldap, karmen, entries, users)
  59. t.Nil(err)
  60. if !t.Failed() {
  61. t.Equal(len(result.Added), 11)
  62. t.Equal(len(result.Updated), 0)
  63. t.Equal(len(result.Removed), 1)
  64. t.Equal(result.Removed[0], "cn=John DOE,ou=Teachers,ou=People,dc=foo,dc=org")
  65. }
  66. // Run sync two times should result in no updating
  67. teachers, err = karmen.GetTeachers()
  68. t.Nil(err)
  69. entries, err = ldap.Users(conf.Sync.TeachersSearchBase)
  70. t.Nil(err)
  71. users = make([]orm.User, 0)
  72. for _, teacher := range teachers {
  73. users = append(users, teacher)
  74. }
  75. result, err = syncJob.SyncUsers(ldap, karmen, entries, users)
  76. t.Nil(err)
  77. if !t.Failed() {
  78. t.Equal(len(result.Added), 0)
  79. t.Equal(len(result.Updated), 0)
  80. t.Equal(len(result.Removed), 0)
  81. }
  82. // Update user and test LDAP sync
  83. user := teachers[0]
  84. user.SetRegenerate(true)
  85. err = karmen.UpdateUser(user)
  86. t.Nil(err)
  87. teachers, err = karmen.GetTeachers()
  88. t.Nil(err)
  89. entries, err = ldap.Users(conf.Sync.TeachersSearchBase)
  90. t.Nil(err)
  91. users = make([]orm.User, 0)
  92. for _, teacher := range teachers {
  93. users = append(users, teacher)
  94. }
  95. result, err = syncJob.SyncUsers(ldap, karmen, entries, users)
  96. t.Nil(err)
  97. if !t.Failed() {
  98. t.Equal(len(result.Added), 0)
  99. t.Equal(len(result.Updated), 1)
  100. t.Equal(len(result.Removed), 0)
  101. }
  102. // Sync administratives
  103. administratives, err := karmen.GetAdministratives()
  104. t.Nil(err)
  105. entries, err = ldap.Users(conf.Sync.AdministrativesSearchBase)
  106. t.Nil(err)
  107. users = make([]orm.User, 0)
  108. for _, administrative := range administratives {
  109. users = append(users, administrative)
  110. }
  111. result, err = syncJob.SyncUsers(ldap, karmen, entries, users)
  112. t.Nil(err)
  113. if !t.Failed() {
  114. t.Equal(2, len(result.Added))
  115. t.Equal(0, len(result.Updated))
  116. t.Equal(0, len(result.Removed))
  117. }
  118. }
  119. func (t *testSuite) TestSyncGroup() {
  120. syncJob := sync.NewSyncJob(conf)
  121. teachers, err := karmen.GetTeachers()
  122. t.Nil(err)
  123. users := make([]orm.User, 0)
  124. for _, teacher := range teachers {
  125. users = append(users, teacher)
  126. }
  127. result, err := syncJob.SyncGroup(ldap, users, conf.Sync.TeachersGroup)
  128. t.Nil(err)
  129. if !t.Failed() {
  130. t.Equal(11, len(result.Added))
  131. t.Equal(0, len(result.Updated))
  132. t.Equal(0, len(result.Removed))
  133. }
  134. // Running twice should result in no update
  135. result, err = syncJob.SyncGroup(ldap, users, conf.Sync.TeachersGroup)
  136. t.Nil(err)
  137. if !t.Failed() {
  138. t.Equal(0, len(result.Added))
  139. t.Equal(0, len(result.Updated))
  140. t.Equal(0, len(result.Removed))
  141. }
  142. // Test ML sync
  143. result, err = syncJob.SyncGroup(ldap, users, conf.Sync.TeachersML)
  144. t.Nil(err)
  145. if !t.Failed() {
  146. t.Equal(11, len(result.Added))
  147. t.Equal(0, len(result.Updated))
  148. t.Equal(1, len(result.Removed))
  149. }
  150. // Running twice should result in no update
  151. result, err = syncJob.SyncGroup(ldap, users, conf.Sync.TeachersML)
  152. t.Nil(err)
  153. if !t.Failed() {
  154. t.Equal(0, len(result.Added))
  155. t.Equal(0, len(result.Updated))
  156. t.Equal(0, len(result.Removed))
  157. }
  158. administratives, err := karmen.GetAdministratives()
  159. t.Nil(err)
  160. users = make([]orm.User, 0)
  161. for _, administrative := range administratives {
  162. users = append(users, administrative)
  163. }
  164. result, err = syncJob.SyncGroup(ldap, users, conf.Sync.AdministrativesGroup)
  165. t.Nil(err)
  166. if !t.Failed() {
  167. t.Equal(2, len(result.Added))
  168. t.Equal(0, len(result.Updated))
  169. t.Equal(0, len(result.Removed))
  170. }
  171. departments, err := karmen.GetDepartments()
  172. t.Nil(err)
  173. if !t.Failed() {
  174. results := make(map[string][]int)
  175. results["cn=SOSTEGNO,ou=Mailing Lists"] = []int{2, 0, 1}
  176. results["cn=SOSTEGNO,ou=Dipartimenti"] = []int{2, 0, 0}
  177. results["cn=LINGUE STRANIERE,ou=Mailing Lists"] = []int{1, 0, 1}
  178. results["cn=LINGUE STRANIERE,ou=Dipartimenti"] = []int{1, 0, 0}
  179. for _, department := range departments {
  180. users := make([]orm.User, 0)
  181. for _, teacher := range department.Teachers {
  182. users = append(users, teacher)
  183. }
  184. group := fmt.Sprintf("cn=%s,ou=Mailing Lists", department.Name)
  185. result, err := syncJob.SyncGroup(ldap, users, group)
  186. t.Nil(err)
  187. if !t.Failed() {
  188. t.Equal(results[group][0], len(result.Added))
  189. t.Equal(results[group][1], len(result.Updated))
  190. t.Equal(results[group][2], len(result.Removed))
  191. }
  192. group = fmt.Sprintf("cn=%s,ou=Dipartimenti", department.Name)
  193. result, err = syncJob.SyncGroup(ldap, users, group)
  194. t.Nil(err)
  195. if !t.Failed() {
  196. t.Equal(results[group][0], len(result.Added))
  197. t.Equal(results[group][1], len(result.Updated))
  198. t.Equal(results[group][2], len(result.Removed))
  199. }
  200. }
  201. }
  202. }