UpdateRolesPanel.utils.test.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. import { describe, expect, test } from 'vitest'
  2. import { deriveRoleChangeActions } from './UpdateRolesPanel.utils'
  3. // [Joshen] This is specifically testing the project scope changes
  4. describe('UpdateRolesPanel.utils.ts:deriveRoleChangeActions', () => {
  5. test('Should update from org scope to project scope correctly', () => {
  6. const existingRoles = [
  7. {
  8. id: 3,
  9. name: 'Developer',
  10. description: null,
  11. projects: [],
  12. base_role_id: 6,
  13. },
  14. ]
  15. const changesToRoles = {
  16. removed: [],
  17. added: [
  18. { ref: 'ref_1', roleId: 3 },
  19. { ref: 'ref_2', roleId: 3 },
  20. { ref: 'ref_3', roleId: 3 },
  21. ],
  22. updated: [],
  23. }
  24. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  25. expect(toRemove).toStrictEqual([3])
  26. expect(toAssign).toStrictEqual([{ roleId: 3, refs: ['ref_1', 'ref_2', 'ref_3'] }])
  27. expect(toUpdate).toStrictEqual([])
  28. })
  29. test('Should update role for a single project (Project 1, Developer to Admin)', () => {
  30. const existingRoles = [
  31. {
  32. id: 29,
  33. name: 'Developer_qggwcbikivagivlidfhw',
  34. description: '',
  35. projects: [{ ref: 'ref_1', name: 'Project 1' }],
  36. base_role_id: 3,
  37. },
  38. ]
  39. const changesToRoles = {
  40. removed: [],
  41. added: [],
  42. updated: [
  43. {
  44. ref: 'ref_1',
  45. originalRole: 29,
  46. originalBaseRole: 3,
  47. updatedRole: 1,
  48. },
  49. ],
  50. }
  51. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  52. expect(toRemove).toStrictEqual([29])
  53. expect(toAssign).toStrictEqual([{ roleId: 1, refs: ['ref_1'] }])
  54. expect(toUpdate).toStrictEqual([])
  55. })
  56. test('Should remove role if role changes completely involve either removing role or updating role to another', () => {
  57. // Developer of projects 1, 2, 3
  58. // Remove developer role for projects 1, 2
  59. // Update developer to admin for project 3
  60. const existingRoles = [
  61. {
  62. id: 29,
  63. name: 'Developer_qggwcbikivagivlidfhw',
  64. description: '',
  65. base_role_id: 3,
  66. projects: [
  67. { ref: 'ref_1', name: 'Project 1' },
  68. { ref: 'ref_2', name: 'Project 2' },
  69. { ref: 'ref_3', name: 'Project 3' },
  70. ],
  71. },
  72. ]
  73. const changesToRoles = {
  74. removed: [
  75. {
  76. ref: 'ref_1',
  77. roleId: 29,
  78. baseRoleId: 3,
  79. },
  80. {
  81. ref: 'ref_2',
  82. roleId: 29,
  83. baseRoleId: 3,
  84. },
  85. ],
  86. added: [],
  87. updated: [
  88. {
  89. ref: 'ref_3',
  90. originalRole: 29,
  91. originalBaseRole: 3,
  92. updatedRole: 1,
  93. },
  94. ],
  95. }
  96. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  97. expect(toRemove).toStrictEqual([29])
  98. expect(toAssign).toStrictEqual([{ roleId: 1, refs: ['ref_3'] }])
  99. expect(toUpdate).toStrictEqual([])
  100. })
  101. test('Should not remove role if role changes partially involve either removing role or updating role to another', () => {
  102. const existingRoles = [
  103. {
  104. id: 29,
  105. name: 'Developer_qggwcbikivagivlidfhw',
  106. description: '',
  107. base_role_id: 3,
  108. projects: [
  109. { ref: 'ref_1', name: 'Project 1' },
  110. { ref: 'ref_2', name: 'Project 2' },
  111. { ref: 'ref_3', name: 'Project 3' },
  112. ],
  113. },
  114. ]
  115. const changesToRoles = {
  116. removed: [
  117. {
  118. ref: 'ref_1',
  119. roleId: 29,
  120. baseRoleId: 3,
  121. },
  122. ],
  123. added: [],
  124. updated: [
  125. {
  126. ref: 'ref_3',
  127. originalRole: 29,
  128. originalBaseRole: 3,
  129. updatedRole: 1,
  130. },
  131. ],
  132. }
  133. const { toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  134. expect(toRemove).toStrictEqual([])
  135. expect(toUpdate).toStrictEqual([{ roleId: 29, refs: ['ref_2'] }])
  136. })
  137. test('Should update role if newly added role(s) has the same base_role_id, and if removed role has same base_role_id', () => {
  138. const existingRoles = [
  139. {
  140. id: 29,
  141. name: 'Developer_qggwcbikivagivlidfhw',
  142. description: '',
  143. base_role_id: 3,
  144. projects: [
  145. { ref: 'ref_1', name: 'Project 1' },
  146. { ref: 'ref_2', name: 'Project 2' },
  147. { ref: 'ref_3', name: 'Project 3' },
  148. ],
  149. },
  150. ]
  151. const changesToRoles = {
  152. removed: [
  153. {
  154. ref: 'ref_1',
  155. roleId: 29,
  156. baseRoleId: 3,
  157. },
  158. ],
  159. added: [
  160. { ref: 'ref_4', roleId: 3 },
  161. { ref: 'ref_5', roleId: 3 },
  162. ],
  163. updated: [],
  164. }
  165. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  166. expect(toUpdate).toStrictEqual([{ roleId: 29, refs: ['ref_2', 'ref_3', 'ref_4', 'ref_5'] }])
  167. expect(toAssign).toStrictEqual([])
  168. expect(toRemove).toStrictEqual([])
  169. })
  170. test('Should assign new role if newly added role(s) has no base_role_id as any existing role', () => {
  171. const existingRoles = [
  172. {
  173. id: 29,
  174. name: 'Developer_qggwcbikivagivlidfhw',
  175. description: '',
  176. base_role_id: 3,
  177. projects: [
  178. { ref: 'ref_1', name: 'Project 1' },
  179. { ref: 'ref_2', name: 'Project 2' },
  180. { ref: 'ref_3', name: 'Project 3' },
  181. ],
  182. },
  183. ]
  184. const changesToRoles = {
  185. removed: [],
  186. added: [
  187. { ref: 'ref_4', roleId: 1 },
  188. { ref: 'ref_5', roleId: 1 },
  189. ],
  190. updated: [],
  191. }
  192. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  193. expect(toAssign).toStrictEqual([{ roleId: 1, refs: ['ref_4', 'ref_5'] }])
  194. expect(toUpdate).toStrictEqual([])
  195. expect(toRemove).toStrictEqual([])
  196. })
  197. test('Should assign project read only role from org developer role correctly', () => {
  198. const existingRoles = [
  199. {
  200. id: 3,
  201. name: 'Developer',
  202. description: null,
  203. base_role_id: 6,
  204. projects: [],
  205. },
  206. ]
  207. const changesToRoles = {
  208. removed: [{ ref: undefined, roleId: 3 }],
  209. added: [{ ref: 'ref_1', roleId: 6 }],
  210. updated: [],
  211. }
  212. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  213. expect(toAssign).toStrictEqual([{ roleId: 6, refs: ['ref_1'] }])
  214. expect(toUpdate).toStrictEqual([])
  215. expect(toRemove).toStrictEqual([3])
  216. })
  217. test('Myriad of updates to stress test function logic (I)', () => {
  218. // Given 6 projects 1, 2, 3, 4, 5, 6
  219. // Existing has developer role for 1, 2, 3, admin role for 4, owner role for 5
  220. const existingRoles = [
  221. {
  222. id: 30,
  223. name: 'Developer_qggwcbikivagivlidfhw',
  224. description: '',
  225. base_role_id: 3, // Developer
  226. projects: [
  227. { ref: 'ref_1', name: 'Project 1' },
  228. { ref: 'ref_2', name: 'Project 2' },
  229. { ref: 'ref_3', name: 'Project 3' },
  230. ],
  231. },
  232. {
  233. id: 31,
  234. name: 'Administrator_qggwcbikivagivlidfhw',
  235. description: '',
  236. base_role_id: 1, // Admin,
  237. projects: [{ ref: 'ref_4', name: 'Project 4' }],
  238. },
  239. {
  240. id: 32,
  241. name: 'Owner_qggwcbikivagivlidfhw',
  242. description: '',
  243. base_role_id: 5, // Owner,
  244. projects: [{ ref: 'ref_5', name: 'Project 5' }],
  245. },
  246. ]
  247. // Removing developer for 1
  248. // Updating developer -> admin for 2
  249. // Updating developer -> owner for 3
  250. // Updating administrator -> owner for 4
  251. // Adding administrator for 6
  252. const changesToRoles = {
  253. removed: [
  254. {
  255. ref: 'ref_1',
  256. roleId: 30,
  257. baseRoleId: 3,
  258. },
  259. ],
  260. added: [{ ref: 'ref_6', roleId: 1 }],
  261. updated: [
  262. {
  263. ref: 'ref_2',
  264. originalRole: 30,
  265. originalBaseRole: 3,
  266. updatedRole: 1,
  267. },
  268. {
  269. ref: 'ref_3',
  270. originalRole: 30,
  271. originalBaseRole: 3,
  272. updatedRole: 5,
  273. },
  274. {
  275. ref: 'ref_4',
  276. originalRole: 31,
  277. originalBaseRole: 1,
  278. updatedRole: 5,
  279. },
  280. ],
  281. }
  282. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  283. expect(toAssign).toStrictEqual([])
  284. expect(toUpdate).toStrictEqual([
  285. { roleId: 31, refs: ['ref_2', 'ref_6'] },
  286. { roleId: 32, refs: ['ref_3', 'ref_4', 'ref_5'] },
  287. ])
  288. expect(toRemove).toStrictEqual([30])
  289. })
  290. test('Myriad of updates to stress test function logic (II)', () => {
  291. // Given 5 projects 1, 2, 3, 4, 5
  292. // Existing has developer role for 1, admin role for 2
  293. const existingRoles = [
  294. {
  295. id: 30,
  296. name: 'Developer_qggwcbikivagivlidfhw',
  297. description: '',
  298. base_role_id: 3, // Developer
  299. projects: [{ ref: 'ref_1', name: 'Project 1' }],
  300. },
  301. {
  302. id: 31,
  303. name: 'Administrator_qggwcbikivagivlidfhw',
  304. description: '',
  305. base_role_id: 1, // Admin,
  306. projects: [{ ref: 'ref_2', name: 'Project 2' }],
  307. },
  308. ]
  309. // Adding developer for 4
  310. // Updating developer -> admin for 1
  311. // Updating admin -> developer for 2
  312. // Adding owner for 5
  313. const changesToRoles = {
  314. removed: [],
  315. added: [
  316. { ref: 'ref_4', roleId: 3 },
  317. { ref: 'ref_5', roleId: 5 },
  318. ],
  319. updated: [
  320. {
  321. ref: 'ref_1',
  322. originalRole: 30,
  323. originalBaseRole: 3,
  324. updatedRole: 1,
  325. },
  326. {
  327. ref: 'ref_2',
  328. originalRole: 31,
  329. originalBaseRole: 1,
  330. updatedRole: 3,
  331. },
  332. ],
  333. }
  334. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  335. expect(toAssign).toStrictEqual([{ roleId: 5, refs: ['ref_5'] }])
  336. expect(toUpdate).toStrictEqual([
  337. { roleId: 30, refs: ['ref_2', 'ref_4'] },
  338. { roleId: 31, refs: ['ref_1'] },
  339. ])
  340. expect(toRemove).toStrictEqual([])
  341. })
  342. test('Myriad of updates to stress test function logic (III)', () => {
  343. // Given 10 projects 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  344. // Existing has developer role for 1, 2, 3, admin role for 4, 5, 6, owner for 7
  345. const existingRoles = [
  346. {
  347. id: 30,
  348. name: 'Developer_qggwcbikivagivlidfhw',
  349. description: '',
  350. base_role_id: 3, // Developer
  351. projects: [
  352. { ref: 'ref_1', name: 'Project 1' },
  353. { ref: 'ref_2', name: 'Project 2' },
  354. { ref: 'ref_3', name: 'Project 3' },
  355. ],
  356. },
  357. {
  358. id: 31,
  359. name: 'Administrator_qggwcbikivagivlidfhw',
  360. description: '',
  361. base_role_id: 1, // Admin,
  362. projects: [
  363. { ref: 'ref_4', name: 'Project 4' },
  364. { ref: 'ref_5', name: 'Project 5' },
  365. { ref: 'ref_6', name: 'Project 6' },
  366. ],
  367. },
  368. {
  369. id: 32,
  370. name: 'Owner_qggwcbikivagivlidfhw',
  371. description: '',
  372. base_role_id: 5, // Owner
  373. projects: [{ ref: 'ref_7', name: 'Project 7' }],
  374. },
  375. ]
  376. // Remove access from projects 2, 7
  377. // Update developer -> owner for project 3
  378. // Update admin -> owner for project 5
  379. // Add admin for project 8
  380. // Add developer for project 9 and 10
  381. const changesToRoles = {
  382. removed: [
  383. {
  384. ref: 'ref_2',
  385. roleId: 30,
  386. baseRoleId: 3,
  387. },
  388. {
  389. ref: 'ref_7',
  390. roleId: 32,
  391. baseRoleId: 5,
  392. },
  393. ],
  394. added: [
  395. { ref: 'ref_8', roleId: 1 },
  396. { ref: 'ref_9', roleId: 3 },
  397. { ref: 'ref_10', roleId: 3 },
  398. ],
  399. updated: [
  400. {
  401. ref: 'ref_3',
  402. originalRole: 30,
  403. originalBaseRole: 3,
  404. updatedRole: 5,
  405. },
  406. {
  407. ref: 'ref_5',
  408. originalRole: 31,
  409. originalBaseRole: 1,
  410. updatedRole: 5,
  411. },
  412. ],
  413. }
  414. const { toAssign, toRemove, toUpdate } = deriveRoleChangeActions(existingRoles, changesToRoles)
  415. expect(toAssign).toStrictEqual([])
  416. expect(toRemove).toStrictEqual([])
  417. expect(toUpdate).toStrictEqual([
  418. { roleId: 30, refs: ['ref_1', 'ref_10', 'ref_9'] },
  419. { roleId: 31, refs: ['ref_4', 'ref_6', 'ref_8'] },
  420. { roleId: 32, refs: ['ref_3', 'ref_5'] },
  421. ])
  422. })
  423. })