|
8 | 8 | import type { |
9 | 9 | PromQLBinaryExpression, |
10 | 10 | PromQLFunction, |
| 11 | + PromQLLabel, |
11 | 12 | PromQLLiteral, |
| 13 | + PromQLParamLiteral, |
12 | 14 | PromQLParens, |
13 | 15 | PromQLSelector, |
14 | 16 | PromQLStringLiteral, |
@@ -234,6 +236,61 @@ describe('PromQL Parser', () => { |
234 | 236 | }); |
235 | 237 | }); |
236 | 238 |
|
| 239 | + describe('label parameter values', () => { |
| 240 | + it('parses a named label parameter (?job)', () => { |
| 241 | + const result = PromQLParser.parse('http_requests_total{job=?job}'); |
| 242 | + |
| 243 | + expect(result.errors).toHaveLength(0); |
| 244 | + |
| 245 | + const selector = result.root.expression as PromQLSelector; |
| 246 | + expect(selector.type).toBe('selector'); |
| 247 | + |
| 248 | + const label = selector.labelMap?.args[0] as PromQLLabel; |
| 249 | + expect(label.incomplete).toBe(false); |
| 250 | + |
| 251 | + const value = label.value as PromQLParamLiteral; |
| 252 | + expect(value.literalType).toBe('param'); |
| 253 | + expect(value.paramType).toBe('named'); |
| 254 | + expect(value.paramKind).toBe('?'); |
| 255 | + expect(value.value).toBe('job'); |
| 256 | + expect(value.text).toBe('?job'); |
| 257 | + }); |
| 258 | + |
| 259 | + it('parses a positional label parameter (?1)', () => { |
| 260 | + const result = PromQLParser.parse('http_requests_total{job=?1}'); |
| 261 | + |
| 262 | + expect(result.errors).toHaveLength(0); |
| 263 | + |
| 264 | + const selector = result.root.expression as PromQLSelector; |
| 265 | + const label = selector.labelMap?.args[0] as PromQLLabel; |
| 266 | + const value = label.value as PromQLParamLiteral; |
| 267 | + |
| 268 | + expect(value.literalType).toBe('param'); |
| 269 | + expect(value.paramType).toBe('positional'); |
| 270 | + expect(value.paramKind).toBe('?'); |
| 271 | + expect(value.value).toBe(1); |
| 272 | + expect(value.text).toBe('?1'); |
| 273 | + }); |
| 274 | + |
| 275 | + it('parses a regex matcher with a named parameter (?pattern)', () => { |
| 276 | + const result = PromQLParser.parse('http_requests_total{job=~?pattern}'); |
| 277 | + |
| 278 | + expect(result.errors).toHaveLength(0); |
| 279 | + |
| 280 | + const selector = result.root.expression as PromQLSelector; |
| 281 | + const label = selector.labelMap?.args[0] as PromQLLabel; |
| 282 | + |
| 283 | + expect(label.operator).toBe('=~'); |
| 284 | + |
| 285 | + const value = label.value as PromQLParamLiteral; |
| 286 | + expect(value.literalType).toBe('param'); |
| 287 | + expect(value.paramType).toBe('named'); |
| 288 | + expect(value.paramKind).toBe('?'); |
| 289 | + expect(value.value).toBe('pattern'); |
| 290 | + expect(value.text).toBe('?pattern'); |
| 291 | + }); |
| 292 | + }); |
| 293 | + |
237 | 294 | describe('error handling', () => { |
238 | 295 | it('returns errors for invalid syntax', () => { |
239 | 296 | const result = PromQLParser.parse('rate('); |
|
0 commit comments