Repository navigation
Expand file tree
/
Copy pathusagePriceForm.test.ts
More file actions
84 lines (78 loc) · 2.89 KB
/
Copy pathusagePriceForm.test.ts
File metadata and controls
84 lines (78 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { describe, expect, it } from "vite-plus/test";
import { isUsagePriceEdit, parseUsagePriceForm, usagePriceForm } from "./usagePriceForm.ts";
describe("model price entry", () => {
it("keeps free cache tokens distinct from blank cache prices", () => {
const parsed = parseUsagePriceForm({
...usagePriceForm(),
model: "example-model",
inputCostPerMillionTokens: "2",
outputCostPerMillionTokens: "8",
cacheReadCostPerMillionTokens: "0",
cacheWriteCostPerMillionTokens: " ",
});
expect(parsed?.price).toEqual({
inputCostPerMillionTokens: 2,
outputCostPerMillionTokens: 8,
cacheReadCostPerMillionTokens: 0,
});
});
it("preserves all prices when editing, including small fractional prices", () => {
const price = {
inputCostPerMillionTokens: 0,
outputCostPerMillionTokens: 8,
cacheReadCostPerMillionTokens: 0.0000001,
cacheWriteCostPerMillionTokens: 3.5,
};
expect(parseUsagePriceForm(usagePriceForm("example-model", price))).toEqual({
model: "example-model",
price,
});
});
it.each(["", " ", "-1", "Infinity", "NaN", "1e999", "$2", "0x10", "1,2,3", "1.2,3", "1,2.3"])(
"rejects invalid required prices: %j",
(inputCostPerMillionTokens) => {
expect(
parseUsagePriceForm({
...usagePriceForm("example-model", {
inputCostPerMillionTokens: 2,
outputCostPerMillionTokens: 8,
}),
inputCostPerMillionTokens,
}),
).toBeNull();
},
);
it("reads a comma as the decimal point", () => {
const form = usagePriceForm("example-model", {
inputCostPerMillionTokens: 2,
outputCostPerMillionTokens: 8,
});
expect(
parseUsagePriceForm({
...form,
inputCostPerMillionTokens: "2,5",
outputCostPerMillionTokens: "0,075",
}),
).toEqual({
model: "example-model",
price: { inputCostPerMillionTokens: 2.5, outputCostPerMillionTokens: 0.075 },
});
expect(parseUsagePriceForm({ ...form, inputCostPerMillionTokens: "1,2,3" })).toBeNull();
expect(isUsagePriceEdit("", "2,5")).toBe(true);
expect(isUsagePriceEdit("", ",5")).toBe(true);
expect(isUsagePriceEdit("", "1,2,3")).toBe(false);
expect(isUsagePriceEdit("1,2", "1,2.3")).toBe(false);
for (const value of ["2,5", ",5", "0,075", "1,5e-7"]) {
for (let end = 1; end <= value.length; end++) {
expect(isUsagePriceEdit(value.slice(0, end - 1), value.slice(0, end))).toBe(true);
}
}
});
it("never blocks deleting part of a price, but blocks replacing it with a non-number", () => {
expect(isUsagePriceEdit("1e-7", "e-7")).toBe(true);
expect(isUsagePriceEdit("1e-7", "1-7")).toBe(true);
expect(isUsagePriceEdit("1e-7", "a7")).toBe(false);
expect(isUsagePriceEdit("2.5", "x")).toBe(false);
expect(isUsagePriceEdit("123456", "1.2.3")).toBe(false);
});
});