whopper 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/browser/index.test.d.ts +2 -0
  2. package/dist/browser/index.test.d.ts.map +1 -0
  3. package/dist/browser/index.test.js +181 -0
  4. package/dist/browser/index.test.js.map +1 -0
  5. package/dist/browser/utils.test.d.ts +2 -0
  6. package/dist/browser/utils.test.d.ts.map +1 -0
  7. package/dist/browser/utils.test.js +33 -0
  8. package/dist/browser/utils.test.js.map +1 -0
  9. package/dist/cli.test.d.ts +2 -0
  10. package/dist/cli.test.d.ts.map +1 -0
  11. package/dist/cli.test.js +52 -0
  12. package/dist/cli.test.js.map +1 -0
  13. package/dist/commands/banner.test.d.ts +2 -0
  14. package/dist/commands/banner.test.d.ts.map +1 -0
  15. package/dist/commands/banner.test.js +24 -0
  16. package/dist/commands/banner.test.js.map +1 -0
  17. package/dist/commands/detect.test.d.ts +2 -0
  18. package/dist/commands/detect.test.d.ts.map +1 -0
  19. package/dist/commands/detect.test.js +194 -0
  20. package/dist/commands/detect.test.js.map +1 -0
  21. package/dist/commands/detect_utils.test.d.ts +2 -0
  22. package/dist/commands/detect_utils.test.d.ts.map +1 -0
  23. package/dist/commands/detect_utils.test.js +449 -0
  24. package/dist/commands/detect_utils.test.js.map +1 -0
  25. package/dist/commands/version.test.d.ts +2 -0
  26. package/dist/commands/version.test.d.ts.map +1 -0
  27. package/dist/commands/version.test.js +27 -0
  28. package/dist/commands/version.test.js.map +1 -0
  29. package/dist/e2e/cli.e2e.test.d.ts +2 -0
  30. package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
  31. package/dist/e2e/cli.e2e.test.js +85 -0
  32. package/dist/e2e/cli.e2e.test.js.map +1 -0
  33. package/dist/logger/index.test.d.ts +2 -0
  34. package/dist/logger/index.test.d.ts.map +1 -0
  35. package/dist/logger/index.test.js +106 -0
  36. package/dist/logger/index.test.js.map +1 -0
  37. package/dist/logger/utils.test.d.ts +2 -0
  38. package/dist/logger/utils.test.d.ts.map +1 -0
  39. package/dist/logger/utils.test.js +20 -0
  40. package/dist/logger/utils.test.js.map +1 -0
  41. package/dist/signatures/signatures.test.d.ts +2 -0
  42. package/dist/signatures/signatures.test.d.ts.map +1 -0
  43. package/dist/signatures/signatures.test.js +128 -0
  44. package/dist/signatures/signatures.test.js.map +1 -0
  45. package/dist/signatures/utils.test.d.ts +2 -0
  46. package/dist/signatures/utils.test.d.ts.map +1 -0
  47. package/dist/signatures/utils.test.js +85 -0
  48. package/dist/signatures/utils.test.js.map +1 -0
  49. package/package.json +1 -1
