@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.
Files changed (107) hide show
  1. package/dist/azure/pricing/pricing-service.d.ts.map +1 -1
  2. package/dist/azure/pricing/pricing-service.js +6 -1
  3. package/dist/azure/pricing/pricing-service.js.map +1 -1
  4. package/dist/azure/pricing/schema.d.ts.map +1 -1
  5. package/dist/azure/pricing/schema.js +22 -14
  6. package/dist/azure/pricing/schema.js.map +1 -1
  7. package/dist/azure/resources/app-service.d.ts.map +1 -1
  8. package/dist/azure/resources/app-service.js +2 -2
  9. package/dist/azure/resources/app-service.js.map +1 -1
  10. package/dist/azure/resources/container-app.d.ts.map +1 -1
  11. package/dist/azure/resources/container-app.js +1 -1
  12. package/dist/azure/resources/container-app.js.map +1 -1
  13. package/dist/azure/resources/disk.js +3 -1
  14. package/dist/azure/resources/disk.js.map +1 -1
  15. package/dist/azure/resources/nic.js +3 -1
  16. package/dist/azure/resources/nic.js.map +1 -1
  17. package/dist/azure/resources/private-endpoint.d.ts.map +1 -1
  18. package/dist/azure/resources/private-endpoint.js +1 -1
  19. package/dist/azure/resources/private-endpoint.js.map +1 -1
  20. package/dist/azure/resources/public-ip.d.ts.map +1 -1
  21. package/dist/azure/resources/public-ip.js +4 -2
  22. package/dist/azure/resources/public-ip.js.map +1 -1
  23. package/dist/azure/resources/static-web-app.d.ts.map +1 -1
  24. package/dist/azure/resources/static-web-app.js +1 -1
  25. package/dist/azure/resources/static-web-app.js.map +1 -1
  26. package/dist/azure/resources/vm.js +6 -2
  27. package/dist/azure/resources/vm.js.map +1 -1
  28. package/dist/azure/utils.d.ts.map +1 -1
  29. package/dist/azure/utils.js +7 -2
  30. package/dist/azure/utils.js.map +1 -1
  31. package/package.json +1 -8
  32. package/src/azure/pricing/__tests__/schema.test.ts +30 -0
  33. package/src/azure/pricing/pricing-service.ts +6 -3
  34. package/src/azure/pricing/schema.ts +22 -14
  35. package/src/azure/resources/app-service.ts +4 -2
  36. package/src/azure/resources/container-app.ts +2 -1
  37. package/src/azure/resources/disk.ts +3 -3
  38. package/src/azure/resources/nic.ts +3 -3
  39. package/src/azure/resources/private-endpoint.ts +2 -1
  40. package/src/azure/resources/public-ip.ts +5 -4
  41. package/src/azure/resources/static-web-app.ts +2 -1
  42. package/src/azure/resources/vm.ts +6 -6
  43. package/src/azure/utils.ts +8 -2
  44. package/dist/__tests__/finding.test.d.ts +0 -17
  45. package/dist/__tests__/finding.test.d.ts.map +0 -1
  46. package/dist/__tests__/finding.test.js +0 -146
  47. package/dist/__tests__/finding.test.js.map +0 -1
  48. package/dist/azure/__tests__/analyzer-tags.test.d.ts +0 -8
  49. package/dist/azure/__tests__/analyzer-tags.test.d.ts.map +0 -1
  50. package/dist/azure/__tests__/analyzer-tags.test.js +0 -70
  51. package/dist/azure/__tests__/analyzer-tags.test.js.map +0 -1
  52. package/dist/azure/__tests__/azqr.test.d.ts +0 -13
  53. package/dist/azure/__tests__/azqr.test.d.ts.map +0 -1
  54. package/dist/azure/__tests__/azqr.test.js +0 -177
  55. package/dist/azure/__tests__/azqr.test.js.map +0 -1
  56. package/dist/azure/__tests__/config.test.d.ts +0 -9
  57. package/dist/azure/__tests__/config.test.d.ts.map +0 -1
  58. package/dist/azure/__tests__/config.test.js +0 -102
  59. package/dist/azure/__tests__/config.test.js.map +0 -1
  60. package/dist/azure/__tests__/report.test.d.ts +0 -9
  61. package/dist/azure/__tests__/report.test.d.ts.map +0 -1
  62. package/dist/azure/__tests__/report.test.js +0 -191
  63. package/dist/azure/__tests__/report.test.js.map +0 -1
  64. package/dist/azure/__tests__/utils.test.d.ts +0 -15
  65. package/dist/azure/__tests__/utils.test.d.ts.map +0 -1
  66. package/dist/azure/__tests__/utils.test.js +0 -181
  67. package/dist/azure/__tests__/utils.test.js.map +0 -1
  68. package/dist/azure/analyzers/__tests__/advisor.test.d.ts +0 -9
  69. package/dist/azure/analyzers/__tests__/advisor.test.d.ts.map +0 -1
  70. package/dist/azure/analyzers/__tests__/advisor.test.js +0 -314
  71. package/dist/azure/analyzers/__tests__/advisor.test.js.map +0 -1
  72. package/dist/azure/pricing/__tests__/cache.test.d.ts +0 -8
  73. package/dist/azure/pricing/__tests__/cache.test.d.ts.map +0 -1
  74. package/dist/azure/pricing/__tests__/cache.test.js +0 -56
  75. package/dist/azure/pricing/__tests__/cache.test.js.map +0 -1
  76. package/dist/azure/pricing/__tests__/client.test.d.ts +0 -9
  77. package/dist/azure/pricing/__tests__/client.test.d.ts.map +0 -1
  78. package/dist/azure/pricing/__tests__/client.test.js +0 -181
  79. package/dist/azure/pricing/__tests__/client.test.js.map +0 -1
  80. package/dist/azure/pricing/__tests__/pricing-service.test.d.ts +0 -6
  81. package/dist/azure/pricing/__tests__/pricing-service.test.d.ts.map +0 -1
  82. package/dist/azure/pricing/__tests__/pricing-service.test.js +0 -283
  83. package/dist/azure/pricing/__tests__/pricing-service.test.js.map +0 -1
  84. package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts +0 -5
  85. package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts.map +0 -1
  86. package/dist/azure/pricing/resolvers/__tests__/app-service.test.js +0 -137
  87. package/dist/azure/pricing/resolvers/__tests__/app-service.test.js.map +0 -1
  88. package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts +0 -5
  89. package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts.map +0 -1
  90. package/dist/azure/pricing/resolvers/__tests__/disk.test.js +0 -160
  91. package/dist/azure/pricing/resolvers/__tests__/disk.test.js.map +0 -1
  92. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts +0 -5
  93. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts.map +0 -1
  94. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js +0 -113
  95. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js.map +0 -1
  96. package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts +0 -9
  97. package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts.map +0 -1
  98. package/dist/azure/pricing/resolvers/__tests__/vm.test.js +0 -204
  99. package/dist/azure/pricing/resolvers/__tests__/vm.test.js.map +0 -1
  100. package/dist/azure/resources/__tests__/app-service.test.d.ts +0 -5
  101. package/dist/azure/resources/__tests__/app-service.test.d.ts.map +0 -1
  102. package/dist/azure/resources/__tests__/app-service.test.js +0 -105
  103. package/dist/azure/resources/__tests__/app-service.test.js.map +0 -1
  104. package/dist/azure/resources/__tests__/storage.test.d.ts +0 -11
  105. package/dist/azure/resources/__tests__/storage.test.d.ts.map +0 -1
  106. package/dist/azure/resources/__tests__/storage.test.js +0 -99
  107. package/dist/azure/resources/__tests__/storage.test.js.map +0 -1
