1
/** @jest-environment node */
3
import { prisma } from "@/src/server/db";
4
import { makeAPICall, pruneDatabase } from "@/src/__tests__/test-utils";
5
import { v4 as uuidv4 } from "uuid";
7
describe("/api/public/scores API Endpoint", () => {
8
beforeEach(async () => await pruneDatabase());
9
afterEach(async () => await pruneDatabase());
11
it("should create score for a trace", async () => {
12
await pruneDatabase();
14
const traceId = uuidv4();
16
await makeAPICall("POST", "/api/public/traces", {
20
projectId: "7a88fb47-b4e2-43b8-a06c-a5ce950dc53a",
21
metadata: { key: "value" },
26
const dbTrace = await prisma.trace.findMany({
32
expect(dbTrace.length).toBeGreaterThan(0);
33
expect(dbTrace[0]?.id).toBe(traceId);
35
const scoreId = uuidv4();
36
const createScore = await makeAPICall("POST", "/api/public/scores", {
44
expect(createScore.status).toBe(200);
45
const dbScore = await prisma.score.findUnique({
51
expect(dbScore?.id).toBe(scoreId);
52
expect(dbScore?.traceId).toBe(traceId);
53
expect(dbScore?.name).toBe("score-name");
54
expect(dbScore?.value).toBe(100.5);
55
expect(dbScore?.observationId).toBeNull();
56
expect(dbScore?.comment).toBe("comment");
59
it("should create score for a trace with int", async () => {
60
await pruneDatabase();
62
const traceId = uuidv4();
64
await makeAPICall("POST", "/api/public/traces", {
68
projectId: "7a88fb47-b4e2-43b8-a06c-a5ce950dc53a",
69
metadata: { key: "value" },
74
const dbTrace = await prisma.trace.findMany({
80
expect(dbTrace.length).toBeGreaterThan(0);
81
expect(dbTrace[0]?.id).toBe(traceId);
83
const scoreId = uuidv4();
84
const createScore = await makeAPICall("POST", "/api/public/scores", {
91
expect(createScore.status).toBe(200);
92
const dbScore = await prisma.score.findUnique({
98
expect(dbScore?.id).toBe(scoreId);
99
expect(dbScore?.traceId).toBe(traceId);
100
expect(dbScore?.name).toBe("score-name");
101
expect(dbScore?.value).toBe(100);
102
expect(dbScore?.observationId).toBeNull();
105
it("should create score for a generation", async () => {
106
await pruneDatabase();
108
const generationId = uuidv4();
110
await makeAPICall("POST", "/api/public/generations", {
112
name: "generation-name",
113
startTime: "2021-01-01T00:00:00.000Z",
114
endTime: "2021-01-01T00:00:00.000Z",
116
modelParameters: { key: "value" },
117
prompt: { key: "value" },
118
metadata: { key: "value" },
122
const dbGeneration = await prisma.observation.findMany({
128
expect(dbGeneration.length).toBeGreaterThan(0);
129
expect(dbGeneration[0]?.id).toBe(generationId);
131
const scoreId = uuidv4();
132
const createScore = await makeAPICall("POST", "/api/public/scores", {
136
traceId: dbGeneration[0]!.traceId!,
137
observationId: dbGeneration[0]!.id,
140
expect(createScore.status).toBe(200);
141
const dbScore = await prisma.score.findUnique({
147
expect(dbScore?.id).toBe(scoreId);
148
expect(dbScore?.traceId).toBe(dbGeneration[0]!.traceId!);
149
expect(dbScore?.observationId).toBe(dbGeneration[0]!.id);
150
expect(dbScore?.name).toBe("score-name");
151
expect(dbScore?.value).toBe(100);
154
it("should upsert a score", async () => {
155
await pruneDatabase();
157
const traceId = uuidv4();
159
await makeAPICall("POST", "/api/public/traces", {
163
projectId: "7a88fb47-b4e2-43b8-a06c-a5ce950dc53a",
164
metadata: { key: "value" },
169
const dbTrace = await prisma.trace.findMany({
175
expect(dbTrace.length).toBeGreaterThan(0);
176
expect(dbTrace[0]?.id).toBe(traceId);
178
const generationId = uuidv4();
179
await makeAPICall("POST", "/api/public/generations", {
181
name: "generation-name",
183
startTime: "2021-01-01T00:00:00.000Z",
184
endTime: "2021-01-01T00:00:00.000Z",
186
modelParameters: { key: "value" },
187
prompt: { key: "value" },
188
metadata: { key: "value" },
192
const dbGeneration = await prisma.observation.findMany({
198
expect(dbGeneration.length).toBeGreaterThan(0);
199
expect(dbGeneration[0]?.id).toBe(generationId);
201
const scoreId = uuidv4();
202
const createScore = await makeAPICall("POST", "/api/public/scores", {
209
expect(createScore.status).toBe(200);
211
const upsertScore = await makeAPICall("POST", "/api/public/scores", {
214
name: "score-name-updated",
216
comment: "comment-updated",
217
observationId: dbGeneration[0]!.id,
219
expect(upsertScore.status).toBe(200);
221
const dbScore = await prisma.score.findUnique({
227
expect(dbScore?.id).toBe(scoreId);
228
expect(dbScore?.traceId).toBe(traceId);
229
expect(dbScore?.name).toBe("score-name-updated");
230
expect(dbScore?.value).toBe(200);
231
expect(dbScore?.comment).toBe("comment-updated");
232
expect(dbScore?.observationId).toBe(dbGeneration[0]!.id);
235
it("should delete a score", async () => {
236
await pruneDatabase();
238
const traceId = uuidv4();
240
await makeAPICall("POST", "/api/public/traces", {
244
const scoreId = uuidv4();
245
const createScore = await makeAPICall("POST", "/api/public/scores", {
253
expect(createScore.status).toBe(200);
254
const dbScore = await prisma.score.findUnique({
259
expect(dbScore?.id).toBe(scoreId);
261
const deleteScore = await makeAPICall(
263
`/api/public/scores/${scoreId}`,
265
expect(deleteScore.status).toBe(200);
266
const deletedScore = await prisma.score.findUnique({
271
expect(deletedScore).toBeNull();
274
it("should GET a score", async () => {
275
await pruneDatabase();
277
const traceId = uuidv4();
279
await makeAPICall("POST", "/api/public/traces", {
282
const generationId = uuidv4();
283
await makeAPICall("POST", "/api/public/generations", {
287
const scoreId = uuidv4();
288
await makeAPICall("POST", "/api/public/scores", {
290
observationId: generationId,
297
const getScore = await makeAPICall<{
303
observationId: string;
304
}>("GET", `/api/public/scores/${scoreId}`);
306
expect(getScore.status).toBe(200);
307
expect(getScore.body).toMatchObject({
313
observationId: generationId,