@huggingface/hub
Version:
Utilities to interact with the Hugging Face hub
100 lines (80 loc) • 3.45 kB
text/typescript
import { describe, expect, it, beforeAll } from "vitest";
import { WebBlob } from "./WebBlob";
describe("WebBlob", () => {
const resourceUrl = new URL("https://huggingface.co/spaces/aschen/push-model-from-web/raw/main/mobilenet/model.json");
let fullText: string;
let size: number;
let contentType: string;
beforeAll(async () => {
// Compute the reference size from the response body itself; in browsers
// `Content-Length` is not reliably exposed when the response is gzipped
// on the fly by CloudFront.
const response = await fetch(resourceUrl);
const blob = await response.blob();
size = blob.size;
fullText = await blob.text();
contentType = response.headers.get("content-type") || "";
});
it("should create a WebBlob with a slice on the entire resource", async () => {
const webBlob = await WebBlob.create(resourceUrl, { cacheBelow: 0, accessToken: undefined });
expect(webBlob).toMatchObject({
url: resourceUrl,
start: 0,
end: size,
contentType,
});
expect(webBlob).toBeInstanceOf(WebBlob);
expect(webBlob.size).toBe(size);
expect(webBlob.type).toBe(contentType);
const text = await webBlob.text();
expect(text).toBe(fullText);
const streamText = await new Response(webBlob.stream()).text();
expect(streamText).toBe(fullText);
});
it("should create a WebBlob with a slice on the entire resource, cached", async () => {
const webBlob = await WebBlob.create(resourceUrl, { cacheBelow: 1_000_000, accessToken: undefined });
expect(webBlob).not.toBeInstanceOf(WebBlob);
expect(webBlob.size).toBe(size);
expect(webBlob.type.replace(/;\s*charset=utf-8/, "")).toBe(contentType.replace(/;\s*charset=utf-8/, ""));
const text = await webBlob.text();
expect(text).toBe(fullText);
const streamText = await new Response(webBlob.stream()).text();
expect(streamText).toBe(fullText);
});
it("should lazy load a LFS file hosted on Hugging Face", async () => {
const zephyrUrl =
"https://huggingface.co/HuggingFaceH4/zephyr-7b-alpha/resolve/main/model-00001-of-00008.safetensors";
const url = new URL(zephyrUrl);
const webBlob = await WebBlob.create(url);
expect(webBlob.size).toBe(1_889_587_040);
expect(webBlob).toBeInstanceOf(WebBlob);
expect(webBlob).toMatchObject({ url });
expect(await webBlob.slice(10, 22).text()).toBe("__metadata__");
});
it("should lazy load a Xet file hosted on Hugging Face", async () => {
const stableDiffusionUrl =
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors";
const url = new URL(stableDiffusionUrl);
const webBlob = await WebBlob.create(url);
expect(webBlob.size).toBe(5_135_149_760);
expect(webBlob).toBeInstanceOf(WebBlob);
expect(webBlob).toMatchObject({ url });
expect(await webBlob.slice(10, 22).text()).toBe("__metadata__");
});
it("should create a slice on the file", async () => {
const expectedText = fullText.slice(10, 20);
const slice = (await WebBlob.create(resourceUrl, { cacheBelow: 0, accessToken: undefined })).slice(10, 20);
expect(slice).toMatchObject({
url: resourceUrl,
start: 10,
end: 20,
contentType,
});
expect(slice.size).toBe(10);
expect(slice.type).toBe(contentType);
const sliceText = await slice.text();
expect(sliceText).toBe(expectedText);
const streamText = await new Response(slice.stream()).text();
expect(streamText).toBe(expectedText);
});
});