project_test.go 7.3 KB

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