@pagopa/dx-savemoney 0.3.0 → 0.3.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 (34) hide show
  1. package/dist/__tests__/finding.test.d.ts +17 -0
  2. package/dist/__tests__/finding.test.d.ts.map +1 -0
  3. package/dist/__tests__/finding.test.js +124 -0
  4. package/dist/__tests__/finding.test.js.map +1 -0
  5. package/dist/azure/__tests__/analyzer-tags.test.d.ts +8 -0
  6. package/dist/azure/__tests__/analyzer-tags.test.d.ts.map +1 -0
  7. package/dist/azure/__tests__/analyzer-tags.test.js +43 -0
  8. package/dist/azure/__tests__/analyzer-tags.test.js.map +1 -0
  9. package/dist/azure/__tests__/config.test.d.ts +9 -0
  10. package/dist/azure/__tests__/config.test.d.ts.map +1 -0
  11. package/dist/azure/__tests__/config.test.js +70 -0
  12. package/dist/azure/__tests__/config.test.js.map +1 -0
  13. package/dist/azure/__tests__/report.test.d.ts +9 -0
  14. package/dist/azure/__tests__/report.test.d.ts.map +1 -0
  15. package/dist/azure/__tests__/report.test.js +120 -0
  16. package/dist/azure/__tests__/report.test.js.map +1 -0
  17. package/dist/azure/__tests__/utils.test.d.ts +15 -0
  18. package/dist/azure/__tests__/utils.test.d.ts.map +1 -0
  19. package/dist/azure/__tests__/utils.test.js +181 -0
  20. package/dist/azure/__tests__/utils.test.js.map +1 -0
  21. package/dist/azure/analyzers/__tests__/advisor.test.d.ts +9 -0
  22. package/dist/azure/analyzers/__tests__/advisor.test.d.ts.map +1 -0
  23. package/dist/azure/analyzers/__tests__/advisor.test.js +314 -0
  24. package/dist/azure/analyzers/__tests__/advisor.test.js.map +1 -0
  25. package/dist/azure/resources/__tests__/storage.test.d.ts +11 -0
  26. package/dist/azure/resources/__tests__/storage.test.d.ts.map +1 -0
  27. package/dist/azure/resources/__tests__/storage.test.js +99 -0
  28. package/dist/azure/resources/__tests__/storage.test.js.map +1 -0
  29. package/dist/index.test.d.ts +2 -0
  30. package/dist/index.test.d.ts.map +1 -0
  31. package/dist/index.test.js +78 -0
  32. package/dist/index.test.js.map +1 -0
  33. package/package.json +3 -3
  34. package/src/azure/__tests__/report.test.ts +10 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../../src/azure/resources/__tests__/storage.test.ts"],"names":[],"mappings":"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"}
@@ -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/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mergeResults } from "./index.js";
3
+ describe("mergeResults", () => {
4
+ it("should concatenate reasons from both results", () => {
5
+ const baseResult = {
6
+ costRisk: "low",
7
+ reason: "No tags found. ",
8
+ suspectedUnused: true,
9
+ };
10
+ const specificResult = {
11
+ costRisk: "medium",
12
+ reason: "Disk is unattached. ",
13
+ suspectedUnused: true,
14
+ };
15
+ const merged = mergeResults(baseResult, specificResult);
16
+ expect(merged.reason).toBe("No tags found. Disk is unattached. ");
17
+ expect(merged.costRisk).toBe("medium");
18
+ expect(merged.suspectedUnused).toBe(true);
19
+ });
20
+ it("should use specific result's cost risk", () => {
21
+ const baseResult = {
22
+ costRisk: "low",
23
+ reason: "Base reason. ",
24
+ suspectedUnused: false,
25
+ };
26
+ const specificResult = {
27
+ costRisk: "high",
28
+ reason: "High risk reason. ",
29
+ suspectedUnused: true,
30
+ };
31
+ const merged = mergeResults(baseResult, specificResult);
32
+ expect(merged.costRisk).toBe("high");
33
+ });
34
+ it("should OR suspectedUnused flags", () => {
35
+ const baseResult = {
36
+ costRisk: "low",
37
+ reason: "Base. ",
38
+ suspectedUnused: false,
39
+ };
40
+ const specificResult = {
41
+ costRisk: "medium",
42
+ reason: "Specific. ",
43
+ suspectedUnused: true,
44
+ };
45
+ const merged = mergeResults(baseResult, specificResult);
46
+ expect(merged.suspectedUnused).toBe(true);
47
+ });
48
+ it("should handle empty reasons", () => {
49
+ const baseResult = {
50
+ costRisk: "low",
51
+ reason: "",
52
+ suspectedUnused: false,
53
+ };
54
+ const specificResult = {
55
+ costRisk: "medium",
56
+ reason: "Only specific reason. ",
57
+ suspectedUnused: false,
58
+ };
59
+ const merged = mergeResults(baseResult, specificResult);
60
+ expect(merged.reason).toBe("Only specific reason. ");
61
+ });
62
+ it("should preserve both reasons when both are present", () => {
63
+ const baseResult = {
64
+ costRisk: "low",
65
+ reason: "First issue. ",
66
+ suspectedUnused: true,
67
+ };
68
+ const specificResult = {
69
+ costRisk: "high",
70
+ reason: "Second issue. ",
71
+ suspectedUnused: false,
72
+ };
73
+ const merged = mergeResults(baseResult, specificResult);
74
+ expect(merged.reason).toBe("First issue. Second issue. ");
75
+ expect(merged.suspectedUnused).toBe(true); // true OR false = true
76
+ });
77
+ });
78
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pagopa/dx-savemoney",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "Azure resource analyzer for finding unused or cost-inefficient resources.",
6
6
  "repository": {
@@ -45,11 +45,11 @@
45
45
  "@tsconfig/node24": "24.0.4",
46
46
  "@types/js-yaml": "^4.0.9",
47
47
  "@types/node": "^22.19.17",
48
- "@vitest/coverage-v8": "^3.2.4",
48
+ "@vitest/coverage-v8": "^4.1.8",
49
49
  "eslint": "^10.3.0",
50
50
  "prettier": "3.8.3",
51
51
  "typescript": "~5.9.3",
52
- "vitest": "^3.2.4",
52
+ "vitest": "^4.1.8",
53
53
  "@pagopa/eslint-config": "^6.0.4"
54
54
  },
