@pagopa/dx-savemoney 0.6.1 → 0.6.2
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.
- package/dist/azure/pricing/pricing-service.d.ts.map +1 -1
- package/dist/azure/pricing/pricing-service.js +6 -1
- package/dist/azure/pricing/pricing-service.js.map +1 -1
- package/dist/azure/pricing/schema.d.ts.map +1 -1
- package/dist/azure/pricing/schema.js +22 -14
- package/dist/azure/pricing/schema.js.map +1 -1
- package/dist/azure/resources/app-service.d.ts.map +1 -1
- package/dist/azure/resources/app-service.js +2 -2
- package/dist/azure/resources/app-service.js.map +1 -1
- package/dist/azure/resources/container-app.d.ts.map +1 -1
- package/dist/azure/resources/container-app.js +1 -1
- package/dist/azure/resources/container-app.js.map +1 -1
- package/dist/azure/resources/disk.js +3 -1
- package/dist/azure/resources/disk.js.map +1 -1
- package/dist/azure/resources/nic.js +3 -1
- package/dist/azure/resources/nic.js.map +1 -1
- package/dist/azure/resources/private-endpoint.d.ts.map +1 -1
- package/dist/azure/resources/private-endpoint.js +1 -1
- package/dist/azure/resources/private-endpoint.js.map +1 -1
- package/dist/azure/resources/public-ip.d.ts.map +1 -1
- package/dist/azure/resources/public-ip.js +4 -2
- package/dist/azure/resources/public-ip.js.map +1 -1
- package/dist/azure/resources/static-web-app.d.ts.map +1 -1
- package/dist/azure/resources/static-web-app.js +1 -1
- package/dist/azure/resources/static-web-app.js.map +1 -1
- package/dist/azure/resources/vm.js +6 -2
- package/dist/azure/resources/vm.js.map +1 -1
- package/dist/azure/utils.d.ts.map +1 -1
- package/dist/azure/utils.js +7 -2
- package/dist/azure/utils.js.map +1 -1
- package/package.json +1 -8
- package/src/azure/pricing/__tests__/schema.test.ts +30 -0
- package/src/azure/pricing/pricing-service.ts +6 -3
- package/src/azure/pricing/schema.ts +22 -14
- package/src/azure/resources/app-service.ts +4 -2
- package/src/azure/resources/container-app.ts +2 -1
- package/src/azure/resources/disk.ts +3 -3
- package/src/azure/resources/nic.ts +3 -3
- package/src/azure/resources/private-endpoint.ts +2 -1
- package/src/azure/resources/public-ip.ts +5 -4
- package/src/azure/resources/static-web-app.ts +2 -1
- package/src/azure/resources/vm.ts +6 -6
- package/src/azure/utils.ts +8 -2
- package/dist/__tests__/finding.test.d.ts +0 -17
- package/dist/__tests__/finding.test.d.ts.map +0 -1
- package/dist/__tests__/finding.test.js +0 -146
- package/dist/__tests__/finding.test.js.map +0 -1
- package/dist/azure/__tests__/analyzer-tags.test.d.ts +0 -8
- package/dist/azure/__tests__/analyzer-tags.test.d.ts.map +0 -1
- package/dist/azure/__tests__/analyzer-tags.test.js +0 -70
- package/dist/azure/__tests__/analyzer-tags.test.js.map +0 -1
- package/dist/azure/__tests__/azqr.test.d.ts +0 -13
- package/dist/azure/__tests__/azqr.test.d.ts.map +0 -1
- package/dist/azure/__tests__/azqr.test.js +0 -177
- package/dist/azure/__tests__/azqr.test.js.map +0 -1
- package/dist/azure/__tests__/config.test.d.ts +0 -9
- package/dist/azure/__tests__/config.test.d.ts.map +0 -1
- package/dist/azure/__tests__/config.test.js +0 -102
- package/dist/azure/__tests__/config.test.js.map +0 -1
- package/dist/azure/__tests__/report.test.d.ts +0 -9
- package/dist/azure/__tests__/report.test.d.ts.map +0 -1
- package/dist/azure/__tests__/report.test.js +0 -191
- package/dist/azure/__tests__/report.test.js.map +0 -1
- package/dist/azure/__tests__/utils.test.d.ts +0 -15
- package/dist/azure/__tests__/utils.test.d.ts.map +0 -1
- package/dist/azure/__tests__/utils.test.js +0 -181
- package/dist/azure/__tests__/utils.test.js.map +0 -1
- package/dist/azure/analyzers/__tests__/advisor.test.d.ts +0 -9
- package/dist/azure/analyzers/__tests__/advisor.test.d.ts.map +0 -1
- package/dist/azure/analyzers/__tests__/advisor.test.js +0 -314
- package/dist/azure/analyzers/__tests__/advisor.test.js.map +0 -1
- package/dist/azure/pricing/__tests__/cache.test.d.ts +0 -8
- package/dist/azure/pricing/__tests__/cache.test.d.ts.map +0 -1
- package/dist/azure/pricing/__tests__/cache.test.js +0 -56
- package/dist/azure/pricing/__tests__/cache.test.js.map +0 -1
- package/dist/azure/pricing/__tests__/client.test.d.ts +0 -9
- package/dist/azure/pricing/__tests__/client.test.d.ts.map +0 -1
- package/dist/azure/pricing/__tests__/client.test.js +0 -181
- package/dist/azure/pricing/__tests__/client.test.js.map +0 -1
- package/dist/azure/pricing/__tests__/pricing-service.test.d.ts +0 -6
- package/dist/azure/pricing/__tests__/pricing-service.test.d.ts.map +0 -1
- package/dist/azure/pricing/__tests__/pricing-service.test.js +0 -283
- package/dist/azure/pricing/__tests__/pricing-service.test.js.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts +0 -5
- package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/app-service.test.js +0 -137
- package/dist/azure/pricing/resolvers/__tests__/app-service.test.js.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts +0 -5
- package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/disk.test.js +0 -160
- package/dist/azure/pricing/resolvers/__tests__/disk.test.js.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts +0 -5
- package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js +0 -113
- package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts +0 -9
- package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts.map +0 -1
- package/dist/azure/pricing/resolvers/__tests__/vm.test.js +0 -204
- package/dist/azure/pricing/resolvers/__tests__/vm.test.js.map +0 -1
- package/dist/azure/resources/__tests__/app-service.test.d.ts +0 -5
- package/dist/azure/resources/__tests__/app-service.test.d.ts.map +0 -1
- package/dist/azure/resources/__tests__/app-service.test.js +0 -105
- package/dist/azure/resources/__tests__/app-service.test.js.map +0 -1
- package/dist/azure/resources/__tests__/storage.test.d.ts +0 -11
- package/dist/azure/resources/__tests__/storage.test.d.ts.map +0 -1
- package/dist/azure/resources/__tests__/storage.test.js +0 -99
- package/dist/azure/resources/__tests__/storage.test.js.map +0 -1
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the Azure Advisor subscription-level analyzer.
|
|
3
|
-
*
|
|
4
|
-
* We never touch a real Azure subscription: the analyzer is constructed
|
|
5
|
-
* with an injected client factory that returns a fake exposing only the
|
|
6
|
-
* `recommendations.list()` async iterator the analyzer relies on.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, expect, it } from "vitest";
|
|
9
|
-
import { createAdvisorAnalyzer } from "../advisor.js";
|
|
10
|
-
function makeCtx() {
|
|
11
|
-
const credential = {
|
|
12
|
-
getToken: async () => null,
|
|
13
|
-
};
|
|
14
|
-
return {
|
|
15
|
-
credential,
|
|
16
|
-
subscriptionId: "00000000-0000-0000-0000-000000000000",
|
|
17
|
-
verbose: false,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
// Reusable ARM-style resource IDs used across tests
|
|
21
|
-
const RID1 = "/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/vm-1";
|
|
22
|
-
const RID2 = "/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/vm-2";
|
|
23
|
-
function makeFakeClient(recs) {
|
|
24
|
-
return {
|
|
25
|
-
recommendations: {
|
|
26
|
-
async *list() {
|
|
27
|
-
for (const r of recs)
|
|
28
|
-
yield r;
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
describe("createAdvisorAnalyzer", () => {
|
|
34
|
-
it("exposes a stable id", () => {
|
|
35
|
-
const analyzer = createAdvisorAnalyzer({
|
|
36
|
-
build: () => makeFakeClient([]),
|
|
37
|
-
});
|
|
38
|
-
expect(analyzer.id).toBe("azure.advisor");
|
|
39
|
-
});
|
|
40
|
-
it("returns no findings for an empty list", async () => {
|
|
41
|
-
const analyzer = createAdvisorAnalyzer({
|
|
42
|
-
build: () => makeFakeClient([]),
|
|
43
|
-
});
|
|
44
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
45
|
-
expect(findings).toEqual([]);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
describe("createAdvisorAnalyzer — recommendation mapping", () => {
|
|
49
|
-
it("maps a Cost recommendation to a Finding with savings", async () => {
|
|
50
|
-
const analyzer = createAdvisorAnalyzer({
|
|
51
|
-
build: () => makeFakeClient([
|
|
52
|
-
{
|
|
53
|
-
category: "Cost",
|
|
54
|
-
extendedProperties: {
|
|
55
|
-
savingsAmount: "42.50",
|
|
56
|
-
savingsCurrency: "EUR",
|
|
57
|
-
},
|
|
58
|
-
impact: "High",
|
|
59
|
-
recommendationTypeId: "right-size-vm",
|
|
60
|
-
resourceMetadata: {
|
|
61
|
-
resourceId: "/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/vm",
|
|
62
|
-
},
|
|
63
|
-
shortDescription: {
|
|
64
|
-
problem: "Right-size your VM",
|
|
65
|
-
solution: "Switch to a smaller SKU",
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
]),
|
|
69
|
-
});
|
|
70
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
71
|
-
expect(findings).toHaveLength(1);
|
|
72
|
-
const finding = findings[0];
|
|
73
|
-
expect(finding.source).toBe("advisor");
|
|
74
|
-
expect(finding.code).toBe("advisor.right-size-vm");
|
|
75
|
-
expect(finding.severity).toBe("high");
|
|
76
|
-
expect(finding.category).toBe("cost");
|
|
77
|
-
expect(finding.estimatedMonthlySavings).toEqual({
|
|
78
|
-
amount: 42.5,
|
|
79
|
-
currency: "EUR",
|
|
80
|
-
});
|
|
81
|
-
expect(finding.recommendedAction).toBe("Switch to a smaller SKU");
|
|
82
|
-
expect(finding.reason).toBe("Right-size your VM.");
|
|
83
|
-
expect(finding.resourceId).toBe("/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/vm");
|
|
84
|
-
});
|
|
85
|
-
it("maps `Medium` impact to severity `medium`", async () => {
|
|
86
|
-
const analyzer = createAdvisorAnalyzer({
|
|
87
|
-
build: () => makeFakeClient([
|
|
88
|
-
{
|
|
89
|
-
category: "Cost",
|
|
90
|
-
impact: "Medium",
|
|
91
|
-
recommendationTypeId: "x",
|
|
92
|
-
resourceMetadata: { resourceId: RID1 },
|
|
93
|
-
shortDescription: { problem: "p" },
|
|
94
|
-
},
|
|
95
|
-
]),
|
|
96
|
-
});
|
|
97
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
98
|
-
expect(findings[0].severity).toBe("medium");
|
|
99
|
-
});
|
|
100
|
-
it("falls back to `low` for unknown impact values", async () => {
|
|
101
|
-
const analyzer = createAdvisorAnalyzer({
|
|
102
|
-
build: () => makeFakeClient([
|
|
103
|
-
{
|
|
104
|
-
category: "Cost",
|
|
105
|
-
impact: "Bogus",
|
|
106
|
-
recommendationTypeId: "x",
|
|
107
|
-
resourceMetadata: { resourceId: RID1 },
|
|
108
|
-
shortDescription: { problem: "p" },
|
|
109
|
-
},
|
|
110
|
-
]),
|
|
111
|
-
});
|
|
112
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
113
|
-
expect(findings[0].severity).toBe("low");
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
describe("createAdvisorAnalyzer — savings parsing", () => {
|
|
117
|
-
it("omits estimatedMonthlySavings when savingsAmount is missing", async () => {
|
|
118
|
-
const analyzer = createAdvisorAnalyzer({
|
|
119
|
-
build: () => makeFakeClient([
|
|
120
|
-
{
|
|
121
|
-
category: "Cost",
|
|
122
|
-
impact: "Low",
|
|
123
|
-
recommendationTypeId: "x",
|
|
124
|
-
resourceMetadata: { resourceId: RID1 },
|
|
125
|
-
shortDescription: { problem: "p" },
|
|
126
|
-
},
|
|
127
|
-
]),
|
|
128
|
-
});
|
|
129
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
130
|
-
expect(findings[0].estimatedMonthlySavings).toBeUndefined();
|
|
131
|
-
});
|
|
132
|
-
it("omits estimatedMonthlySavings when savingsAmount is not a number", async () => {
|
|
133
|
-
const analyzer = createAdvisorAnalyzer({
|
|
134
|
-
build: () => makeFakeClient([
|
|
135
|
-
{
|
|
136
|
-
category: "Cost",
|
|
137
|
-
extendedProperties: { savingsAmount: "n/a" },
|
|
138
|
-
impact: "Low",
|
|
139
|
-
recommendationTypeId: "x",
|
|
140
|
-
resourceMetadata: { resourceId: RID1 },
|
|
141
|
-
shortDescription: { problem: "p" },
|
|
142
|
-
},
|
|
143
|
-
]),
|
|
144
|
-
});
|
|
145
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
146
|
-
expect(findings[0].estimatedMonthlySavings).toBeUndefined();
|
|
147
|
-
});
|
|
148
|
-
it("defaults the currency to USD when only savingsAmount is present", async () => {
|
|
149
|
-
const analyzer = createAdvisorAnalyzer({
|
|
150
|
-
build: () => makeFakeClient([
|
|
151
|
-
{
|
|
152
|
-
category: "Cost",
|
|
153
|
-
extendedProperties: { savingsAmount: "10" },
|
|
154
|
-
impact: "Low",
|
|
155
|
-
recommendationTypeId: "x",
|
|
156
|
-
resourceMetadata: { resourceId: RID1 },
|
|
157
|
-
shortDescription: { problem: "p" },
|
|
158
|
-
},
|
|
159
|
-
]),
|
|
160
|
-
});
|
|
161
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
162
|
-
expect(findings[0].estimatedMonthlySavings).toEqual({
|
|
163
|
-
amount: 10,
|
|
164
|
-
currency: "USD",
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
describe("createAdvisorAnalyzer — filtering", () => {
|
|
169
|
-
it("skips non-Cost recommendations", async () => {
|
|
170
|
-
const analyzer = createAdvisorAnalyzer({
|
|
171
|
-
build: () => makeFakeClient([
|
|
172
|
-
{
|
|
173
|
-
category: "Security",
|
|
174
|
-
impact: "High",
|
|
175
|
-
recommendationTypeId: "x",
|
|
176
|
-
resourceMetadata: { resourceId: RID1 },
|
|
177
|
-
shortDescription: { problem: "p" },
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
category: "Cost",
|
|
181
|
-
impact: "Low",
|
|
182
|
-
recommendationTypeId: "y",
|
|
183
|
-
resourceMetadata: { resourceId: RID2 },
|
|
184
|
-
shortDescription: { problem: "p" },
|
|
185
|
-
},
|
|
186
|
-
]),
|
|
187
|
-
});
|
|
188
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
189
|
-
expect(findings).toHaveLength(1);
|
|
190
|
-
expect(findings[0].code).toBe("advisor.y");
|
|
191
|
-
});
|
|
192
|
-
it("attributes subscription as fallback resource when resourceId is absent", async () => {
|
|
193
|
-
const ctx = makeCtx();
|
|
194
|
-
const analyzer = createAdvisorAnalyzer({
|
|
195
|
-
build: () => makeFakeClient([
|
|
196
|
-
{
|
|
197
|
-
category: "Cost",
|
|
198
|
-
impact: "Low",
|
|
199
|
-
recommendationTypeId: "x",
|
|
200
|
-
resourceMetadata: {},
|
|
201
|
-
shortDescription: { problem: "p" },
|
|
202
|
-
},
|
|
203
|
-
]),
|
|
204
|
-
});
|
|
205
|
-
const findings = await analyzer.analyze(ctx);
|
|
206
|
-
expect(findings).toHaveLength(1);
|
|
207
|
-
expect(findings[0].resourceId).toBe(`/subscriptions/${ctx.subscriptionId}`);
|
|
208
|
-
});
|
|
209
|
-
it("includes subscription-scoped recommendations using their own resource ID", async () => {
|
|
210
|
-
const SUB_URI = "/subscriptions/00000000-0000-0000-0000-000000000000";
|
|
211
|
-
const analyzer = createAdvisorAnalyzer({
|
|
212
|
-
build: () => makeFakeClient([
|
|
213
|
-
{
|
|
214
|
-
category: "Cost",
|
|
215
|
-
impact: "High",
|
|
216
|
-
recommendationTypeId: "reserved-instance",
|
|
217
|
-
resourceMetadata: { resourceId: SUB_URI },
|
|
218
|
-
shortDescription: { problem: "Consider reserved instances" },
|
|
219
|
-
},
|
|
220
|
-
]),
|
|
221
|
-
});
|
|
222
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
223
|
-
expect(findings).toHaveLength(1);
|
|
224
|
-
expect(findings[0].resourceId).toBe(SUB_URI);
|
|
225
|
-
expect(findings[0].severity).toBe("high");
|
|
226
|
-
});
|
|
227
|
-
it("aggregates subscription-scoped findings with the same recommendationTypeId", async () => {
|
|
228
|
-
const SUB_URI = "/subscriptions/00000000-0000-0000-0000-000000000000";
|
|
229
|
-
const analyzer = createAdvisorAnalyzer({
|
|
230
|
-
build: () => makeFakeClient([
|
|
231
|
-
{
|
|
232
|
-
category: "Cost",
|
|
233
|
-
extendedProperties: {
|
|
234
|
-
savingsAmount: "121",
|
|
235
|
-
savingsCurrency: "EUR",
|
|
236
|
-
},
|
|
237
|
-
id: "/subscriptions/sub1/advisorRecommendations/r1",
|
|
238
|
-
impact: "High",
|
|
239
|
-
recommendationTypeId: "postgresql-ri",
|
|
240
|
-
resourceMetadata: { resourceId: SUB_URI },
|
|
241
|
-
shortDescription: {
|
|
242
|
-
problem: "Consider PostgreSQL reserved instance",
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
category: "Cost",
|
|
247
|
-
extendedProperties: { savingsAmount: "71", savingsCurrency: "EUR" },
|
|
248
|
-
id: "/subscriptions/sub1/advisorRecommendations/r2",
|
|
249
|
-
impact: "High",
|
|
250
|
-
recommendationTypeId: "postgresql-ri",
|
|
251
|
-
resourceMetadata: { resourceId: SUB_URI },
|
|
252
|
-
shortDescription: {
|
|
253
|
-
problem: "Consider PostgreSQL reserved instance",
|
|
254
|
-
},
|
|
255
|
-
},
|
|
256
|
-
]),
|
|
257
|
-
});
|
|
258
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
259
|
-
// Two API entries with the same type → one aggregated finding.
|
|
260
|
-
expect(findings).toHaveLength(1);
|
|
261
|
-
expect(findings[0].code).toBe("advisor.postgresql-ri");
|
|
262
|
-
expect(findings[0].estimatedMonthlySavings).toEqual({
|
|
263
|
-
amount: 121,
|
|
264
|
-
currency: "EUR",
|
|
265
|
-
});
|
|
266
|
-
expect(findings[0].reason).toContain("2 options");
|
|
267
|
-
});
|
|
268
|
-
it("deduplicates subscription-scoped entries with the same recommendation ARM ID", async () => {
|
|
269
|
-
const SUB_URI = "/subscriptions/00000000-0000-0000-0000-000000000000";
|
|
270
|
-
const dupId = "/subscriptions/sub1/providers/microsoft.advisor/recommendations/dup";
|
|
271
|
-
const analyzer = createAdvisorAnalyzer({
|
|
272
|
-
build: () => makeFakeClient([
|
|
273
|
-
{
|
|
274
|
-
category: "Cost",
|
|
275
|
-
extendedProperties: { savingsAmount: "50", savingsCurrency: "EUR" },
|
|
276
|
-
id: dupId,
|
|
277
|
-
impact: "High",
|
|
278
|
-
recommendationTypeId: "vm-ri",
|
|
279
|
-
resourceMetadata: { resourceId: SUB_URI },
|
|
280
|
-
shortDescription: { problem: "Buy VM reserved instance" },
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
// Same ARM ID returned again by the API — should be counted only once.
|
|
284
|
-
category: "Cost",
|
|
285
|
-
extendedProperties: { savingsAmount: "50", savingsCurrency: "EUR" },
|
|
286
|
-
id: dupId,
|
|
287
|
-
impact: "High",
|
|
288
|
-
recommendationTypeId: "vm-ri",
|
|
289
|
-
resourceMetadata: { resourceId: SUB_URI },
|
|
290
|
-
shortDescription: { problem: "Buy VM reserved instance" },
|
|
291
|
-
},
|
|
292
|
-
]),
|
|
293
|
-
});
|
|
294
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
295
|
-
expect(findings).toHaveLength(1);
|
|
296
|
-
// Savings must NOT be doubled.
|
|
297
|
-
expect(findings[0].estimatedMonthlySavings?.amount).toBe(50);
|
|
298
|
-
});
|
|
299
|
-
it("uses a fallback reason when shortDescription is missing", async () => {
|
|
300
|
-
const analyzer = createAdvisorAnalyzer({
|
|
301
|
-
build: () => makeFakeClient([
|
|
302
|
-
{
|
|
303
|
-
category: "Cost",
|
|
304
|
-
impact: "Low",
|
|
305
|
-
recommendationTypeId: "x",
|
|
306
|
-
resourceMetadata: { resourceId: RID1 },
|
|
307
|
-
},
|
|
308
|
-
]),
|
|
309
|
-
});
|
|
310
|
-
const findings = await analyzer.analyze(makeCtx());
|
|
311
|
-
expect(findings[0].reason).toBe("Azure Advisor cost recommendation.");
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
//# sourceMappingURL=advisor.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"advisor.test.js","sourceRoot":"","sources":["../../../../src/azure/analyzers/__tests__/advisor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/cache.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the disk-backed pricing cache.
|
|
3
|
-
*
|
|
4
|
-
* Each test uses a freshly-created temp directory so they do not leak
|
|
5
|
-
* state into the developer's real pricing cache.
|
|
6
|
-
*/
|
|
7
|
-
import { writeFile } from "node:fs/promises";
|
|
8
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
9
|
-
import { DiskCache } from "../cache.js";
|
|
10
|
-
import { makeTestCacheDir, removeTestCacheDir } from "../test-cache-dir.js";
|
|
11
|
-
describe("DiskCache", () => {
|
|
12
|
-
let dir;
|
|
13
|
-
beforeEach(async () => {
|
|
14
|
-
dir = await makeTestCacheDir("cache");
|
|
15
|
-
});
|
|
16
|
-
afterEach(async () => {
|
|
17
|
-
await removeTestCacheDir(dir);
|
|
18
|
-
});
|
|
19
|
-
it("returns undefined on a miss", async () => {
|
|
20
|
-
const cache = new DiskCache({ dir });
|
|
21
|
-
await expect(cache.get("nope")).resolves.toBeUndefined();
|
|
22
|
-
});
|
|
23
|
-
it("returns the value written under the same key", async () => {
|
|
24
|
-
const cache = new DiskCache({ dir });
|
|
25
|
-
await cache.set("hello", { hits: 42 });
|
|
26
|
-
await expect(cache.get("hello")).resolves.toEqual({ hits: 42 });
|
|
27
|
-
});
|
|
28
|
-
it("treats different keys as independent entries", async () => {
|
|
29
|
-
const cache = new DiskCache({ dir });
|
|
30
|
-
await cache.set("a", 1);
|
|
31
|
-
await cache.set("b", 2);
|
|
32
|
-
await expect(cache.get("a")).resolves.toBe(1);
|
|
33
|
-
await expect(cache.get("b")).resolves.toBe(2);
|
|
34
|
-
});
|
|
35
|
-
it("returns undefined once the entry is older than ttlMs", async () => {
|
|
36
|
-
const cache = new DiskCache({ dir, ttlMs: 1 });
|
|
37
|
-
await cache.set("stale", { v: 1 });
|
|
38
|
-
// Wait long enough to outlast the 1 ms TTL.
|
|
39
|
-
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
40
|
-
await expect(cache.get("stale")).resolves.toBeUndefined();
|
|
41
|
-
});
|
|
42
|
-
it("returns undefined when the cache file contains invalid JSON", async () => {
|
|
43
|
-
const cache = new DiskCache({ dir });
|
|
44
|
-
const path = cache.pathFor("broken");
|
|
45
|
-
await writeFile(path, "{not json", "utf8");
|
|
46
|
-
await expect(cache.get("broken")).resolves.toBeUndefined();
|
|
47
|
-
});
|
|
48
|
-
it("derives different paths for different keys", () => {
|
|
49
|
-
const cache = new DiskCache({ dir });
|
|
50
|
-
expect(cache.pathFor("a")).not.toBe(cache.pathFor("b"));
|
|
51
|
-
});
|
|
52
|
-
it("refuses to remove directories outside the test cache parent", async () => {
|
|
53
|
-
await expect(removeTestCacheDir(process.cwd())).rejects.toThrow(/non-test cache directory/);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
//# sourceMappingURL=cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the Azure Retail Prices HTTP client.
|
|
3
|
-
*
|
|
4
|
-
* The client is exercised against an in-process fake `fetch` so the suite
|
|
5
|
-
* never reaches the real `prices.azure.com` endpoint. A temp directory is
|
|
6
|
-
* used as cache so each test starts from a cold state.
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=client.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/client.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the Azure Retail Prices HTTP client.
|
|
3
|
-
*
|
|
4
|
-
* The client is exercised against an in-process fake `fetch` so the suite
|
|
5
|
-
* never reaches the real `prices.azure.com` endpoint. A temp directory is
|
|
6
|
-
* used as cache so each test starts from a cold state.
|
|
7
|
-
*/
|
|
8
|
-
import { readFile } from "node:fs/promises";
|
|
9
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
10
|
-
import { DiskCache } from "../cache.js";
|
|
11
|
-
import { PricingClient } from "../client.js";
|
|
12
|
-
import { makeTestCacheDir, removeTestCacheDir } from "../test-cache-dir.js";
|
|
13
|
-
const FIXTURE_PATH = new URL("./fixtures/vm-b2s-westeurope.json", import.meta.url);
|
|
14
|
-
async function loadFixture() {
|
|
15
|
-
const raw = await readFile(FIXTURE_PATH, "utf8");
|
|
16
|
-
return JSON.parse(raw);
|
|
17
|
-
}
|
|
18
|
-
function makeOkFetch(body) {
|
|
19
|
-
return vi.fn(async () => ({
|
|
20
|
-
json: async () => body,
|
|
21
|
-
ok: true,
|
|
22
|
-
status: 200,
|
|
23
|
-
statusText: "OK",
|
|
24
|
-
}));
|
|
25
|
-
}
|
|
26
|
-
describe("PricingClient.query", () => {
|
|
27
|
-
let dir;
|
|
28
|
-
beforeEach(async () => {
|
|
29
|
-
dir = await makeTestCacheDir("client");
|
|
30
|
-
});
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await removeTestCacheDir(dir);
|
|
33
|
-
});
|
|
34
|
-
it("returns the items from a single page response", async () => {
|
|
35
|
-
const body = await loadFixture();
|
|
36
|
-
const fetchImpl = makeOkFetch(body);
|
|
37
|
-
const client = new PricingClient({
|
|
38
|
-
cache: new DiskCache({ dir }),
|
|
39
|
-
fetch: fetchImpl,
|
|
40
|
-
});
|
|
41
|
-
const items = await client.query("serviceName eq 'Virtual Machines'");
|
|
42
|
-
expect(items).toHaveLength(2);
|
|
43
|
-
expect(items[0].armSkuName).toBe("Standard_B2s");
|
|
44
|
-
expect(items[0].unitPrice).toBe(0.057);
|
|
45
|
-
expect(fetchImpl).toHaveBeenCalledTimes(1);
|
|
46
|
-
});
|
|
47
|
-
it("includes the filter, currency, and api-version in the request URL", async () => {
|
|
48
|
-
const body = await loadFixture();
|
|
49
|
-
const fetchImpl = makeOkFetch(body);
|
|
50
|
-
const client = new PricingClient({
|
|
51
|
-
cache: new DiskCache({ dir }),
|
|
52
|
-
currencyCode: "EUR",
|
|
53
|
-
fetch: fetchImpl,
|
|
54
|
-
});
|
|
55
|
-
await client.query("serviceName eq 'Virtual Machines'");
|
|
56
|
-
const url = fetchImpl.mock
|
|
57
|
-
.calls[0][0];
|
|
58
|
-
expect(url).toContain("prices.azure.com/api/retail/prices");
|
|
59
|
-
expect(url).toContain("currencyCode=EUR");
|
|
60
|
-
expect(url).toContain("api-version=");
|
|
61
|
-
// URLSearchParams encodes spaces as `+` (form-urlencoded), so we
|
|
62
|
-
// convert them back before decoding the filter expression.
|
|
63
|
-
const decoded = decodeURIComponent(url.replace(/\+/g, " "));
|
|
64
|
-
expect(decoded).toContain("$filter=serviceName eq 'Virtual Machines'");
|
|
65
|
-
});
|
|
66
|
-
it("follows NextPageLink across multiple pages", async () => {
|
|
67
|
-
const page1 = {
|
|
68
|
-
Count: 1,
|
|
69
|
-
Items: [
|
|
70
|
-
{
|
|
71
|
-
currencyCode: "EUR",
|
|
72
|
-
retailPrice: 1,
|
|
73
|
-
type: "Consumption",
|
|
74
|
-
unitOfMeasure: "1 Hour",
|
|
75
|
-
unitPrice: 1,
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
NextPageLink: "https://prices.azure.com/api/retail/prices?next=2",
|
|
79
|
-
};
|
|
80
|
-
const page2 = {
|
|
81
|
-
Count: 1,
|
|
82
|
-
Items: [
|
|
83
|
-
{
|
|
84
|
-
currencyCode: "EUR",
|
|
85
|
-
retailPrice: 2,
|
|
86
|
-
type: "Consumption",
|
|
87
|
-
unitOfMeasure: "1 Hour",
|
|
88
|
-
unitPrice: 2,
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
NextPageLink: null,
|
|
92
|
-
};
|
|
93
|
-
const fetchImpl = vi
|
|
94
|
-
.fn()
|
|
95
|
-
.mockResolvedValueOnce({
|
|
96
|
-
json: async () => page1,
|
|
97
|
-
ok: true,
|
|
98
|
-
status: 200,
|
|
99
|
-
statusText: "OK",
|
|
100
|
-
})
|
|
101
|
-
.mockResolvedValueOnce({
|
|
102
|
-
json: async () => page2,
|
|
103
|
-
ok: true,
|
|
104
|
-
status: 200,
|
|
105
|
-
statusText: "OK",
|
|
106
|
-
});
|
|
107
|
-
const client = new PricingClient({
|
|
108
|
-
cache: new DiskCache({ dir }),
|
|
109
|
-
fetch: fetchImpl,
|
|
110
|
-
});
|
|
111
|
-
const items = await client.query("anything");
|
|
112
|
-
expect(items.map((i) => i.unitPrice)).toEqual([1, 2]);
|
|
113
|
-
expect(fetchImpl).toHaveBeenCalledTimes(2);
|
|
114
|
-
});
|
|
115
|
-
it("serves a cached response without hitting the network on the second call", async () => {
|
|
116
|
-
const body = await loadFixture();
|
|
117
|
-
const fetchImpl = makeOkFetch(body);
|
|
118
|
-
const cache = new DiskCache({ dir });
|
|
119
|
-
const client = new PricingClient({ cache, fetch: fetchImpl });
|
|
120
|
-
const first = await client.query("filter-a");
|
|
121
|
-
const second = await client.query("filter-a");
|
|
122
|
-
expect(first).toEqual(second);
|
|
123
|
-
expect(fetchImpl).toHaveBeenCalledTimes(1);
|
|
124
|
-
});
|
|
125
|
-
it("keeps cache entries scoped by currency", async () => {
|
|
126
|
-
const body = await loadFixture();
|
|
127
|
-
const fetchImpl = makeOkFetch(body);
|
|
128
|
-
const cache = new DiskCache({ dir });
|
|
129
|
-
const eur = new PricingClient({
|
|
130
|
-
cache,
|
|
131
|
-
currencyCode: "EUR",
|
|
132
|
-
fetch: fetchImpl,
|
|
133
|
-
});
|
|
134
|
-
const usd = new PricingClient({
|
|
135
|
-
cache,
|
|
136
|
-
currencyCode: "USD",
|
|
137
|
-
fetch: fetchImpl,
|
|
138
|
-
});
|
|
139
|
-
await eur.query("same-filter");
|
|
140
|
-
await usd.query("same-filter");
|
|
141
|
-
// Two distinct cache keys → two API round-trips, no cross-contamination.
|
|
142
|
-
expect(fetchImpl).toHaveBeenCalledTimes(2);
|
|
143
|
-
});
|
|
144
|
-
it("throws a descriptive error on a non-2xx response", async () => {
|
|
145
|
-
const fetchImpl = vi.fn(async () => ({
|
|
146
|
-
json: async () => ({}),
|
|
147
|
-
ok: false,
|
|
148
|
-
status: 503,
|
|
149
|
-
statusText: "Service Unavailable",
|
|
150
|
-
}));
|
|
151
|
-
const client = new PricingClient({
|
|
152
|
-
cache: new DiskCache({ dir }),
|
|
153
|
-
fetch: fetchImpl,
|
|
154
|
-
});
|
|
155
|
-
await expect(client.query("x")).rejects.toThrow(/503/);
|
|
156
|
-
});
|
|
157
|
-
it("throws when the response body fails schema validation", async () => {
|
|
158
|
-
const fetchImpl = makeOkFetch({ wrong: "shape" });
|
|
159
|
-
const client = new PricingClient({
|
|
160
|
-
cache: new DiskCache({ dir }),
|
|
161
|
-
fetch: fetchImpl,
|
|
162
|
-
});
|
|
163
|
-
await expect(client.query("x")).rejects.toThrow();
|
|
164
|
-
});
|
|
165
|
-
it("throws a descriptive error when the response body is not JSON", async () => {
|
|
166
|
-
const fetchImpl = vi.fn(async () => ({
|
|
167
|
-
json: async () => {
|
|
168
|
-
throw new SyntaxError("Unexpected token");
|
|
169
|
-
},
|
|
170
|
-
ok: true,
|
|
171
|
-
status: 200,
|
|
172
|
-
statusText: "OK",
|
|
173
|
-
}));
|
|
174
|
-
const client = new PricingClient({
|
|
175
|
-
cache: new DiskCache({ dir }),
|
|
176
|
-
fetch: fetchImpl,
|
|
177
|
-
});
|
|
178
|
-
await expect(client.query("x")).rejects.toThrow(/invalid JSON/);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
//# sourceMappingURL=client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/client.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAIzE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,mCAAmC,EACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB,CAAC;AAEF,KAAK,UAAU,WAAW;IACxB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACtB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,GAAW,CAAC;IAChB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,GAAG,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEtE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAExD,MAAM,GAAG,GAAI,SAAsC,CAAC,IAAI;aACrD,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACtC,iEAAiE;QACjE,2DAA2D;QAC3D,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,CAAC;YACR,KAAK,EAAE;gBACL;oBACE,YAAY,EAAE,KAAK;oBACnB,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,aAAa,EAAE,QAAQ;oBACvB,SAAS,EAAE,CAAC;iBACb;aACF;YACD,YAAY,EAAE,mDAAmD;SAClE,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,CAAC;YACR,KAAK,EAAE;gBACL;oBACE,YAAY,EAAE,KAAK;oBACnB,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,aAAa,EAAE,QAAQ;oBACvB,SAAS,EAAE,CAAC;iBACb;aACF;YACD,YAAY,EAAE,IAAI;SACnB,CAAC;QACF,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAa;aACf,qBAAqB,CAAC;YACrB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YACvB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;SACjB,CAAC;aACD,qBAAqB,CAAC;YACrB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YACvB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE7C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;YAC5B,KAAK;YACL,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;YAC5B,KAAK;YACL,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/B,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE/B,yEAAyE;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,SAAS,GAAc,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,qBAAqB;SAClC,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,SAAS,GAAc,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;YAC5C,CAAC;YACD,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,KAAK,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-service.test.d.ts","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/pricing-service.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|