traceSearchEvaluator.spec.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {waitFor} from 'sentry-test/reactTestingLibrary';
  2. import {
  3. type TraceTree,
  4. TraceTreeNode,
  5. } from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  6. import {searchInTraceTreeTokens} from 'sentry/views/performance/newTraceDetails/traceSearch/traceSearchEvaluator';
  7. import {parseTraceSearch} from 'sentry/views/performance/newTraceDetails/traceSearch/traceTokenConverter';
  8. function makeTransaction(
  9. overrides: Partial<TraceTree.Transaction> = {}
  10. ): TraceTree.Transaction {
  11. return {
  12. children: [],
  13. start_timestamp: 0,
  14. timestamp: 1,
  15. transaction: 'transaction',
  16. 'transaction.op': '',
  17. 'transaction.status': '',
  18. performance_issues: [],
  19. errors: [],
  20. ...overrides,
  21. } as TraceTree.Transaction;
  22. }
  23. const makeTree = (list: TraceTree.NodeValue[]): TraceTree => {
  24. return {
  25. list: list.map(
  26. n => new TraceTreeNode(null, n, {project_slug: 'project', event_id: ''})
  27. ),
  28. } as unknown as TraceTree;
  29. };
  30. const search = (query: string, list: TraceTree.NodeValue[], cb: any) => {
  31. searchInTraceTreeTokens(
  32. makeTree(list),
  33. // @ts-expect-error test failed parse
  34. parseTraceSearch(query),
  35. null,
  36. cb
  37. );
  38. };
  39. describe('TraceSearchEvaluator', () => {
  40. it('empty string', async () => {
  41. const list = [
  42. makeTransaction({'transaction.op': 'operation'}),
  43. makeTransaction({'transaction.op': 'other'}),
  44. ];
  45. const cb = jest.fn();
  46. search('', list, cb);
  47. await waitFor(() => {
  48. expect(cb).toHaveBeenCalled();
  49. });
  50. expect(cb.mock.calls[0][0][0]).toEqual([]);
  51. expect(cb.mock.calls[0][0][1].size).toBe(0);
  52. expect(cb.mock.calls[0][0][2]).toBe(null);
  53. });
  54. it.each([
  55. [''],
  56. ['invalid_query'],
  57. ['invalid_query:'],
  58. ['OR'],
  59. ['AND'],
  60. ['('],
  61. [')'],
  62. ['()'],
  63. ['(invalid_query)'],
  64. ])('invalid grammar %s', async query => {
  65. const list = [
  66. makeTransaction({'transaction.op': 'operation'}),
  67. makeTransaction({'transaction.op': 'other'}),
  68. ];
  69. const cb = jest.fn();
  70. search(query, list, cb);
  71. await waitFor(() => {
  72. expect(cb).toHaveBeenCalled();
  73. });
  74. expect(cb.mock.calls[0][0][0]).toEqual([]);
  75. expect(cb.mock.calls[0][0][1].size).toBe(0);
  76. expect(cb.mock.calls[0][0][2]).toBe(null);
  77. });
  78. });