File size: 2,827 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import test from "node:test";
import assert from "node:assert/strict";
import {
  queryBlock,
  MAX_GREP_MATCHES,
} from "../../../open-sse/services/compression/engines/ccr/ccrQuery.ts";

const block = ["l1 ok", "l2 ERROR foo", "l3 ok", "l4 ERROR bar", "l5 ok"].join("\n");

test("full / ausente → texto inteiro (backward-compat)", () => {
  assert.deepEqual(queryBlock(block, {}), { content: block });
  assert.deepEqual(queryBlock(block, { mode: "full" }), { content: block });
});

test("head:n e tail:n", () => {
  assert.deepEqual(queryBlock(block, { mode: "head", n: 2 }), { content: "l1 ok\nl2 ERROR foo" });
  assert.deepEqual(queryBlock(block, { mode: "tail", n: 2 }), { content: "l4 ERROR bar\nl5 ok" });
  assert.deepEqual(queryBlock(block, { mode: "head", n: 99 }), { content: block });
});

test("lines:start-end 1-indexed inclusive, clamp", () => {
  assert.deepEqual(queryBlock(block, { mode: "lines", start: 2, end: 3 }), {
    content: "l2 ERROR foo\nl3 ok",
  });
  assert.deepEqual(queryBlock(block, { mode: "lines", start: 4, end: 99 }), {
    content: "l4 ERROR bar\nl5 ok",
  });
  assert.ok("error" in queryBlock(block, { mode: "lines", start: 3, end: 1 }));
});

test("grep casa linhas; unique deduplica", () => {
  const r = queryBlock(block, { mode: "grep", pattern: "ERROR" });
  assert.deepEqual(r, { content: "l2 ERROR foo\nl4 ERROR bar" });
  const dup = ["x ERR", "x ERR", "y ERR"].join("\n");
  const u = queryBlock(dup, { mode: "grep", pattern: "ERR", unique: true });
  assert.deepEqual(u, { content: "x ERR\ny ERR" });
});

test("grep ReDoS rejeitado por safe-regex", () => {
  const r = queryBlock(block, { mode: "grep", pattern: "(a+)+$" });
  assert.ok("error" in r);
  assert.match((r as { error: string }).error, /backtrack|unsafe|reject/i);
});

test("grep regex inválido → erro; pattern grande → erro", () => {
  assert.ok("error" in queryBlock(block, { mode: "grep", pattern: "[" }));
  assert.ok("error" in queryBlock(block, { mode: "grep", pattern: "a".repeat(600) }));
});

test("grep cap de matches", () => {
  const big = Array.from({ length: MAX_GREP_MATCHES + 50 }, (_, i) => `row ${i} HIT`).join("\n");
  const r = queryBlock(big, { mode: "grep", pattern: "HIT" }) as { content: string };
  const lines = r.content.split("\n").filter((l) => l.includes("HIT"));
  assert.ok(lines.length <= MAX_GREP_MATCHES);
  assert.match(r.content, /truncat/i);
});

test("stats → JSON lines/chars/bytes", () => {
  const r = queryBlock(block, { mode: "stats" }) as { content: string };
  const s = JSON.parse(r.content);
  assert.equal(s.lines, 5);
  assert.equal(s.chars, block.length);
  assert.equal(s.bytes, Buffer.byteLength(block, "utf8"));
});

test("queryBlock nunca lança (fail-safe)", () => {
  assert.doesNotThrow(() => queryBlock(block, { mode: "head", n: -5 }));
});