@@ -1,283 +0,0 @@
1
- /**
2
- * Tests for the PricingService façade — covers memoization and error
3
- * swallowing. The underlying resolvers are exercised in their own tests.
4
- */
5
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
- import { DiskCache } from "../cache.js";
7
- import { PricingClient } from "../client.js";
8
- import { PricingService } from "../pricing-service.js";
9
- import { makeTestCacheDir, removeTestCacheDir } from "../test-cache-dir.js";
10
- function makeFetch(body) {
11
- const spy = vi.fn().mockResolvedValue({
12
- json: async () => body,
13
- ok: true,
14
- status: 200,
15
- statusText: "OK",
16
- });
17
- return { fetch: spy, spy };
18
- }
19
- let dir;
20
- beforeEach(async () => {
21
- dir = await makeTestCacheDir("pricing-service");
22
- });
23
- afterEach(async () => {
24
- await removeTestCacheDir(dir);
25
- });
26
- describe("PricingService", () => {
27
- it("memoizes identical VM lookups within the same instance", async () => {
28
- const body = {
29
- Items: [
30
- {
31
- armRegionName: "westeurope",
32
- armSkuName: "Standard_B2s",
33
- currencyCode: "EUR",
34
- productName: "Virtual Machines BS Series",
35
- retailPrice: 0.05,
36
- skuName: "B2s",
37
- type: "Consumption",
38
- unitOfMeasure: "1 Hour",
39
- unitPrice: 0.05,
40
- },
41
- ],
42
- NextPageLink: null,
43
- };
44
- const { fetch, spy } = makeFetch(body);
45
- const client = new PricingClient({
46
- cache: new DiskCache({ dir }),
47
- fetch,
48
- });
49
- const service = new PricingService(client);
50
- const [a, b] = await Promise.all([
51
- service.resolveVm({
52
- armRegionName: "westeurope",
53
- armSkuName: "Standard_B2s",
54
- }),
55
- service.resolveVm({
56
- armRegionName: "westeurope",
57
- armSkuName: "Standard_B2s",
58
- }),
59
- ]);
60
- expect(a).toEqual(b);
61
- // Only one underlying fetch despite two concurrent calls.
62
- expect(spy).toHaveBeenCalledTimes(1);
63
- });
64
- it("returns undefined and does not throw when the resolver errors", async () => {
65
- const client = new PricingClient({
66
- cache: new DiskCache({ dir }),
67
- fetch: vi.fn().mockRejectedValue(new Error("boom")),
68
- });
69
- const service = new PricingService(client);
70
- const result = await service.resolveVm({
71
- armRegionName: "westeurope",
72
- armSkuName: "Standard_B2s",
73
- });
74
- expect(result).toBeUndefined();
75
- });
76
- it("scopes the in-memory memo by os hint", async () => {
77
- const body = {
78
- Items: [
79
- {
80
- armRegionName: "westeurope",
81
- armSkuName: "Standard_B2s",
82
- currencyCode: "EUR",
83
- productName: "Virtual Machines BS Series",
84
- retailPrice: 0.05,
85
- skuName: "B2s",
86
- type: "Consumption",
87
- unitOfMeasure: "1 Hour",
88
- unitPrice: 0.05,
89
- },
90
- {
91
- armRegionName: "westeurope",
92
- armSkuName: "Standard_B2s",
93
- currencyCode: "EUR",
94
- productName: "Virtual Machines BS Series Windows",
95
- retailPrice: 0.09,
96
- skuName: "B2s",
97
- type: "Consumption",
98
- unitOfMeasure: "1 Hour",
99
- unitPrice: 0.09,
100
- },
101
- ],
102
- NextPageLink: null,
103
- };
104
- const { fetch, spy } = makeFetch(body);
105
- const client = new PricingClient({
106
- cache: new DiskCache({ dir }),
107
- fetch,
108
- });
109
- const service = new PricingService(client);
110
- const linux = await service.resolveVm({
111
- armRegionName: "westeurope",
112
- armSkuName: "Standard_B2s",
113
- os: "linux",
114
- });
115
- const windows = await service.resolveVm({
116
- armRegionName: "westeurope",
117
- armSkuName: "Standard_B2s",
118
- os: "windows",
119
- });
120
- expect(linux?.amount).toBeLessThan(windows?.amount ?? 0);
121
- // Same underlying filter, served from DiskCache — one fetch only.
122
- expect(spy).toHaveBeenCalledTimes(1);
123
- });
124
- });
125
- describe("PricingService disk memoization", () => {
126
- it("memoizes identical disk lookups within the same instance", async () => {
127
- const body = {
128
- Items: [
129
- {
130
- armRegionName: "westeurope",
131
- currencyCode: "EUR",
132
- productName: "Premium SSD Managed Disks",
133
- retailPrice: 19.71,
134
- skuName: "P10 LRS",
135
- type: "Consumption",
136
- unitOfMeasure: "1/Month",
137
- unitPrice: 19.71,
138
- },
139
- ],
140
- NextPageLink: null,
141
- };
142
- const { fetch, spy } = makeFetch(body);
143
- const client = new PricingClient({
144
- cache: new DiskCache({ dir }),
145
- fetch,
146
- });
147
- const service = new PricingService(client);
148
- const [a, b] = await Promise.all([
149
- service.resolveDisk({
150
- armRegionName: "westeurope",
151
- diskSizeGiB: 128,
152
- sku: "Premium_LRS",
153
- }),
154
- service.resolveDisk({
155
- armRegionName: "westeurope",
156
- diskSizeGiB: 128,
157
- sku: "Premium_LRS",
158
- }),
159
- ]);
160
- expect(a).toEqual(b);
161
- expect(spy).toHaveBeenCalledTimes(1);
162
- });
163
- it("memoizes disk lookups with display and ARM region names as the same key", async () => {
164
- const body = {
165
- Items: [
166
- {
167
- armRegionName: "westeurope",
168
- currencyCode: "EUR",
169
- productName: "Premium SSD Managed Disks",
170
- retailPrice: 19.71,
171
- skuName: "P10 LRS",
172
- type: "Consumption",
173
- unitOfMeasure: "1/Month",
174
- unitPrice: 19.71,
175
- },
176
- ],
177
- NextPageLink: null,
178
- };
179
- const { fetch, spy } = makeFetch(body);
180
- const client = new PricingClient({
181
- cache: new DiskCache({ dir }),
182
- fetch,
183
- });
184
- const service = new PricingService(client);
185
- const [a, b] = await Promise.all([
186
- service.resolveDisk({
187
- armRegionName: "West Europe",
188
- diskSizeGiB: 128,
189
- sku: "Premium_LRS",
190
- }),
191
- service.resolveDisk({
192
- armRegionName: "westeurope",
193
- diskSizeGiB: 128,
194
- sku: "Premium_LRS",
195
- }),
196
- ]);
197
- expect(a).toEqual(b);
198
- expect(spy).toHaveBeenCalledTimes(1);
199
- });
200
- });
201
- describe("PricingService App Service Plan memoization", () => {
202
- it("memoizes identical App Service Plan lookups within the same instance", async () => {
203
- const body = {
204
- Items: [
205
- {
206
- armRegionName: "westeurope",
207
- currencyCode: "EUR",
208
- meterName: "S1 App",
209
- productName: "Azure App Service Standard Plan - Linux",
210
- retailPrice: 0.08337,
211
- skuName: "S1",
212
- type: "Consumption",
213
- unitOfMeasure: "1 Hour",
214
- unitPrice: 0.08337,
215
- },
216
- ],
217
- NextPageLink: null,
218
- };
219
- const { fetch, spy } = makeFetch(body);
220
- const client = new PricingClient({
221
- cache: new DiskCache({ dir }),
222
- fetch,
223
- });
224
- const service = new PricingService(client);
225
- const [a, b] = await Promise.all([
226
- service.resolveAppServicePlan({
227
- armRegionName: "westeurope",
228
- os: "linux",
229
- skuName: "S1",
230
- workerCount: 1,
231
- }),
232
- service.resolveAppServicePlan({
233
- armRegionName: "westeurope",
234
- os: "linux",
235
- skuName: "S1",
236
- workerCount: 1,
237
- }),
238
- ]);
239
- expect(a).toEqual(b);
240
- expect(spy).toHaveBeenCalledTimes(1);
241
- });
242
- it("memoizes App Service Plan lookups by canonical region and worker count", async () => {
243
- const body = {
244
- Items: [
245
- {
246
- armRegionName: "westeurope",
247
- currencyCode: "EUR",
248
- meterName: "S1 App",
249
- productName: "Azure App Service Standard Plan - Linux",
250
- retailPrice: 0.08337,
251
- skuName: "S1",
252
- type: "Consumption",
253
- unitOfMeasure: "1 Hour",
254
- unitPrice: 0.08337,
255
- },
256
- ],
257
- NextPageLink: null,
258
- };
259
- const { fetch, spy } = makeFetch(body);
260
- const client = new PricingClient({
261
- cache: new DiskCache({ dir }),
262
- fetch,
263
- });
264
- const service = new PricingService(client);
265
- const [a, b] = await Promise.all([
266
- service.resolveAppServicePlan({
267
- armRegionName: "West Europe",
268
- os: "linux",
269
- skuName: "S1",
270
- workerCount: 1.2,
271
- }),
272
- service.resolveAppServicePlan({
273
- armRegionName: "westeurope",
274
- os: "linux",
275
- skuName: "S1",
276
- workerCount: 2,
277
- }),
278
- ]);
279
- expect(a).toEqual(b);
280
- expect(spy).toHaveBeenCalledTimes(1);
281
- });
282
- });
283
- //# sourceMappingURL=pricing-service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pricing-service.test.js","sourceRoot":"","sources":["../../../../src/azure/pricing/__tests__/pricing-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for the App Service Plan Retail Prices resolver.
3
- */
4
- export {};
5
- //# sourceMappingURL=app-service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/azure/pricing/resolvers/__tests__/app-service.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,137 +0,0 @@
1
- /**
2
- * Tests for the App Service Plan Retail Prices resolver.
3
- */
4
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- import { DiskCache } from "../../cache.js";
6
- import { PricingClient } from "../../client.js";
7
- import { makeTestCacheDir, removeTestCacheDir } from "../../test-cache-dir.js";
8
- import { resolveAppServicePlanMonthlyPrice } from "../app-service.js";
9
- import { HOURS_PER_MONTH } from "../vm.js";
10
- function makeFetch(body) {
11
- return vi.fn().mockResolvedValue({
12
- json: async () => body,
13
- ok: true,
14
- status: 200,
15
- statusText: "OK",
16
- });
17
- }
18
- let dir;
19
- beforeEach(async () => {
20
- dir = await makeTestCacheDir("app-service-resolver");
21
- });
22
- afterEach(async () => {
23
- await removeTestCacheDir(dir);
24
- });
25
- describe("resolveAppServicePlanMonthlyPrice", () => {
26
- it("returns the monthly cost for the matching Linux plan SKU and worker count", async () => {
27
- const body = {
28
- Items: [
29
- {
30
- armRegionName: "westeurope",
31
- currencyCode: "EUR",
32
- meterName: "S1 App",
33
- productName: "Azure App Service Standard Plan",
34
- retailPrice: 0.087758,
35
- skuName: "S1",
36
- type: "Consumption",
37
- unitOfMeasure: "1 Hour",
38
- unitPrice: 0.087758,
39
- },
40
- {
41
- armRegionName: "westeurope",
42
- currencyCode: "EUR",
43
- meterName: "S1 App",
44
- productName: "Azure App Service Standard Plan - Linux",
45
- retailPrice: 0.08337,
46
- skuName: "S1",
47
- type: "Consumption",
48
- unitOfMeasure: "1 Hour",
49
- unitPrice: 0.08337,
50
- },
51
- ],
52
- NextPageLink: null,
53
- };
54
- const client = new PricingClient({
55
- cache: new DiskCache({ dir }),
56
- fetch: makeFetch(body),
57
- });
58
- const money = await resolveAppServicePlanMonthlyPrice(client, {
59
- armRegionName: "westeurope",
60
- os: "linux",
61
- skuName: "S1",
62
- workerCount: 2,
63
- });
64
- expect(money).toEqual({
65
- amount: Math.round(0.08337 * HOURS_PER_MONTH * 2 * 100) / 100,
66
- currency: "EUR",
67
- });
68
- });
69
- it("matches Retail Prices SKU names with inconsistent spacing", async () => {
70
- const body = {
71
- Items: [
72
- {
73
- armRegionName: "westeurope",
74
- currencyCode: "EUR",
75
- meterName: "P2 v3 App",
76
- productName: "Azure App Service Premium v3 Plan",
77
- retailPrice: 0.593243,
78
- skuName: "P2 v3",
79
- type: "Consumption",
80
- unitOfMeasure: "1 Hour",
81
- unitPrice: 0.593243,
82
- },
83
- ],
84
- NextPageLink: null,
85
- };
86
- const client = new PricingClient({
87
- cache: new DiskCache({ dir }),
88
- fetch: makeFetch(body),
89
- });
90
- const money = await resolveAppServicePlanMonthlyPrice(client, {
91
- armRegionName: "West Europe",
92
- os: "windows",
93
- skuName: "P2v3",
94
- });
95
- expect(money?.amount).toBeCloseTo(0.593243 * HOURS_PER_MONTH, 2);
96
- });
97
- it("ignores non-plan and non-consumption meters", async () => {
98
- const body = {
99
- Items: [
100
- {
101
- armRegionName: "westeurope",
102
- currencyCode: "EUR",
103
- meterName: "Standard Bandwidth Usage",
104
- productName: "Static Web Apps",
105
- retailPrice: 0.175516,
106
- skuName: "Standard",
107
- type: "Consumption",
108
- unitOfMeasure: "1 GB",
109
- unitPrice: 0.175516,
110
- },
111
- {
112
- armRegionName: "westeurope",
113
- currencyCode: "EUR",
114
- meterName: "S1 App",
115
- productName: "Azure App Service Standard Plan",
116
- reservationTerm: "1 Year",
117
- retailPrice: 640,
118
- skuName: "S1",
119
- type: "Reservation",
120
- unitOfMeasure: "1 Hour",
121
- unitPrice: 640,
122
- },
123
- ],
124
- NextPageLink: null,
125
- };
126
- const client = new PricingClient({
127
- cache: new DiskCache({ dir }),
128
- fetch: makeFetch(body),
129
- });
130
- const money = await resolveAppServicePlanMonthlyPrice(client, {
131
- armRegionName: "westeurope",
132
- skuName: "S1",
133
- });
134
- expect(money).toBeUndefined();
135
- });
136
- });
137
- //# sourceMappingURL=app-service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-service.test.js","sourceRoot":"","sources":["../../../../../src/azure/pricing/resolvers/__tests__/app-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for the Managed Disk Retail Prices resolver.
3
- */
4
- export {};
5
- //# sourceMappingURL=disk.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"disk.test.d.ts","sourceRoot":"","sources":["../../../../../src/azure/pricing/resolvers/__tests__/disk.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,160 +0,0 @@
1
- /**
2
- * Tests for the Managed Disk Retail Prices resolver.
3
- */
4
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- import { DiskCache } from "../../cache.js";
6
- import { PricingClient } from "../../client.js";
7
- import { makeTestCacheDir, removeTestCacheDir } from "../../test-cache-dir.js";
8
- import { pickTier, resolveDiskMonthlyPrice } from "../disk.js";
9
- function makeFetch(body) {
10
- const spy = vi.fn().mockResolvedValue({
11
- json: async () => body,
12
- ok: true,
13
- status: 200,
14
- statusText: "OK",
15
- });
16
- return { fetch: spy, spy };
17
- }
18
- let dir;
19
- beforeEach(async () => {
20
- dir = await makeTestCacheDir("disk-resolver");
21
- });
22
- afterEach(async () => {
23
- await removeTestCacheDir(dir);
24
- });
25
- describe("pickTier", () => {
26
- it.each([
27
- [1, 1],
28
- [4, 1],
29
- [5, 2],
30
- [128, 10],
31
- [129, 15],
32
- [1024, 30],
33
- [32768, 80],
34
- ])("maps %i GiB to tier %i", (sizeGiB, tier) => {
35
- expect(pickTier(sizeGiB)).toBe(tier);
36
- });
37
- it("returns undefined for sizes above the largest tier", () => {
38
- expect(pickTier(32769)).toBeUndefined();
39
- });
40
- });
41
- describe("resolveDiskMonthlyPrice", () => {
42
- it("resolves the monthly price for a Premium_LRS P10 disk", async () => {
43
- const body = {
44
- Items: [
45
- {
46
- armRegionName: "westeurope",
47
- currencyCode: "EUR",
48
- meterName: "P10 LRS Disk",
49
- productName: "Premium SSD Managed Disks",
50
- retailPrice: 19.71,
51
- skuName: "P10 LRS",
52
- type: "Consumption",
53
- unitOfMeasure: "1/Month",
54
- unitPrice: 19.71,
55
- },
56
- ],
57
- NextPageLink: null,
58
- };
59
- const { fetch, spy } = makeFetch(body);
60
- const client = new PricingClient({
61
- cache: new DiskCache({ dir }),
62
- fetch,
63
- });
64
- const money = await resolveDiskMonthlyPrice(client, {
65
- armRegionName: "westeurope",
66
- diskSizeGiB: 128,
67
- sku: "Premium_LRS",
68
- });
69
- expect(money).toEqual({ amount: 19.71, currency: "EUR" });
70
- expect(spy).toHaveBeenCalledTimes(1);
71
- // The OData filter must target the tier-derived skuName, not the raw
72
- // managed-disk SKU. URLSearchParams encodes spaces as `+`.
73
- const url = String(spy.mock.calls[0]?.[0]);
74
- expect(url).toContain("skuName+eq+%27P10+LRS%27");
75
- expect(url).toContain("productName+eq+%27Premium+SSD+Managed+Disks%27");
76
- });
77
- it("uses the ZRS product/replication for Premium_ZRS", async () => {
78
- const body = {
79
- Items: [
80
- {
81
- armRegionName: "westeurope",
82
- currencyCode: "EUR",
83
- meterName: "P10 ZRS Disk",
84
- productName: "Premium SSD Managed Disks",
85
- retailPrice: 24.64,
86
- skuName: "P10 ZRS",
87
- type: "Consumption",
88
- unitOfMeasure: "1/Month",
89
- unitPrice: 24.64,
90
- },
91
- ],
92
- NextPageLink: null,
93
- };
94
- const { fetch, spy } = makeFetch(body);
95
- const client = new PricingClient({
96
- cache: new DiskCache({ dir }),
97
- fetch,
98
- });
99
- const money = await resolveDiskMonthlyPrice(client, {
100
- armRegionName: "westeurope",
101
- diskSizeGiB: 128,
102
- sku: "Premium_ZRS",
103
- });
104
- expect(money).toEqual({ amount: 24.64, currency: "EUR" });
105
- const url = String(spy.mock.calls[0]?.[0]);
106
- expect(url).toContain("skuName+eq+%27P10+ZRS%27");
107
- });
108
- it("returns undefined when the response has no matching entry", async () => {
109
- const body = {
110
- Items: [
111
- {
112
- armRegionName: "westeurope",
113
- currencyCode: "EUR",
114
- // Per-GB-month item; resolver must skip it because of unitOfMeasure.
115
- productName: "Premium SSD Managed Disks",
116
- retailPrice: 0.1,
117
- skuName: "P10 LRS",
118
- type: "Consumption",
119
- unitOfMeasure: "1 GB/Month",
120
- unitPrice: 0.1,
121
- },
122
- ],
123
- NextPageLink: null,
124
- };
125
- const client = new PricingClient({
126
- cache: new DiskCache({ dir }),
127
- fetch: makeFetch(body).fetch,
128
- });
129
- const money = await resolveDiskMonthlyPrice(client, {
130
- armRegionName: "westeurope",
131
- diskSizeGiB: 128,
132
- sku: "Premium_LRS",
133
- });
134
- expect(money).toBeUndefined();
135
- });
136
- it("returns undefined when the disk size exceeds the largest tier", async () => {
137
- const client = new PricingClient({
138
- cache: new DiskCache({ dir }),
139
- fetch: vi.fn(),
140
- });
141
- const money = await resolveDiskMonthlyPrice(client, {
142
- armRegionName: "westeurope",
143
- diskSizeGiB: 100_000,
144
- sku: "Premium_LRS",
145
- });
146
- expect(money).toBeUndefined();
147
- });
148
- it("rejects invalid input via zod", async () => {
149
- const client = new PricingClient({
150
- cache: new DiskCache({ dir }),
151
- fetch: vi.fn(),
152
- });
153
- await expect(resolveDiskMonthlyPrice(client, {
154
- armRegionName: "westeurope",
155
- diskSizeGiB: -1,
156
- sku: "Premium_LRS",
157
- })).rejects.toThrow();
158
- });
159
- });
160
- //# sourceMappingURL=disk.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"disk.test.js","sourceRoot":"","sources":["../../../../../src/azure/pricing/resolvers/__tests__/disk.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for the Public IP Retail Prices resolver.
3
- */
4
- export {};
5
- //# sourceMappingURL=public-ip.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public-ip.test.d.ts","sourceRoot":"","sources":["../../../../../src/azure/pricing/resolvers/__tests__/public-ip.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}