55
55
  "scripts": {
@@ -52,7 +52,7 @@ const LOW_ENTRY = makeEntry(
52
52
  // ── helpers ────────────────────────────────────────────────────────────────
53
53
 
54
54
  function allLogs(spy: ReturnType<typeof vi.spyOn>) {
55
- return spy.mock.calls.map((c) => c[0] as string).join("\n");
55
+ return spy.mock.calls.map((c: string[]) => c[0]).join("\n");
56
56
  }
57
57
 
58
58
  // ── tests ──────────────────────────────────────────────────────────────────
@@ -95,10 +95,8 @@ describe("generateReport — lint format", () => {
95
95
  it("splits a multi-sentence reason into separate findings", async () => {
96
96
  // Reason has two sentences separated by '. '
97
97
  await generateReport([HIGH_ENTRY], "lint");
98
- const calls = logSpy.mock.calls.map(
99
- (c) => (c[0] as string | undefined) ?? "",
100
- );
101
- const findingLines = calls.filter((l) => l.startsWith(" "));
98
+ const calls = logSpy.mock.calls.map((c: string[]) => c[0] ?? "");
99
+ const findingLines = calls.filter((l: string) => l.startsWith(" "));
102
100
  // "VM is deallocated." and "No disk activity detected." → 2 findings
103
101
  expect(findingLines.length).toBe(2);
104
102
  });
@@ -131,7 +129,7 @@ describe("generateReport — lint format", () => {
131
129
 
132
130
  it("prints nothing but the summary for an empty report", async () => {
133
131
  await generateReport([], "lint");
134
- const calls = logSpy.mock.calls.map((c) => c[0] as string);
132
+ const calls = logSpy.mock.calls.map((c: string[]) => c[0]);
135
133
  expect(calls).toHaveLength(1);
136
134
  expect(calls[0]).toContain("0 issues found");
137
135
  });
@@ -152,13 +150,17 @@ describe("generateReport — table format", () => {
152
150
  await expect(generateReport([], "table")).resolves.toBeUndefined();
153
151
  // Table is always printed; the summary line ("0 issues found") follows.
154
152
  expect(logSpy.mock.calls.length).toBeGreaterThanOrEqual(1);
155
- const output = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
153
+ const output = logSpy.mock.calls
154
+ .map((c: string[]) => String(c[0]))
155
+ .join("\n");
156
156
  expect(output).toContain("0 issues found");
157
157
  });
158
158
 
159
159
  it("includes resource name and reason in the rendered table", async () => {
160
160
  await generateReport([HIGH_ENTRY], "table");
161
- const output = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
161
+ const output = logSpy.mock.calls
162
+ .map((c: string[]) => String(c[0]))
163
+ .join("\n");
162
164
  expect(output).toContain("vm-high");
163
165
  expect(output).toContain("VM is deallocated");
164
166
  });