| import { | |
| describe, | |
| beforeAll, | |
| afterEach, | |
| afterAll, | |
| test, | |
| expect, | |
| vi | |
| } from "vitest"; | |
| import { Client, client, duplicate } from ".."; | |
| import { | |
| transformed_api_info, | |
| config_response, | |
| response_api_info | |
| } from "./test_data"; | |
| import { initialise_server } from "./server"; | |
| import { SPACE_METADATA_ERROR_MSG } from "../constants"; | |
| const app_reference = "hmb/hello_world"; | |
| const broken_app_reference = "hmb/bye_world"; | |
| const direct_app_reference = "https://hmb-hello-world.hf.space"; | |
| const secret_direct_app_reference = "https://hmb-secret-world.hf.space"; | |
| const server = initialise_server(); | |
| beforeAll(() => server.listen()); | |
| afterEach(() => server.resetHandlers()); | |
| afterAll(() => server.close()); | |
| describe("Client class", () => { | |
| describe("initialisation", () => { | |
| test("fetch is bound to the Client instance", async () => { | |
| const test = await Client.connect("hmb/hello_world"); | |
| const fetch_method = test.fetch; | |
| const res = await fetch_method(direct_app_reference + "/info"); | |
| await expect(res.json()).resolves.toEqual(response_api_info); | |
| }); | |
| test("stream is bound to the Client instance", async () => { | |
| const test = await Client.connect("hmb/hello_world"); | |
| const stream_method = test.stream; | |
| const url = new URL(`${direct_app_reference}/queue/data`); | |
| const stream = stream_method(url); | |
| expect(stream).toBeDefined(); | |
| expect(stream.onmessage).toBeDefined(); | |
| }); | |
| test("backwards compatibility of client using deprecated syntax", async () => { | |
| const app = await client(app_reference); | |
| expect(app.config).toEqual(config_response); | |
| }); | |
| test("connecting to a running app with a space reference", async () => { | |
| const app = await Client.connect(app_reference); | |
| expect(app.config).toEqual(config_response); | |
| }); | |
| test("connecting to a running app with a direct app URL", async () => { | |
| const app = await Client.connect(direct_app_reference); | |
| expect(app.config).toEqual(config_response); | |
| }); | |
| test("connecting successfully to a private running app with a space reference", async () => { | |
| const app = await Client.connect("hmb/secret_world", { | |
| hf_token: "hf_123" | |
| }); | |
| expect(app.config).toEqual({ | |
| ...config_response, | |
| root: "https://hmb-secret-world.hf.space" | |
| }); | |
| }); | |
| test("connecting successfully to a private running app with a direct app URL ", async () => { | |
| const app = await Client.connect(secret_direct_app_reference, { | |
| hf_token: "hf_123" | |
| }); | |
| expect(app.config).toEqual({ | |
| ...config_response, | |
| root: "https://hmb-secret-world.hf.space" | |
| }); | |
| }); | |
| test("unsuccessfully attempting to connect to a private running app", async () => { | |
| await expect( | |
| Client.connect("hmb/secret_world", { | |
| hf_token: "hf_bad_token" | |
| }) | |
| ).rejects.toThrowError(SPACE_METADATA_ERROR_MSG); | |
| }); | |
| test("viewing the api info of a running app", async () => { | |
| const app = await Client.connect(app_reference); | |
| expect(await app.view_api()).toEqual(transformed_api_info); | |
| }); | |
| test("viewing the api info of a non-existent app", async () => { | |
| const app = Client.connect(broken_app_reference); | |
| await expect(app).rejects.toThrowError(); | |
| }); | |
| }); | |
| describe("duplicate", () => { | |
| test("backwards compatibility of duplicate using deprecated syntax", async () => { | |
| const app = await duplicate("gradio/hello_world", { | |
| hf_token: "hf_123", | |
| private: true, | |
| hardware: "cpu-basic" | |
| }); | |
| expect(app.config).toEqual(config_response); | |
| }); | |
| test("creating a duplicate of a running app", async () => { | |
| const duplicate = await Client.duplicate("gradio/hello_world", { | |
| hf_token: "hf_123", | |
| private: true, | |
| hardware: "cpu-basic" | |
| }); | |
| expect(duplicate.config).toEqual(config_response); | |
| }); | |
| test("creating a duplicate of a running app without a token", async () => { | |
| const duplicate = Client.duplicate("gradio/hello_world", { | |
| private: true, | |
| hardware: "cpu-basic" | |
| }); | |
| await expect(duplicate).rejects.toThrow("Error: Unauthorized"); | |
| }); | |
| test("creating a duplicate of a broken app", async () => { | |
| const duplicate = Client.duplicate(broken_app_reference); | |
| await expect(duplicate).rejects.toThrow(SPACE_METADATA_ERROR_MSG); | |
| }); | |
| }); | |
| describe("overriding the Client class", () => { | |
| test("overriding methods on the Client class", async () => { | |
| const mocked_fetch = vi.fn( | |
| (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => { | |
| return Promise.resolve( | |
| new Response(JSON.stringify({ data: "test" })) | |
| ); | |
| } | |
| ); | |
| class CustomClient extends Client { | |
| fetch = mocked_fetch; | |
| } | |
| await CustomClient.connect("hmb/hello_world"); | |
| expect(mocked_fetch).toHaveBeenCalled(); | |
| }); | |
| }); | |
| }); | |