queryString.spec.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import utils from 'sentry/utils/queryString';
  2. describe('addQueryParamsToExistingUrl', function () {
  3. it('adds new query params to existing query params', function () {
  4. const url = 'https://example.com?value=3';
  5. const newParams = {
  6. id: 4,
  7. };
  8. expect(utils.addQueryParamsToExistingUrl(url, newParams)).toBe(
  9. 'https://example.com/?id=4&value=3'
  10. );
  11. });
  12. it('adds new query params without existing query params', function () {
  13. const url = 'https://example.com';
  14. const newParams = {
  15. id: 4,
  16. };
  17. expect(utils.addQueryParamsToExistingUrl(url, newParams)).toBe(
  18. 'https://example.com/?id=4'
  19. );
  20. });
  21. it('returns empty string no url is passed', function () {
  22. let url;
  23. const newParams = {
  24. id: 4,
  25. };
  26. expect(utils.addQueryParamsToExistingUrl(url, newParams)).toBe('');
  27. });
  28. });
  29. describe('appendTagCondition', function () {
  30. it('adds simple values', function () {
  31. const result = utils.appendTagCondition('error+text', 'color', 'red');
  32. expect(result).toEqual('error+text color:red');
  33. });
  34. it('handles array current value', function () {
  35. const result = utils.appendTagCondition(['', 'thing'], 'color', 'red');
  36. expect(result).toEqual('thing color:red');
  37. });
  38. it('handles empty string current value', function () {
  39. const result = utils.appendTagCondition('', 'color', 'red');
  40. expect(result).toEqual('color:red');
  41. });
  42. it('handles null current value', function () {
  43. const result = utils.appendTagCondition(null, 'color', 'red');
  44. expect(result).toEqual('color:red');
  45. });
  46. it('wraps values with spaces', function () {
  47. const result = utils.appendTagCondition(null, 'color', 'purple red');
  48. expect(result).toEqual('color:"purple red"');
  49. });
  50. it('wraps values with colon', function () {
  51. const result = utils.appendTagCondition(null, 'color', 'id:red');
  52. expect(result).toEqual('color:"id:red"');
  53. });
  54. it('handles user tag values', function () {
  55. let result = utils.appendTagCondition('', 'user', 'something');
  56. expect(result).toEqual('user:something');
  57. result = utils.appendTagCondition('', 'user', 'id:1');
  58. expect(result).toEqual('user:"id:1"');
  59. result = utils.appendTagCondition('', 'user', 'email:foo@example.com');
  60. expect(result).toEqual('user:"email:foo@example.com"');
  61. result = utils.appendTagCondition('', 'user', 'name:jill jones');
  62. expect(result).toEqual('user:"name:jill jones"');
  63. });
  64. });
  65. describe('appendExcludeTagValuesCondition', function () {
  66. it('excludes tag values', function () {
  67. const result = utils.appendExcludeTagValuesCondition(null, 'color', [
  68. 'red',
  69. 'blue',
  70. 'green',
  71. ]);
  72. expect(result).toEqual('!color:[red, blue, green]');
  73. });
  74. it('excludes tag values on an existing query', function () {
  75. const result = utils.appendExcludeTagValuesCondition('user.id:123', 'color', [
  76. 'red',
  77. 'blue',
  78. 'green',
  79. ]);
  80. expect(result).toEqual('user.id:123 !color:[red, blue, green]');
  81. });
  82. it('wraps double quotes when a space exists in the tag value', function () {
  83. const result = utils.appendExcludeTagValuesCondition(null, 'color', [
  84. 'red',
  85. 'ocean blue',
  86. '"green"',
  87. '"sky blue"',
  88. ]);
  89. expect(result).toEqual('!color:[red, "ocean blue", "\\"green\\"", "\\"sky blue\\""]');
  90. });
  91. });
  92. describe('decodeScalar()', function () {
  93. it('unwraps array values', function () {
  94. expect(utils.decodeScalar(['one', 'two'])).toEqual('one');
  95. });
  96. it('handles strings', function () {
  97. expect(utils.decodeScalar('one')).toEqual('one');
  98. });
  99. it('handles falsey values', function () {
  100. expect(utils.decodeScalar(undefined)).toBeUndefined();
  101. // @ts-expect-error
  102. expect(utils.decodeScalar(false)).toBeUndefined();
  103. expect(utils.decodeScalar('')).toBeUndefined();
  104. });
  105. it('uses fallback values', function () {
  106. expect(utils.decodeScalar('value', 'default')).toEqual('value');
  107. expect(utils.decodeScalar('', 'default')).toEqual('default');
  108. expect(utils.decodeScalar(null, 'default')).toEqual('default');
  109. expect(utils.decodeScalar(undefined, 'default')).toEqual('default');
  110. expect(utils.decodeScalar([], 'default')).toEqual('default');
  111. });
  112. });
  113. describe('decodeList()', function () {
  114. it('wraps string values', function () {
  115. expect(utils.decodeList('one')).toEqual(['one']);
  116. });
  117. it('handles arrays', function () {
  118. expect(utils.decodeList(['one', 'two'])).toEqual(['one', 'two']);
  119. });
  120. it('handles falsey values', function () {
  121. expect(utils.decodeList(undefined)).toEqual([]);
  122. // @ts-expect-error
  123. expect(utils.decodeList(false)).toEqual([]);
  124. expect(utils.decodeList('')).toEqual([]);
  125. });
  126. });
  127. describe('decodeInteger()', function () {
  128. it('handles integer strings', function () {
  129. expect(utils.decodeInteger('1')).toEqual(1);
  130. expect(utils.decodeInteger('1.2')).toEqual(1);
  131. expect(utils.decodeInteger('1.9')).toEqual(1);
  132. expect(utils.decodeInteger('foo')).toEqual(undefined);
  133. expect(utils.decodeInteger('foo', 2020)).toEqual(2020);
  134. });
  135. it('handles arrays', function () {
  136. expect(utils.decodeInteger(['1', 'foo'])).toEqual(1);
  137. expect(utils.decodeInteger(['1.2', 'foo'])).toEqual(1);
  138. expect(utils.decodeInteger(['1.9', 'foo'])).toEqual(1);
  139. expect(utils.decodeInteger(['foo', '1'])).toEqual(undefined);
  140. expect(utils.decodeInteger(['foo'], 2020)).toEqual(2020);
  141. });
  142. it('handles falsey values', function () {
  143. expect(utils.decodeInteger(undefined, 2020)).toEqual(2020);
  144. // @ts-expect-error
  145. expect(utils.decodeInteger(false, 2020)).toEqual(2020);
  146. expect(utils.decodeInteger('', 2020)).toEqual(2020);
  147. });
  148. });
  149. describe('decodeSorts', () => {
  150. it('handles simple strings and lists', () => {
  151. expect(utils.decodeSorts('startedAt')).toEqual([{kind: 'asc', field: 'startedAt'}]);
  152. expect(utils.decodeSorts(['startedAt', 'finishedAt'])).toEqual([
  153. {kind: 'asc', field: 'startedAt'},
  154. {kind: 'asc', field: 'finishedAt'},
  155. ]);
  156. expect(utils.decodeSorts('-startedAt')).toEqual([{kind: 'desc', field: 'startedAt'}]);
  157. expect(utils.decodeSorts(['-startedAt', '-finishedAt'])).toEqual([
  158. {kind: 'desc', field: 'startedAt'},
  159. {kind: 'desc', field: 'finishedAt'},
  160. ]);
  161. });
  162. it('handles falsey values', () => {
  163. expect(utils.decodeSorts(null)).toEqual([]);
  164. expect(utils.decodeSorts(undefined)).toEqual([]);
  165. expect(utils.decodeSorts('')).toEqual([]);
  166. expect(utils.decodeSorts([''])).toEqual([]);
  167. });
  168. it('fallsback to a default value', () => {
  169. expect(utils.decodeSorts(null, '-startedAt')).toEqual([
  170. {kind: 'desc', field: 'startedAt'},
  171. ]);
  172. expect(utils.decodeSorts(undefined, '-startedAt')).toEqual([
  173. {kind: 'desc', field: 'startedAt'},
  174. ]);
  175. expect(utils.decodeSorts('', '-startedAt')).toEqual([
  176. {kind: 'desc', field: 'startedAt'},
  177. ]);
  178. expect(utils.decodeSorts([''], '-startedAt')).toEqual([
  179. {kind: 'desc', field: 'startedAt'},
  180. ]);
  181. });
  182. });