165 lines
4.1 KiB
TypeScript
165 lines
4.1 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
import createFetchMock from "vitest-fetch-mock";
|
|
|
|
import { TSGhostContentAPI } from "@ts-ghost/content-api";
|
|
|
|
const fetchMocker = createFetchMock(vi);
|
|
|
|
describe("authors api .browse() Args Type-safety", () => {
|
|
const url = process.env.VITE_GHOST_URL || "https://my-ghost-blog.com";
|
|
const key =
|
|
process.env.VITE_GHOST_CONTENT_API_KEY || "59d4bf56c73c04a18c867dc3ba";
|
|
const api = new TSGhostContentAPI(url, key, "v5.0");
|
|
test(".browse() params shouldnt accept invalid params", () => {
|
|
// @ts-expect-error - shouldnt accept invalid params
|
|
const browse = api.authors.browse({ pp: 2 });
|
|
expect(browse.getParams().browseParams).toStrictEqual({});
|
|
});
|
|
|
|
test(".browse() 'order' params should ony accept fields values", () => {
|
|
// @ts-expect-error - order should ony contain field
|
|
expect(() => api.authors.browse({ order: "foo ASC" })).toThrow();
|
|
// valid
|
|
expect(
|
|
api.authors.browse({ order: "name ASC" }).getParams().browseParams,
|
|
).toStrictEqual({
|
|
order: "name ASC",
|
|
});
|
|
expect(
|
|
api.authors.browse({ order: "name ASC,slug DESC" }).getParams()
|
|
.browseParams,
|
|
).toStrictEqual({
|
|
order: "name ASC,slug DESC",
|
|
});
|
|
expect(
|
|
api.authors
|
|
.browse({ order: "name ASC,slug DESC,location ASC" })
|
|
.getParams().browseParams,
|
|
).toStrictEqual({
|
|
order: "name ASC,slug DESC,location ASC",
|
|
});
|
|
// @ts-expect-error - order should ony contain field (There is a typo in location)
|
|
expect(() =>
|
|
api.authors.browse({ order: "name ASC,slug DESC,locaton ASC" }),
|
|
).toThrow();
|
|
});
|
|
|
|
test(".browse() 'filter' params should ony accept valid field", () => {
|
|
expect(() =>
|
|
api.authors.browse({
|
|
// @ts-expect-error - order should ony contain field
|
|
filter: "foo:bar",
|
|
}),
|
|
).toThrow();
|
|
expect(
|
|
api.authors
|
|
.browse({
|
|
filter: "name:bar",
|
|
})
|
|
.getParams().browseParams,
|
|
).toStrictEqual({
|
|
filter: "name:bar",
|
|
});
|
|
expect(
|
|
api.authors
|
|
.browse({
|
|
filter: "name:bar+slug:-test",
|
|
})
|
|
.getParams().browseParams,
|
|
).toStrictEqual({
|
|
filter: "name:bar+slug:-test",
|
|
});
|
|
});
|
|
|
|
test(".browse 'fields' argument should ony accept valid fields", () => {
|
|
expect(
|
|
api.authors
|
|
.browse()
|
|
.fields({
|
|
// @ts-expect-error - order should ony contain field
|
|
foo: true,
|
|
})
|
|
.getOutputFields(),
|
|
).toEqual([]);
|
|
|
|
expect(
|
|
api.authors.browse().fields({ location: true }).getOutputFields(),
|
|
).toEqual(["location"]);
|
|
expect(
|
|
api.authors
|
|
.browse()
|
|
.fields({ name: true, website: true })
|
|
.getOutputFields(),
|
|
).toEqual(["name", "website"]);
|
|
});
|
|
});
|
|
|
|
describe("authors resource mocked", () => {
|
|
let api: TSGhostContentAPI;
|
|
|
|
beforeEach(() => {
|
|
api = new TSGhostContentAPI(
|
|
"https://my-ghost-blog.com",
|
|
"59d4bf56c73c04a18c867dc3ba",
|
|
"v5.0",
|
|
);
|
|
fetchMocker.enableMocks();
|
|
});
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
test("aouthors should be fetched correctly", async () => {
|
|
const authors = api.authors;
|
|
expect(authors).not.toBeUndefined();
|
|
const browseQuery = authors
|
|
.browse({
|
|
page: 2,
|
|
})
|
|
.fields({
|
|
name: true,
|
|
id: true,
|
|
});
|
|
expect(browseQuery).not.toBeUndefined();
|
|
expect(browseQuery.getOutputFields()).toStrictEqual(["name", "id"]);
|
|
|
|
fetchMocker.doMockOnce(
|
|
JSON.stringify({
|
|
authors: [
|
|
{
|
|
name: "foo",
|
|
id: "eaoizdjoa1321123",
|
|
},
|
|
],
|
|
meta: {
|
|
pagination: {
|
|
page: 1,
|
|
limit: 15,
|
|
pages: 1,
|
|
total: 1,
|
|
next: null,
|
|
prev: null,
|
|
},
|
|
},
|
|
}),
|
|
);
|
|
const result = await browseQuery.fetch();
|
|
expect(fetchMocker).toHaveBeenCalledTimes(1);
|
|
expect(fetchMocker).toHaveBeenCalledWith(
|
|
"https://my-ghost-blog.com/ghost/api/content/authors/?page=2&fields=name%2Cid&key=59d4bf56c73c04a18c867dc3ba",
|
|
{
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Accept-Version": "v5.0",
|
|
},
|
|
},
|
|
);
|
|
expect(result).not.toBeUndefined();
|
|
if (result.success) {
|
|
expect(result.data.length).toBe(1);
|
|
expect(result.data[0].name).toBe("foo");
|
|
expect(result.data[0].id).toBe("eaoizdjoa1321123");
|
|
}
|
|
});
|
|
});
|