UNPKG

mongoku

Version:

[![CI](https://github.com/huggingface/Mongoku/actions/workflows/ci.yml/badge.svg)](https://github.com/huggingface/Mongoku/actions/workflows/ci.yml)

303 lines (259 loc) 8.9 kB
import JsonEncoder from "$lib/server/JsonEncoder"; import { Binary, Decimal128, ObjectId } from "mongodb"; import { describe, expect, it } from "vitest"; describe("JsonEncoder", () => { describe("encode", () => { it("should encode ObjectId", () => { const objectId = new ObjectId("507f1f77bcf86cd799439011"); const encoded = JsonEncoder.encode(objectId); expect(encoded).toEqual({ $type: "ObjectId", $value: "507f1f77bcf86cd799439011", $date: objectId.getTimestamp().getTime(), }); }); it("should encode Date", () => { const date = new Date("2024-01-15T10:30:00.000Z"); const encoded = JsonEncoder.encode(date); expect(encoded).toEqual({ $type: "Date", $value: "2024-01-15T10:30:00.000Z", }); }); it("should encode RegExp", () => { const regex = /test/gi; const encoded = JsonEncoder.encode(regex); expect(encoded).toEqual({ $type: "RegExp", $value: { $pattern: "test", $flags: "gi", }, }); }); it("should encode Binary", () => { const buffer = Buffer.from("hello world", "utf-8"); const binary = new Binary(buffer); const encoded = JsonEncoder.encode(binary); expect(encoded).toEqual({ $type: "Binary", $value: buffer.toString("base64"), $subType: binary.sub_type, }); }); it("should encode Decimal128", () => { const decimal = Decimal128.fromString("123.456"); const encoded = JsonEncoder.encode(decimal); expect(encoded).toEqual({ $type: "Decimal128", $value: "123.456", }); }); it("should encode arrays", () => { const arr = [new ObjectId("507f1f77bcf86cd799439011"), new Date("2024-01-15T10:30:00.000Z"), "string", 123]; const encoded = JsonEncoder.encode(arr); expect(encoded).toHaveLength(4); expect(encoded[0].$type).toBe("ObjectId"); expect(encoded[1].$type).toBe("Date"); expect(encoded[2]).toBe("string"); expect(encoded[3]).toBe(123); }); it("should encode nested objects", () => { const obj = { _id: new ObjectId("507f1f77bcf86cd799439011"), createdAt: new Date("2024-01-15T10:30:00.000Z"), pattern: /test/i, nested: { value: Decimal128.fromString("99.99"), }, }; const encoded = JsonEncoder.encode(obj); expect(encoded._id.$type).toBe("ObjectId"); expect(encoded.createdAt.$type).toBe("Date"); expect(encoded.pattern.$type).toBe("RegExp"); expect(encoded.nested.value.$type).toBe("Decimal128"); }); it("should handle primitive values", () => { expect(JsonEncoder.encode("string")).toBe("string"); expect(JsonEncoder.encode(123)).toBe(123); expect(JsonEncoder.encode(true)).toBe(true); expect(JsonEncoder.encode(null)).toBe(null); expect(JsonEncoder.encode(undefined)).toBe(undefined); }); }); describe("decode", () => { it("should decode ObjectId", () => { const encoded = { $type: "ObjectId", $value: "507f1f77bcf86cd799439011", $date: 1357986930000, }; const decoded = JsonEncoder.decode(encoded); expect(decoded).toBeInstanceOf(ObjectId); expect(decoded.toHexString()).toBe("507f1f77bcf86cd799439011"); }); it("should decode Date", () => { const encoded = { $type: "Date", $value: "2024-01-15T10:30:00.000Z", }; const decoded = JsonEncoder.decode(encoded); expect(decoded).toBeInstanceOf(Date); expect(decoded.toISOString()).toBe("2024-01-15T10:30:00.000Z"); }); it("should decode RegExp", () => { const encoded = { $type: "RegExp", $value: { $pattern: "test", $flags: "gi", }, }; const decoded = JsonEncoder.decode(encoded); expect(decoded).toBeInstanceOf(RegExp); expect(decoded.source).toBe("test"); expect(decoded.flags).toBe("gi"); }); it("should decode Binary", () => { const originalBuffer = Buffer.from("hello world", "utf-8"); const encoded = { $type: "Binary", $value: originalBuffer.toString("base64"), $subType: 0, }; const decoded = JsonEncoder.decode(encoded); expect(decoded).toBeInstanceOf(Binary); expect(Buffer.from(decoded.buffer).toString("utf-8")).toBe("hello world"); expect(decoded.sub_type).toBe(0); }); it("should decode Decimal128", () => { const encoded = { $type: "Decimal128", $value: "123.456", }; const decoded = JsonEncoder.decode(encoded); expect(decoded).toBeInstanceOf(Decimal128); expect(decoded.toString()).toBe("123.456"); }); it("should decode arrays", () => { const encoded = [ { $type: "ObjectId", $value: "507f1f77bcf86cd799439011", $date: 1357986930000, }, { $type: "Date", $value: "2024-01-15T10:30:00.000Z", }, "string", 123, ]; const decoded = JsonEncoder.decode(encoded); expect(decoded).toHaveLength(4); expect(decoded[0]).toBeInstanceOf(ObjectId); expect(decoded[1]).toBeInstanceOf(Date); expect(decoded[2]).toBe("string"); expect(decoded[3]).toBe(123); }); it("should decode nested objects", () => { const encoded = { _id: { $type: "ObjectId", $value: "507f1f77bcf86cd799439011", $date: 1357986930000, }, createdAt: { $type: "Date", $value: "2024-01-15T10:30:00.000Z", }, nested: { value: { $type: "Decimal128", $value: "99.99", }, }, }; const decoded = JsonEncoder.decode(encoded); expect(decoded._id).toBeInstanceOf(ObjectId); expect(decoded.createdAt).toBeInstanceOf(Date); expect(decoded.nested.value).toBeInstanceOf(Decimal128); }); it("should handle primitive values", () => { expect(JsonEncoder.decode("string")).toBe("string"); expect(JsonEncoder.decode(123)).toBe(123); expect(JsonEncoder.decode(true)).toBe(true); expect(JsonEncoder.decode(null)).toBe(null); expect(JsonEncoder.decode(undefined)).toBe(undefined); }); }); describe("round-trip encoding and decoding", () => { it("should correctly round-trip ObjectId", () => { const original = new ObjectId("507f1f77bcf86cd799439011"); const roundTrip = JsonEncoder.decode(JsonEncoder.encode(original)); expect(roundTrip).toBeInstanceOf(ObjectId); expect(roundTrip.toHexString()).toBe(original.toHexString()); }); it("should correctly round-trip Date", () => { const original = new Date("2024-01-15T10:30:00.000Z"); const roundTrip = JsonEncoder.decode(JsonEncoder.encode(original)); expect(roundTrip).toBeInstanceOf(Date); expect(roundTrip.getTime()).toBe(original.getTime()); }); it("should correctly round-trip RegExp", () => { const original = /test/gi; const roundTrip = JsonEncoder.decode(JsonEncoder.encode(original)); expect(roundTrip).toBeInstanceOf(RegExp); expect(roundTrip.source).toBe(original.source); expect(roundTrip.flags).toBe(original.flags); }); it("should correctly round-trip Binary", () => { const buffer = Buffer.from("hello world", "utf-8"); const original = new Binary(buffer); const roundTrip = JsonEncoder.decode(JsonEncoder.encode(original)); expect(roundTrip).toBeInstanceOf(Binary); expect(Buffer.from(roundTrip.buffer).toString("utf-8")).toBe("hello world"); }); it("should correctly round-trip Decimal128", () => { const original = Decimal128.fromString("123.456"); const roundTrip = JsonEncoder.decode(JsonEncoder.encode(original)); expect(roundTrip).toBeInstanceOf(Decimal128); expect(roundTrip.toString()).toBe(original.toString()); }); it("should correctly round-trip complex nested structure", () => { const original = { _id: new ObjectId("507f1f77bcf86cd799439011"), name: "Test User", age: 30, isActive: true, createdAt: new Date("2024-01-15T10:30:00.000Z"), pattern: /email@test\.com/i, balance: Decimal128.fromString("1234.56"), data: new Binary(Buffer.from("binary data")), tags: ["tag1", "tag2"], metadata: { nested: { value: new ObjectId("507f191e810c19729de860ea"), }, }, }; const encoded = JsonEncoder.encode(original); const decoded = JsonEncoder.decode(encoded); expect(decoded._id).toBeInstanceOf(ObjectId); expect(decoded._id.toHexString()).toBe("507f1f77bcf86cd799439011"); expect(decoded.name).toBe("Test User"); expect(decoded.age).toBe(30); expect(decoded.isActive).toBe(true); expect(decoded.createdAt).toBeInstanceOf(Date); expect(decoded.createdAt.getTime()).toBe(original.createdAt.getTime()); expect(decoded.pattern).toBeInstanceOf(RegExp); expect(decoded.pattern.source).toBe(original.pattern.source); expect(decoded.balance).toBeInstanceOf(Decimal128); expect(decoded.balance.toString()).toBe("1234.56"); expect(decoded.data).toBeInstanceOf(Binary); expect(decoded.tags).toEqual(["tag1", "tag2"]); expect(decoded.metadata.nested.value).toBeInstanceOf(ObjectId); expect(decoded.metadata.nested.value.toHexString()).toBe("507f191e810c19729de860ea"); }); }); });