project_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package gorm_test
  2. import (
  3. "testing"
  4. "github.com/go-test/deep"
  5. "github.com/porter-dev/porter/internal/models"
  6. "gorm.io/gorm"
  7. orm "gorm.io/gorm"
  8. )
  9. func TestCreateProject(t *testing.T) {
  10. tester := &tester{
  11. dbFileName: "./porter_create_proj.db",
  12. }
  13. setupTestEnv(tester, t)
  14. defer cleanup(tester, t)
  15. proj := &models.Project{
  16. Name: "project-test",
  17. }
  18. proj, err := tester.repo.Project.CreateProject(proj)
  19. if err != nil {
  20. t.Fatalf("%v\n", err)
  21. }
  22. proj, err = tester.repo.Project.ReadProject(proj.Model.ID)
  23. if err != nil {
  24. t.Fatalf("%v\n", err)
  25. }
  26. // make sure id is 1 and name is "project-test"
  27. if proj.Model.ID != 1 {
  28. t.Errorf("incorrect project ID: expected %d, got %d\n", 1, proj.Model.ID)
  29. }
  30. if proj.Name != "project-test" {
  31. t.Errorf("incorrect project name: expected %s, got %s\n", "project-test", proj.Name)
  32. }
  33. }
  34. func TestCreateProjectRole(t *testing.T) {
  35. tester := &tester{
  36. dbFileName: "./porter_create_proj_role.db",
  37. }
  38. setupTestEnv(tester, t)
  39. initProject(tester, t)
  40. defer cleanup(tester, t)
  41. role := &models.Role{
  42. Kind: models.RoleAdmin,
  43. UserID: 0,
  44. ProjectID: tester.initProjects[0].Model.ID,
  45. }
  46. role, err := tester.repo.Project.CreateProjectRole(tester.initProjects[0], role)
  47. if err != nil {
  48. t.Fatalf("%v\n", err)
  49. }
  50. proj, err := tester.repo.Project.ReadProject(tester.initProjects[0].Model.ID)
  51. if err != nil {
  52. t.Fatalf("%v\n", err)
  53. }
  54. // make sure IDs are correct
  55. if proj.Model.ID != 1 {
  56. t.Errorf("incorrect project ID: expected %d, got %d\n", 1, proj.Model.ID)
  57. }
  58. if len(proj.Roles) != 1 {
  59. t.Fatalf("project roles incorrect length: expected %d, got %d\n", 1, len(proj.Roles))
  60. }
  61. if proj.Roles[0].Model.ID != 1 {
  62. t.Fatalf("incorrect role ID: expected %d, got %d\n", 1, proj.Roles[0].Model.ID)
  63. }
  64. // make sure data is correct
  65. expProj := &models.Project{
  66. Name: "project-test",
  67. Roles: []models.Role{
  68. models.Role{
  69. Kind: models.RoleAdmin,
  70. UserID: 0,
  71. ProjectID: 1,
  72. },
  73. },
  74. }
  75. copyProj := proj
  76. // reset fields for reflect.DeepEqual
  77. copyProj.Model = orm.Model{}
  78. copyProj.Roles[0].Model = orm.Model{}
  79. if diff := deep.Equal(copyProj, expProj); diff != nil {
  80. t.Errorf("incorrect project")
  81. t.Error(diff)
  82. }
  83. }
  84. func TestUpdateProjectRole(t *testing.T) {
  85. tester := &tester{
  86. dbFileName: "./porter_update_proj_role.db",
  87. }
  88. setupTestEnv(tester, t)
  89. initProject(tester, t)
  90. initUser(tester, t)
  91. initProjectRole(tester, t)
  92. defer cleanup(tester, t)
  93. role := &models.Role{
  94. Kind: models.RoleViewer,
  95. UserID: tester.initUsers[0].Model.ID,
  96. ProjectID: tester.initProjects[0].Model.ID,
  97. }
  98. role, err := tester.repo.Project.UpdateProjectRole(tester.initProjects[0].Model.ID, role)
  99. if err != nil {
  100. t.Fatalf("%v\n", err)
  101. }
  102. proj, err := tester.repo.Project.ReadProject(tester.initProjects[0].Model.ID)
  103. if err != nil {
  104. t.Fatalf("%v\n", err)
  105. }
  106. // make sure IDs are correct
  107. if proj.Model.ID != 1 {
  108. t.Errorf("incorrect project ID: expected %d, got %d\n", 1, proj.Model.ID)
  109. }
  110. if len(proj.Roles) != 1 {
  111. t.Fatalf("project roles incorrect length: expected %d, got %d\n", 1, len(proj.Roles))
  112. }
  113. if proj.Roles[0].Model.ID != 1 {
  114. t.Fatalf("incorrect role ID: expected %d, got %d\n", 1, proj.Roles[0].Model.ID)
  115. }
  116. // make sure data is correct
  117. expProj := &models.Project{
  118. Name: "project-test",
  119. Roles: []models.Role{
  120. {
  121. Kind: models.RoleViewer,
  122. UserID: 1,
  123. ProjectID: 1,
  124. },
  125. },
  126. }
  127. copyProj := proj
  128. // reset fields for reflect.DeepEqual
  129. copyProj.Model = orm.Model{}
  130. copyProj.Roles[0].Model = orm.Model{}
  131. if diff := deep.Equal(copyProj, expProj); diff != nil {
  132. t.Errorf("incorrect project")
  133. t.Error(diff)
  134. }
  135. }
  136. func TestListProjectsByUserID(t *testing.T) {
  137. tester := &tester{
  138. dbFileName: "./list_projects_user_id.db",
  139. }
  140. setupTestEnv(tester, t)
  141. initUser(tester, t)
  142. // create two projects, same name
  143. initProject(tester, t)
  144. initProjectRole(tester, t)
  145. initProject(tester, t)
  146. role := &models.Role{
  147. Kind: models.RoleAdmin,
  148. UserID: 1,
  149. }
  150. role, err := tester.repo.Project.CreateProjectRole(tester.initProjects[1], role)
  151. if err != nil {
  152. t.Fatalf("%v\n", err)
  153. }
  154. defer cleanup(tester, t)
  155. projects, err := tester.repo.Project.ListProjectsByUserID(tester.initUsers[0].Model.ID)
  156. if err != nil {
  157. t.Fatalf("%v\n", err)
  158. }
  159. if len(projects) != 2 {
  160. t.Fatalf("projects length was not 2\n")
  161. }
  162. for i, project := range projects {
  163. // make sure data is correct
  164. expProj := &models.Project{
  165. Name: "project-test",
  166. Roles: []models.Role{
  167. models.Role{
  168. Kind: models.RoleAdmin,
  169. UserID: tester.initUsers[0].Model.ID,
  170. ProjectID: uint(i + 1),
  171. },
  172. },
  173. }
  174. copyProj := project
  175. // reset fields for reflect.DeepEqual
  176. copyProj.Model = orm.Model{}
  177. copyProj.Roles[0].Model = orm.Model{}
  178. if diff := deep.Equal(copyProj, expProj); diff != nil {
  179. t.Errorf("incorrect project")
  180. t.Error(diff)
  181. }
  182. }
  183. }
  184. func TestDeleteProject(t *testing.T) {
  185. tester := &tester{
  186. dbFileName: "./porter_delete_proj.db",
  187. }
  188. setupTestEnv(tester, t)
  189. initProject(tester, t)
  190. defer cleanup(tester, t)
  191. proj, err := tester.repo.Project.DeleteProject(tester.initProjects[0])
  192. if err != nil {
  193. t.Fatalf("%v\n", err)
  194. }
  195. // attempt to read the project and ensure that the error is gorm.ErrRecordNotFound
  196. _, err = tester.repo.Project.ReadProject(proj.Model.ID)
  197. if err != gorm.ErrRecordNotFound {
  198. t.Fatalf("read should have returned record not found: returned %v\n", err)
  199. }
  200. }
  201. func TestDeleteProjectRole(t *testing.T) {
  202. tester := &tester{
  203. dbFileName: "./porter_delete_proj_role.db",
  204. }
  205. setupTestEnv(tester, t)
  206. initProject(tester, t)
  207. initUser(tester, t)
  208. initProjectRole(tester, t)
  209. defer cleanup(tester, t)
  210. _, err := tester.repo.Project.DeleteProjectRole(tester.initProjects[0].Model.ID, tester.initUsers[0].Model.ID)
  211. if err != nil {
  212. t.Fatalf("%v\n", err)
  213. }
  214. // attempt to read the project and ensure that the error is gorm.ErrRecordNotFound
  215. proj, err := tester.repo.Project.ReadProject(tester.initProjects[0].Model.ID)
  216. if err != nil {
  217. t.Fatalf("%v\n", err)
  218. }
  219. // make sure IDs are correct
  220. if proj.Model.ID != 1 {
  221. t.Errorf("incorrect project ID: expected %d, got %d\n", 1, proj.Model.ID)
  222. }
  223. if len(proj.Roles) != 0 {
  224. t.Fatalf("project roles incorrect length: expected %d, got %d\n", 0, len(proj.Roles))
  225. }
  226. // make sure data is correct
  227. expProj := &models.Project{
  228. Name: "project-test",
  229. Roles: []models.Role{},
  230. }
  231. copyProj := proj
  232. // reset fields for reflect.DeepEqual
  233. copyProj.Model = orm.Model{}
  234. if diff := deep.Equal(copyProj, expProj); diff != nil {
  235. t.Errorf("incorrect project")
  236. t.Error(diff)
  237. }
  238. }