get-users-common.test.ts 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import { describe, expect, test } from 'vitest'
  2. import { prefixToUUID, stringRange } from '../../../src/sql/studio/auth/get-users-common'
  3. describe('prefixToUUID', () => {
  4. test('returns UUID template with no prefix', () => {
  5. const result = prefixToUUID('', false)
  6. expect(result).toBe('00000000-0000-0000-0000-000000000000')
  7. })
  8. test('returns UUID template with no prefix (max=true)', () => {
  9. const result = prefixToUUID('', true)
  10. expect(result).toBe('ffffffff-ffff-ffff-ffff-ffffffffffff')
  11. })
  12. test('returns UUID with short prefix', () => {
  13. const result = prefixToUUID('abc', false)
  14. expect(result).toBe('abc00000-0000-4000-8000-000000000000')
  15. })
  16. test('returns UUID with short prefix (max=true)', () => {
  17. const result = prefixToUUID('abc', true)
  18. expect(result).toBe('abcfffff-ffff-4fff-bfff-ffffffffffff')
  19. })
  20. test('returns UUID with prefix up to first hyphen', () => {
  21. const result = prefixToUUID('12345678', false)
  22. expect(result).toBe('12345678-0000-4000-8000-000000000000')
  23. })
  24. test('returns UUID with prefix up to first hyphen (max=true)', () => {
  25. const result = prefixToUUID('12345678', true)
  26. expect(result).toBe('12345678-ffff-4fff-bfff-ffffffffffff')
  27. })
  28. test('returns UUID with prefix including first hyphen', () => {
  29. const result = prefixToUUID('12345678-', false)
  30. expect(result).toBe('12345678-0000-4000-8000-000000000000')
  31. })
  32. test('returns UUID with prefix extending into second section', () => {
  33. const result = prefixToUUID('12345678-1234', false)
  34. expect(result).toBe('12345678-1234-4000-8000-000000000000')
  35. })
  36. test('returns UUID with prefix extending into third section (before position 15)', () => {
  37. const result = prefixToUUID('12345678-1234-', false)
  38. expect(result).toBe('12345678-1234-4000-8000-000000000000')
  39. })
  40. test('returns UUID with prefix at position 15 (includes version)', () => {
  41. const result = prefixToUUID('12345678-1234-5', false)
  42. expect(result).toBe('12345678-1234-5000-8000-000000000000')
  43. })
  44. test('returns UUID with prefix extending into fourth section (before position 20)', () => {
  45. const result = prefixToUUID('12345678-1234-5678-', false)
  46. expect(result).toBe('12345678-1234-5678-8000-000000000000')
  47. })
  48. test('returns UUID with prefix extending into fourth section (before position 20, max=true)', () => {
  49. const result = prefixToUUID('12345678-1234-5678-', true)
  50. expect(result).toBe('12345678-1234-5678-bfff-ffffffffffff')
  51. })
  52. test('returns UUID with prefix at position 20 (includes variant)', () => {
  53. const result = prefixToUUID('12345678-1234-5678-9', false)
  54. expect(result).toBe('12345678-1234-5678-9000-000000000000')
  55. })
  56. test('returns UUID with prefix at position 20 (includes variant, max=true)', () => {
  57. const result = prefixToUUID('12345678-1234-5678-9', true)
  58. expect(result).toBe('12345678-1234-5678-9fff-ffffffffffff')
  59. })
  60. test('returns UUID with long prefix', () => {
  61. const result = prefixToUUID('12345678-1234-5678-9abc-def', false)
  62. expect(result).toBe('12345678-1234-5678-9abc-def000000000')
  63. })
  64. test('returns UUID with long prefix (max=true)', () => {
  65. const result = prefixToUUID('12345678-1234-5678-9abc-def', true)
  66. expect(result).toBe('12345678-1234-5678-9abc-deffffffffff')
  67. })
  68. test('returns UUID with full length prefix', () => {
  69. const result = prefixToUUID('12345678-1234-5678-9abc-def123456789', false)
  70. expect(result).toBe('12345678-1234-5678-9abc-def123456789')
  71. })
  72. test('returns UUID with full length prefix (max=true)', () => {
  73. const result = prefixToUUID('12345678-1234-5678-9abc-def123456789', true)
  74. expect(result).toBe('12345678-1234-5678-9abc-def123456789')
  75. })
  76. test('returns UUID with prefix longer than template', () => {
  77. const result = prefixToUUID('12345678-1234-5678-9abc-def123456789extra', false)
  78. expect(result).toBe('12345678-1234-5678-9abc-def123456789')
  79. })
  80. test('maintains hyphen positions in UUID format', () => {
  81. const result = prefixToUUID('a', false)
  82. expect(result).toBe('a0000000-0000-4000-8000-000000000000')
  83. expect(result.match(/-/g)?.length).toBe(4)
  84. expect(result[8]).toBe('-')
  85. expect(result[13]).toBe('-')
  86. expect(result[18]).toBe('-')
  87. expect(result[23]).toBe('-')
  88. })
  89. test('sets version nibble to 4 when prefix is shorter than position 15', () => {
  90. const result = prefixToUUID('12345678-1234', false)
  91. expect(result[14]).toBe('4')
  92. })
  93. test('sets variant to 8 when prefix is shorter than position 20 and max=false', () => {
  94. const result = prefixToUUID('12345678-1234-5678', false)
  95. expect(result[19]).toBe('8')
  96. })
  97. test('sets variant to b when prefix is shorter than position 20 and max=true', () => {
  98. const result = prefixToUUID('12345678-1234-5678', true)
  99. expect(result[19]).toBe('b')
  100. })
  101. test('fills remaining positions with f when max=true', () => {
  102. const result = prefixToUUID('abc', true)
  103. expect(result).toBe('abcfffff-ffff-4fff-bfff-ffffffffffff')
  104. // Check that all '0' characters in the template are replaced with 'f'
  105. expect(result).not.toContain('0')
  106. // Check that hyphens are preserved
  107. expect(result[8]).toBe('-')
  108. expect(result[13]).toBe('-')
  109. expect(result[18]).toBe('-')
  110. expect(result[23]).toBe('-')
  111. })
  112. })
  113. describe('stringRange', () => {
  114. test('returns empty string and undefined for empty prefix', () => {
  115. const result = stringRange('')
  116. expect(result).toEqual(['', undefined])
  117. })
  118. test('returns range for single character', () => {
  119. const result = stringRange('a')
  120. expect(result).toEqual(['a', 'b'])
  121. })
  122. test('returns range for multiple characters', () => {
  123. const result = stringRange('abc')
  124. expect(result).toEqual(['abc', 'abd'])
  125. })
  126. test('returns range for string with spaces', () => {
  127. const result = stringRange('hello world')
  128. expect(result).toEqual(['hello world', 'hello worle'])
  129. })
  130. test('returns range for string ending with numbers', () => {
  131. const result = stringRange('test123')
  132. expect(result).toEqual(['test123', 'test124'])
  133. })
  134. test('returns range for string with uppercase letters', () => {
  135. const result = stringRange('ABC')
  136. expect(result).toEqual(['ABC', 'ABD'])
  137. })
  138. test('appends space for tilde character to avoid collation issues', () => {
  139. const result = stringRange('test~')
  140. expect(result).toEqual(['test~', 'test~ '])
  141. })
  142. test('appends space for characters beyond tilde in ASCII', () => {
  143. const result = stringRange('test\x7F') // DEL character
  144. expect(result).toEqual(['test\x7F', 'test\x7F '])
  145. })
  146. test('increments last character correctly for various ASCII characters', () => {
  147. expect(stringRange('a')).toEqual(['a', 'b'])
  148. expect(stringRange('z')).toEqual(['z', 'z~']) // Special case: appends '~' to avoid collation issues
  149. expect(stringRange('A')).toEqual(['A', 'B'])
  150. expect(stringRange('Z')).toEqual(['Z', '['])
  151. expect(stringRange('0')).toEqual(['0', '1'])
  152. expect(stringRange('9')).toEqual(['9', ':'])
  153. })
  154. test('handles special characters', () => {
  155. expect(stringRange('test!')).toEqual(['test!', 'test"'])
  156. expect(stringRange('test@')).toEqual(['test@', 'testA'])
  157. expect(stringRange('test#')).toEqual(['test#', 'test$'])
  158. })
  159. test('handles underscore', () => {
  160. const result = stringRange('test_')
  161. expect(result).toEqual(['test_', 'test`'])
  162. })
  163. test('handles hyphen', () => {
  164. const result = stringRange('test-')
  165. expect(result).toEqual(['test-', 'test.'])
  166. })
  167. test('handles space correctly', () => {
  168. const result = stringRange('test ')
  169. expect(result).toEqual(['test ', 'test!'])
  170. })
  171. test('appends tilde for strings ending with lowercase z', () => {
  172. expect(stringRange('xyz')).toEqual(['xyz', 'xyz~'])
  173. expect(stringRange('jazz')).toEqual(['jazz', 'jazz~'])
  174. })
  175. test('handles mixed case strings ending with uppercase Z', () => {
  176. expect(stringRange('testZ')).toEqual(['testZ', 'test['])
  177. })
  178. test('handles strings ending with tilde', () => {
  179. expect(stringRange('test~')).toEqual(['test~', 'test~ '])
  180. expect(stringRange('~~~')).toEqual(['~~~', '~~~ '])
  181. })
  182. })