language_utils.test.ts 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { expandRecordingRules, parseSelector } from '../language_utils';
  2. describe('parseSelector()', () => {
  3. let parsed;
  4. it('returns a clean selector from an empty selector', () => {
  5. parsed = parseSelector('{}', 1);
  6. expect(parsed.selector).toBe('{}');
  7. expect(parsed.labelKeys).toEqual([]);
  8. });
  9. it('throws if selector is broken', () => {
  10. expect(() => parseSelector('{foo')).toThrow();
  11. });
  12. it('returns the selector sorted by label key', () => {
  13. parsed = parseSelector('{foo="bar"}');
  14. expect(parsed.selector).toBe('{foo="bar"}');
  15. expect(parsed.labelKeys).toEqual(['foo']);
  16. parsed = parseSelector('{foo="bar",baz="xx"}');
  17. expect(parsed.selector).toBe('{baz="xx",foo="bar"}');
  18. });
  19. it('returns a clean selector from an incomplete one', () => {
  20. parsed = parseSelector('{foo}');
  21. expect(parsed.selector).toBe('{}');
  22. parsed = parseSelector('{foo="bar",baz}');
  23. expect(parsed.selector).toBe('{foo="bar"}');
  24. parsed = parseSelector('{foo="bar",baz="}');
  25. expect(parsed.selector).toBe('{foo="bar"}');
  26. });
  27. it('throws if not inside a selector', () => {
  28. expect(() => parseSelector('foo{}', 0)).toThrow();
  29. expect(() => parseSelector('foo{} + bar{}', 5)).toThrow();
  30. });
  31. it('returns the selector nearest to the cursor offset', () => {
  32. expect(() => parseSelector('{foo="bar"} + {foo="bar"}', 0)).toThrow();
  33. parsed = parseSelector('{foo="bar"} + {foo="bar"}', 1);
  34. expect(parsed.selector).toBe('{foo="bar"}');
  35. parsed = parseSelector('{foo="bar"} + {baz="xx"}', 1);
  36. expect(parsed.selector).toBe('{foo="bar"}');
  37. parsed = parseSelector('{baz="xx"} + {foo="bar"}', 16);
  38. expect(parsed.selector).toBe('{foo="bar"}');
  39. });
  40. it('returns a selector with metric if metric is given', () => {
  41. parsed = parseSelector('bar{foo}', 4);
  42. expect(parsed.selector).toBe('{__name__="bar"}');
  43. parsed = parseSelector('baz{foo="bar"}', 12);
  44. expect(parsed.selector).toBe('{__name__="baz",foo="bar"}');
  45. parsed = parseSelector('bar:metric:1m{}', 14);
  46. expect(parsed.selector).toBe('{__name__="bar:metric:1m"}');
  47. });
  48. });
  49. describe('expandRecordingRules()', () => {
  50. it('returns query w/o recording rules as is', () => {
  51. expect(expandRecordingRules('metric', {})).toBe('metric');
  52. expect(expandRecordingRules('metric + metric', {})).toBe('metric + metric');
  53. expect(expandRecordingRules('metric{}', {})).toBe('metric{}');
  54. });
  55. it('does not modify recording rules name in label values', () => {
  56. expect(expandRecordingRules('{__name__="metric"} + bar', { metric: 'foo', bar: 'super' })).toBe(
  57. '{__name__="metric"} + super'
  58. );
  59. });
  60. it('returns query with expanded recording rules', () => {
  61. expect(expandRecordingRules('metric', { metric: 'foo' })).toBe('foo');
  62. expect(expandRecordingRules('metric + metric', { metric: 'foo' })).toBe('foo + foo');
  63. expect(expandRecordingRules('metric{}', { metric: 'foo' })).toBe('foo{}');
  64. expect(expandRecordingRules('metric[]', { metric: 'foo' })).toBe('foo[]');
  65. expect(expandRecordingRules('metric + foo', { metric: 'foo', foo: 'bar' })).toBe('foo + bar');
  66. });
  67. });