@@ -0,0 +1,449 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { colorizeConfidence, makeDetectCommandOutput, printDetectCommandOutputAsText, printDetectCommandOutputAsJSON, } from "./detect_utils.js";
3
+ describe("colorizeConfidence", () => {
4
+ it("should return green for high confidence", () => {
5
+ const result = colorizeConfidence("high");
6
+ expect(result).toContain("high");
7
+ });
8
+ it("should return yellow for medium confidence", () => {
9
+ const result = colorizeConfidence("medium");
10
+ expect(result).toContain("medium");
11
+ });
12
+ it("should return red for low confidence", () => {
13
+ const result = colorizeConfidence("low");
14
+ expect(result).toContain("low");
15
+ });
16
+ });
17
+ describe("makeDetectCommandOutput", () => {
18
+ const baseSignatures = [
19
+ { name: "nginx", description: "Web server", cpe: "cpe:2.3:a:nginx:nginx" },
20
+ { name: "jQuery", description: "JavaScript library" },
21
+ { name: "PHP", description: "Programming language" },
22
+ {
23
+ name: "WordPress",
24
+ description: "CMS",
25
+ impliedSoftwares: ["PHP", "jQuery"],
26
+ },
27
+ ];
28
+ describe("basic detection", () => {
29
+ it("should convert detections to output format", () => {
30
+ const detections = [
31
+ {
32
+ name: "nginx",
33
+ evidences: [
34
+ {
35
+ type: "header",
36
+ value: "Server: nginx/1.20.0",
37
+ version: "1.20.0",
38
+ confidence: "high",
39
+ },
40
+ ],
41
+ },
42
+ ];
43
+ const result = makeDetectCommandOutput(detections, baseSignatures);
44
+ expect(result.detectedSoftwares).toHaveLength(1);
45
+ expect(result.detectedSoftwares[0].name).toBe("nginx");
46
+ expect(result.detectedSoftwares[0].description).toBe("Web server");
47
+ expect(result.detectedSoftwares[0].confidence).toBe("high");
48
+ expect(result.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
49
+ });
50
+ it("should generate CPEs when signature has cpe", () => {
51
+ const detections = [
52
+ {
53
+ name: "nginx",
54
+ evidences: [
55
+ {
56
+ type: "header",
57
+ value: "nginx/1.20.0",
58
+ version: "1.20.0",
59
+ confidence: "high",
60
+ },
61
+ ],
62
+ },
63
+ ];
64
+ const result = makeDetectCommandOutput(detections, baseSignatures);
65
+ expect(result.detectedSoftwares[0].cpes).toEqual([
66
+ "cpe:2.3:a:nginx:nginx:1.20.0",
67
+ ]);
68
+ });
69
+ it("should not include cpes when signature has no cpe", () => {
70
+ const detections = [
71
+ {
72
+ name: "jQuery",
73
+ evidences: [
74
+ {
75
+ type: "script",
76
+ value: "jquery.min.js",
77
+ version: "3.6.0",
78
+ confidence: "high",
79
+ },
80
+ ],
81
+ },
82
+ ];
83
+ const result = makeDetectCommandOutput(detections, baseSignatures);
84
+ expect(result.detectedSoftwares[0].cpes).toBeUndefined();
85
+ });
86
+ });
87
+ describe("confidence calculation", () => {
88
+ it("should use highest confidence from evidences", () => {
89
+ const detections = [
90
+ {
91
+ name: "nginx",
92
+ evidences: [
93
+ {
94
+ type: "header",
95
+ value: "nginx",
96
+ version: undefined,
97
+ confidence: "low",
98
+ },
99
+ {
100
+ type: "header",
101
+ value: "nginx/1.20.0",
102
+ version: "1.20.0",
103
+ confidence: "high",
104
+ },
105
+ ],
106
+ },
107
+ ];
108
+ const result = makeDetectCommandOutput(detections, baseSignatures);
109
+ expect(result.detectedSoftwares[0].confidence).toBe("high");
110
+ });
111
+ });
112
+ describe("implied softwares", () => {
113
+ it("should include implied softwares", () => {
114
+ const detections = [
115
+ {
116
+ name: "WordPress",
117
+ evidences: [
118
+ {
119
+ type: "body",
120
+ value: "wp-content",
121
+ version: undefined,
122
+ confidence: "high",
123
+ },
124
+ ],
125
+ },
126
+ ];
127
+ const result = makeDetectCommandOutput(detections, baseSignatures);
128
+ const names = result.detectedSoftwares.map((s) => s.name);
129
+ expect(names).toContain("WordPress");
130
+ expect(names).toContain("PHP");
131
+ expect(names).toContain("jQuery");
132
+ });
133
+ it("should set impliedBy on implied softwares", () => {
134
+ const detections = [
135
+ {
136
+ name: "WordPress",
137
+ evidences: [
138
+ {
139
+ type: "body",
140
+ value: "wp-content",
141
+ version: undefined,
142
+ confidence: "high",
143
+ },
144
+ ],
145
+ },
146
+ ];
147
+ const result = makeDetectCommandOutput(detections, baseSignatures);
148
+ const php = result.detectedSoftwares.find((s) => s.name === "PHP");
149
+ expect(php?.impliedBy).toBe("WordPress");
150
+ });
151
+ it("should not duplicate when software is both detected and implied", () => {
152
+ const detections = [
153
+ {
154
+ name: "WordPress",
155
+ evidences: [
156
+ {
157
+ type: "body",
158
+ value: "wp-content",
159
+ version: undefined,
160
+ confidence: "high",
161
+ },
162
+ ],
163
+ },
164
+ {
165
+ name: "PHP",
166
+ evidences: [
167
+ {
168
+ type: "header",
169
+ value: "X-Powered-By: PHP/8.0",
170
+ version: "8.0",
171
+ confidence: "high",
172
+ },
173
+ ],
174
+ },
175
+ ];
176
+ const result = makeDetectCommandOutput(detections, baseSignatures);
177
+ const phpInstances = result.detectedSoftwares.filter((s) => s.name === "PHP");
178
+ expect(phpInstances).toHaveLength(1);
179
+ });
180
+ });
181
+ describe("merging duplicates", () => {
182
+ it("should merge versions from multiple evidences", () => {
183
+ const detections = [
184
+ {
185
+ name: "nginx",
186
+ evidences: [
187
+ {
188
+ type: "header",
189
+ value: "nginx/1.20.0",
190
+ version: "1.20.0",
191
+ confidence: "high",
192
+ },
193
+ {
194
+ type: "header",
195
+ value: "nginx/1.20.0",
196
+ version: "1.20.0",
197
+ confidence: "high",
198
+ },
199
+ ],
200
+ },
201
+ ];
202
+ const result = makeDetectCommandOutput(detections, baseSignatures);
203
+ expect(result.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
204
+ });
205
+ it("should merge implied software from multiple sources", () => {
206
+ const signatures = [
207
+ { name: "React", impliedSoftwares: ["JavaScript"] },
208
+ { name: "Vue", impliedSoftwares: ["JavaScript"] },
209
+ { name: "JavaScript", description: "Programming language" },
210
+ ];
211
+ const detections = [
212
+ {
213
+ name: "React",
214
+ evidences: [
215
+ {
216
+ type: "script",
217
+ value: "react.min.js",
218
+ version: undefined,
219
+ confidence: "high",
220
+ },
221
+ ],
222
+ },
223
+ {
224
+ name: "Vue",
225
+ evidences: [
226
+ {
227
+ type: "script",
228
+ value: "vue.min.js",
229
+ version: undefined,
230
+ confidence: "medium",
231
+ },
232
+ ],
233
+ },
234
+ ];
235
+ const result = makeDetectCommandOutput(detections, signatures);
236
+ const js = result.detectedSoftwares.find((s) => s.name === "JavaScript");
237
+ expect(js).toBeDefined();
238
+ expect(js.impliedBy).toContain("React");
239
+ expect(js.impliedBy).toContain("Vue");
240
+ expect(js.confidence).toBe("high"); // Should use highest confidence
241
+ });
242
+ it("should merge versions and cpes when same software detected multiple ways", () => {
243
+ const signatures = [
244
+ { name: "nginx", cpe: "cpe:2.3:a:nginx:nginx" },
245
+ ];
246
+ const detections = [
247
+ {
248
+ name: "nginx",
249
+ evidences: [
250
+ {
251
+ type: "header",
252
+ value: "nginx/1.18.0",
253
+ version: "1.18.0",
254
+ confidence: "medium",
255
+ },
256
+ ],
257
+ },
258
+ {
259
+ name: "nginx",
260
+ evidences: [
261
+ {
262
+ type: "header",
263
+ value: "nginx/1.20.0",
264
+ version: "1.20.0",
265
+ confidence: "high",
266
+ },
267
+ ],
268
+ },
269
+ ];
270
+ const result = makeDetectCommandOutput(detections, signatures);
271
+ const nginx = result.detectedSoftwares.find((s) => s.name === "nginx");
272
+ expect(nginx).toBeDefined();
273
+ expect(nginx.versions).toContain("1.18.0");
274
+ expect(nginx.versions).toContain("1.20.0");
275
+ expect(nginx.cpes).toContain("cpe:2.3:a:nginx:nginx:1.18.0");
276
+ expect(nginx.cpes).toContain("cpe:2.3:a:nginx:nginx:1.20.0");
277
+ expect(nginx.confidence).toBe("high");
278
+ expect(nginx.evidences).toHaveLength(2);
279
+ });
280
+ it("should merge description from existing or new software", () => {
281
+ const signatures = [
282
+ { name: "nginx" }, // No description
283
+ ];
284
+ const detections = [
285
+ { name: "nginx" },
286
+ { name: "nginx" },
287
+ ];
288
+ const result = makeDetectCommandOutput(detections, signatures);
289
+ expect(result.detectedSoftwares).toHaveLength(1);
290
+ });
291
+ });
292
+ describe("edge cases", () => {
293
+ it("should handle empty detections", () => {
294
+ const result = makeDetectCommandOutput([], baseSignatures);
295
+ expect(result.detectedSoftwares).toEqual([]);
296
+ });
297
+ it("should handle detections without evidences", () => {
298
+ const detections = [{ name: "nginx" }];
299
+ const result = makeDetectCommandOutput(detections, baseSignatures);
300
+ expect(result.detectedSoftwares).toHaveLength(1);
301
+ expect(result.detectedSoftwares[0].confidence).toBe("low");
302
+ });
303
+ });
304
+ });
305
+ describe("printDetectCommandOutputAsText", () => {
306
+ let consoleLogSpy;
307
+ beforeEach(() => {
308
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
309
+ });
310
+ afterEach(() => {
311
+ consoleLogSpy.mockRestore();
312
+ });
313
+ it("should print software names", () => {
314
+ const output = {
315
+ detectedSoftwares: [
316
+ {
317
+ name: "nginx",
318
+ confidence: "high",
319
+ },
320
+ ],
321
+ };
322
+ printDetectCommandOutputAsText(output, false);
323
+ expect(consoleLogSpy).toHaveBeenCalled();
324
+ const allOutput = consoleLogSpy.mock.calls
325
+ .map((c) => c[0])
326
+ .join("\n");
327
+ expect(allOutput).toContain("nginx");
328
+ });
329
+ it("should print versions when available", () => {
330
+ const output = {
331
+ detectedSoftwares: [
332
+ {
333
+ name: "nginx",
334
+ confidence: "high",
335
+ evidences: [
336
+ {
337
+ type: "header",
338
+ value: "nginx/1.20.0",
339
+ version: "1.20.0",
340
+ confidence: "high",
341
+ },
342
+ ],
343
+ },
344
+ ],
345
+ };
346
+ printDetectCommandOutputAsText(output, false);
347
+ const allOutput = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
348
+ expect(allOutput).toContain("1.20.0");
349
+ });
350
+ it("should print evidences when showEvidence is true", () => {
351
+ const output = {
352
+ detectedSoftwares: [
353
+ {
354
+ name: "nginx",
355
+ confidence: "high",
356
+ evidences: [
357
+ {
358
+ type: "header",
359
+ value: "Server: nginx",
360
+ version: undefined,
361
+ confidence: "high",
362
+ },
363
+ ],
364
+ },
365
+ ],
366
+ };
367
+ printDetectCommandOutputAsText(output, true);
368
+ const allOutput = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
369
+ expect(allOutput).toContain("[header]");
370
+ expect(allOutput).toContain("Server: nginx");
371
+ });
372
+ it("should not print evidences when showEvidence is false", () => {
373
+ const output = {
374
+ detectedSoftwares: [
375
+ {
376
+ name: "nginx",
377
+ confidence: "high",
378
+ evidences: [
379
+ {
380
+ type: "header",
381
+ value: "Server: nginx",
382
+ version: undefined,
383
+ confidence: "high",
384
+ },
385
+ ],
386
+ },
387
+ ],
388
+ };
389
+ printDetectCommandOutputAsText(output, false);
390
+ const allOutput = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
391
+ expect(allOutput).not.toContain("[header]");
392
+ });
393
+ it("should print impliedBy when present", () => {
394
+ const output = {
395
+ detectedSoftwares: [
396
+ {
397
+ name: "PHP",
398
+ confidence: "high",
399
+ impliedBy: "WordPress",
400
+ },
401
+ ],
402
+ };
403
+ printDetectCommandOutputAsText(output, true);
404
+ const allOutput = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
405
+ expect(allOutput).toContain("[implied]");
406
+ expect(allOutput).toContain("WordPress");
407
+ });
408
+ });
409
+ describe("printDetectCommandOutputAsJSON", () => {
410
+ let consoleLogSpy;
411
+ beforeEach(() => {
412
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
413
+ });
414
+ afterEach(() => {
415
+ consoleLogSpy.mockRestore();
416
+ });
417
+ it("should print valid JSON", () => {
418
+ const output = {
419
+ detectedSoftwares: [
420
+ {
421
+ name: "nginx",
422
+ confidence: "high",
423
+ },
424
+ ],
425
+ };
426
+ printDetectCommandOutputAsJSON(output);
427
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
428
+ const jsonOutput = consoleLogSpy.mock.calls[0][0];
429
+ expect(() => JSON.parse(jsonOutput)).not.toThrow();
430
+ });
431
+ it("should include all fields in JSON output", () => {
432
+ const output = {
433
+ detectedSoftwares: [
434
+ {
435
+ name: "nginx",
436
+ description: "Web server",
437
+ versions: ["1.20.0"],
438
+ confidence: "high",
439
+ },
440
+ ],
441
+ };
442
+ printDetectCommandOutputAsJSON(output);
443
+ const jsonOutput = JSON.parse(consoleLogSpy.mock.calls[0][0]);
444
+ expect(jsonOutput.detectedSoftwares[0].name).toBe("nginx");
445
+ expect(jsonOutput.detectedSoftwares[0].description).toBe("Web server");
446
+ expect(jsonOutput.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
447
+ });
448
+ });
449
+ //# sourceMappingURL=detect_utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect_utils.test.js","sourceRoot":"","sources":["../../src/commands/detect_utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.test.d.ts","sourceRoot":"","sources":["../../src/commands/version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { versionCommand } from "./version.js";
3
+ import { VERSION } from "../cli.js";
4
+ describe("versionCommand", () => {
5
+ let consoleLogSpy;
6
+ beforeEach(() => {
7
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
8
+ });
9
+ afterEach(() => {
10
+ consoleLogSpy.mockRestore();
11
+ });
12
+ it("should create a command named version", () => {
13
+ const command = versionCommand();
14
+ expect(command.name()).toBe("version");
15
+ });
16
+ it("should have a description", () => {
17
+ const command = versionCommand();
18
+ expect(command.description()).toContain("version");
19
+ });
20
+ it("should print the version when action is called", async () => {
21
+ const command = versionCommand();
22
+ // Parse with just the command name, no extra arguments
23
+ await command.parseAsync([], { from: "user" });
24
+ expect(consoleLogSpy).toHaveBeenCalledWith(VERSION);
25
+ });
26
+ });
27
+ //# sourceMappingURL=version.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.test.js","sourceRoot":"","sources":["../../src/commands/version.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,aAA0C,CAAC;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,uDAAuD;QACvD,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.e2e.test.d.ts","sourceRoot":"","sources":["../../src/e2e/cli.e2e.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect, beforeAll } from "vitest";
2
+ import { execSync, exec } from "child_process";
3
+ import { promisify } from "util";
4
+ import { existsSync } from "fs";
5
+ import path from "path";
6
+ const execAsync = promisify(exec);
7
+ const CLI_PATH = path.join(process.cwd(), "dist", "main.js");
8
+ describe("CLI E2E Tests", () => {
9
+ beforeAll(() => {
10
+ // Ensure the CLI is built
11
+ if (!existsSync(CLI_PATH)) {
12
+ execSync("npm run build", { stdio: "inherit" });
13
+ }
14
+ });
15
+ describe("--version flag", () => {
16
+ it("should output version number", async () => {
17
+ const { stdout } = await execAsync(`node ${CLI_PATH} --version`);
18
+ expect(stdout.trim()).toMatch(/^\d+\.\d+\.\d+$/);
19
+ });
20
+ });
21
+ describe("--help flag", () => {
22
+ it("should output help information", async () => {
23
+ const { stdout } = await execAsync(`node ${CLI_PATH} --help`);
24
+ expect(stdout).toContain("Usage:");
25
+ expect(stdout).toContain("detect");
26
+ expect(stdout).toContain("version");
27
+ });
28
+ });
29
+ describe("version command", () => {
30
+ it("should output version number", async () => {
31
+ const { stdout } = await execAsync(`node ${CLI_PATH} version`);
32
+ expect(stdout.trim()).toMatch(/^\d+\.\d+\.\d+$/);
33
+ });
34
+ });
35
+ describe("detect command", () => {
36
+ describe("--help flag", () => {
37
+ it("should output detect command help", async () => {
38
+ const { stdout } = await execAsync(`node ${CLI_PATH} detect --help`);
39
+ expect(stdout).toContain("url");
40
+ expect(stdout).toContain("--timeout");
41
+ expect(stdout).toContain("--json");
42
+ expect(stdout).toContain("--evidence");
43
+ expect(stdout).toContain("--debug");
44
+ });
45
+ });
46
+ it("should fail without URL argument", async () => {
47
+ try {
48
+ await execAsync(`node ${CLI_PATH} detect`);
49
+ expect.fail("Should have thrown");
50
+ }
51
+ catch (error) {
52
+ const err = error;
53
+ expect(err.stderr).toContain("url");
54
+ }
55
+ });
56
+ });
57
+ describe("invalid command", () => {
58
+ it("should show error for unknown command", async () => {
59
+ try {
60
+ await execAsync(`node ${CLI_PATH} unknown`);
61
+ expect.fail("Should have thrown");
62
+ }
63
+ catch (error) {
64
+ const err = error;
65
+ expect(err.stderr).toContain("unknown");
66
+ }
67
+ });
68
+ });
69
+ describe("banner output", () => {
70
+ it("should display banner on stderr", async () => {
71
+ const { stderr } = await execAsync(`node ${CLI_PATH} --help`);
72
+ expect(stderr).toContain("Whopper");
73
+ });
74
+ });
75
+ });
76
+ // Optional: Real detection tests (skipped by default due to network dependency)
77
+ describe.skip("Detection E2E Tests (requires network)", () => {
78
+ it("should detect technologies on example.com", async () => {
79
+ const { stdout } = await execAsync(`node ${CLI_PATH} detect https://example.com --json --timeout 30000`);
80
+ const result = JSON.parse(stdout);
81
+ expect(result).toHaveProperty("detectedSoftwares");
82
+ expect(Array.isArray(result.detectedSoftwares)).toBe(true);
83
+ }, 60000);
84
+ });
85
+ //# sourceMappingURL=cli.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.e2e.test.js","sourceRoot":"","sources":["../../src/e2e/cli.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAE7D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,QAAQ,YAAY,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,QAAQ,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,QAAQ,UAAU,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;YAC3B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,QAAQ,gBAAgB,CAAC,CAAC;gBACrE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,QAAQ,QAAQ,SAAS,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAyC,CAAC;gBACtD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,QAAQ,QAAQ,UAAU,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAA2B,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,QAAQ,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,QAAQ,CAAC,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAC3D,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,QAAQ,QAAQ,oDAAoD,CACrE,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/logger/index.test.ts"],"names":[],"mappings":""}