JitDbAccess.utils.test.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import dayjs from 'dayjs'
  2. import { describe, expect, it } from 'vitest'
  3. import type { JitUserRuleDraft } from './JitDbAccess.types'
  4. import {
  5. computeStatusFromGrants,
  6. createEmptyGrant,
  7. getInvalidIpRangeRows,
  8. getJitMemberOptions,
  9. getRelativeDatetimeByMode,
  10. serializeDraftRolesForGrantMutation,
  11. } from './JitDbAccess.utils'
  12. import type { OrganizationMembersData } from '@/data/organizations/organization-members-query'
  13. describe('jitDbAccess.utils', () => {
  14. it('returns empty expiry string for never/custom-only fallback modes', () => {
  15. expect(getRelativeDatetimeByMode('never')).toBe('')
  16. expect(getRelativeDatetimeByMode('custom')).toBe('')
  17. })
  18. it('creates future datetimes for preset expiry modes', () => {
  19. const inOneHour = dayjs(getRelativeDatetimeByMode('1h'))
  20. expect(inOneHour.isValid()).toBe(true)
  21. expect(inOneHour.isAfter(dayjs())).toBe(true)
  22. })
  23. it('computes active and expired status counts including IP counts', () => {
  24. const activeGrant = {
  25. ...createEmptyGrant('role_active'),
  26. enabled: true,
  27. hasExpiry: true,
  28. expiry: dayjs().add(1, 'day').toISOString(),
  29. ipRanges: [{ value: '192.0.2.0/24' }],
  30. }
  31. const expiredGrant = {
  32. ...createEmptyGrant('role_expired'),
  33. enabled: true,
  34. hasExpiry: true,
  35. expiry: dayjs().subtract(1, 'day').toISOString(),
  36. ipRanges: [{ value: '203.0.113.0/24' }],
  37. }
  38. const perpetualGrant = {
  39. ...createEmptyGrant('role_never'),
  40. enabled: true,
  41. hasExpiry: false,
  42. expiryMode: 'never' as const,
  43. expiry: '',
  44. }
  45. expect(computeStatusFromGrants([activeGrant, expiredGrant, perpetualGrant])).toEqual({
  46. active: 2,
  47. expired: 1,
  48. activeIp: 1,
  49. expiredIp: 1,
  50. })
  51. })
  52. it('returns invalid CIDRs from repeated input rows', () => {
  53. expect(
  54. getInvalidIpRangeRows([
  55. { value: '192.0.2.0/24' },
  56. { value: 'not-a-cidr' },
  57. { value: '10.0.0.1/33' },
  58. { value: '2001:db8::/64' },
  59. { value: '2001:db8::/129' },
  60. ])
  61. ).toEqual(['not-a-cidr', '10.0.0.1/33', '2001:db8::/129'])
  62. })
  63. })
  64. describe('serializeDraftRolesForGrantMutation', () => {
  65. it('serializes role expiry and IP restrictions for grant mutation payload', () => {
  66. const expiry = '2026-06-01T12:00:00.000Z'
  67. const draft: JitUserRuleDraft = {
  68. memberId: 'user-1',
  69. grants: [
  70. {
  71. ...createEmptyGrant('postgres'),
  72. enabled: true,
  73. branchesOnly: true,
  74. hasExpiry: true,
  75. expiryMode: 'custom',
  76. expiry,
  77. ipRanges: [{ value: '192.0.2.0/24' }, { value: ' ' }, { value: '2001:db8::/64' }],
  78. },
  79. {
  80. ...createEmptyGrant('briven_read_only_user'),
  81. enabled: true,
  82. hasExpiry: false,
  83. expiryMode: 'never',
  84. expiry: '',
  85. },
  86. {
  87. ...createEmptyGrant('ignored_disabled'),
  88. enabled: false,
  89. },
  90. ],
  91. }
  92. expect(serializeDraftRolesForGrantMutation(draft)).toEqual([
  93. {
  94. role: 'postgres',
  95. branches_only: true,
  96. expires_at: dayjs(expiry).unix(),
  97. allowed_networks: {
  98. allowed_cidrs: [{ cidr: '192.0.2.0/24' }],
  99. allowed_cidrs_v6: [{ cidr: '2001:db8::/64' }],
  100. },
  101. },
  102. {
  103. role: 'briven_read_only_user',
  104. },
  105. ])
  106. })
  107. })
  108. describe('getJitMemberOptions', () => {
  109. it('excludes invited org members without gotrue IDs from selectable options', () => {
  110. const organizationMembers: OrganizationMembersData = [
  111. {
  112. gotrue_id: 'de305d54-75b4-431b-adb2-eb6b9e546014',
  113. primary_email: 'active@example.com',
  114. username: 'Active User',
  115. is_sso_user: false,
  116. mfa_enabled: false,
  117. metadata: {},
  118. role_ids: [],
  119. },
  120. {
  121. gotrue_id: '',
  122. invited_id: 123,
  123. invited_at: '2026-03-01T00:00:00.000Z',
  124. primary_email: 'expired-invite@example.com',
  125. username: 'e',
  126. is_sso_user: false,
  127. mfa_enabled: false,
  128. metadata: {},
  129. role_ids: [],
  130. },
  131. ]
  132. expect(getJitMemberOptions(organizationMembers, [])).toEqual([
  133. {
  134. id: 'de305d54-75b4-431b-adb2-eb6b9e546014',
  135. email: 'active@example.com',
  136. name: 'Active User',
  137. },
  138. ])
  139. })
  140. })