mirror of
https://github.com/stefanpejcic/openpanel
synced 2025-06-26 18:28:26 +00:00
445 lines
13 KiB
TypeScript
445 lines
13 KiB
TypeScript
import { ConditionalFilter } from "@refinedev/core";
|
|
import dataProvider from "../../src/index";
|
|
import "./index.mock";
|
|
|
|
describe("getList", () => {
|
|
it("correct response", async () => {
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
});
|
|
|
|
expect(response.data[0]["id"]).toBe("rec9GbXLzd6dxn4Il");
|
|
expect(response.data[0]["title"]).toBe("Hello World 3!");
|
|
expect(response.total).toBe(2);
|
|
});
|
|
|
|
it("correct sorting response", async () => {
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
sorters: [
|
|
{
|
|
field: "title",
|
|
order: "desc",
|
|
},
|
|
],
|
|
});
|
|
|
|
expect(response.data[0]["id"]).toBe("recLKRioqifTrPUIz");
|
|
expect(response.data[0]["title"]).toBe("Hello World!");
|
|
expect(response.total).toBe(2);
|
|
});
|
|
|
|
it("correct equals filter for strings", async () => {
|
|
const filter = {
|
|
operator: "eq",
|
|
field: "title",
|
|
value: "Hello World!",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must equal exactly string
|
|
expect(response.data[0]["query"]).toBe('AND({title}="Hello World!")');
|
|
});
|
|
|
|
it("correct equals filter for numbers", async () => {
|
|
const filter = {
|
|
operator: "eq",
|
|
field: "age",
|
|
value: 100,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must equal exactly number
|
|
expect(response.data[0]["query"]).toBe("AND({age}=100)");
|
|
});
|
|
|
|
it("correct not equals filter for strings", async () => {
|
|
const filter = {
|
|
operator: "ne",
|
|
field: "title",
|
|
value: "Hello World!",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must not equal exactly string
|
|
expect(response.data[0]["query"]).toBe('AND({title}!="Hello World!")');
|
|
});
|
|
|
|
it("correct not equals filter for numbers", async () => {
|
|
const filter = {
|
|
operator: "ne",
|
|
field: "age",
|
|
value: 100,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must not equal exactly number
|
|
expect(response.data[0]["query"]).toBe("AND({age}!=100)");
|
|
});
|
|
|
|
it("correct less than filter", async () => {
|
|
const filter = {
|
|
operator: "lt",
|
|
field: "age",
|
|
value: 10,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must be less than value (as number)
|
|
expect(response.data[0]["query"]).toBe("AND({age}<10)");
|
|
});
|
|
|
|
it("correct less than or equal filter", async () => {
|
|
const filter = {
|
|
operator: "lte",
|
|
field: "age",
|
|
value: 10,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must be less than or equal value (as number)
|
|
expect(response.data[0]["query"]).toBe("AND({age}<=10)");
|
|
});
|
|
|
|
it("correct greater than filter", async () => {
|
|
const filter = {
|
|
operator: "gt",
|
|
field: "age",
|
|
value: 10,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must be greater than value (as number)
|
|
expect(response.data[0]["query"]).toBe("AND({age}>10)");
|
|
});
|
|
|
|
it("correct greater than or equal filter", async () => {
|
|
const filter = {
|
|
operator: "gte",
|
|
field: "age",
|
|
value: 10,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must be greater than or equal value (as number)
|
|
expect(response.data[0]["query"]).toBe("AND({age}>=10)");
|
|
});
|
|
|
|
it("correct contains filter", async () => {
|
|
const filter = {
|
|
operator: "containss",
|
|
field: "title",
|
|
value: "Hello",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// must find string in {field} - FIND returns non-zero value
|
|
expect(response.data[0]["query"]).toBe('AND(FIND("Hello",{title})!=0)');
|
|
});
|
|
|
|
it("correct not contains filter", async () => {
|
|
const filter = {
|
|
operator: "ncontainss",
|
|
field: "title",
|
|
value: "Hello",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// must not find string in {field} - FIND returns zero
|
|
expect(response.data[0]["query"]).toBe('AND(FIND("Hello",{title})=0)');
|
|
});
|
|
|
|
it("correct case-insensitive contains filter", async () => {
|
|
const filter = {
|
|
operator: "contains",
|
|
field: "title",
|
|
value: "Hello",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// must find lower-cased string in lower-cased {field} - lower-casing both values makes it case-insensitive
|
|
expect(response.data[0]["query"]).toBe(
|
|
'AND(FIND(LOWER("Hello"),LOWER({title}))!=0)',
|
|
);
|
|
});
|
|
|
|
it("correct case-insensitive not contains filter", async () => {
|
|
const filter = {
|
|
operator: "ncontains",
|
|
field: "title",
|
|
value: "Hello",
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// must not find lower-cased string in lower-cased {field} - lower-casing both values makes it case-insensitive
|
|
expect(response.data[0]["query"]).toBe(
|
|
'AND(FIND(LOWER("Hello"),LOWER({title}))=0)',
|
|
);
|
|
});
|
|
|
|
it("correct truthy null filter", async () => {
|
|
const filter = {
|
|
operator: "null",
|
|
field: "title",
|
|
value: undefined,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must be null (blank)
|
|
expect(response.data[0]["query"]).toBe("AND({title}=BLANK())");
|
|
});
|
|
|
|
it("correct falsy null filter", async () => {
|
|
const filter = {
|
|
operator: "nnull",
|
|
field: "title",
|
|
value: undefined,
|
|
} as const;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must not be null (blank)
|
|
expect(response.data[0]["query"]).toBe("AND({title}!=BLANK())");
|
|
});
|
|
|
|
it.each(["between", "nbetween"] as const)(
|
|
"fails for %s filter",
|
|
async (operator) => {
|
|
const filter = {
|
|
operator,
|
|
field: "age",
|
|
value: [10, 15],
|
|
} as const;
|
|
|
|
await expect(() => {
|
|
return dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
}).rejects.toThrow(
|
|
`Operator ${operator} is not supported for the Airtable data provider`,
|
|
);
|
|
},
|
|
);
|
|
|
|
it.each(["in", "nin"] as const)("fails for %s filter", async (operator) => {
|
|
const filter = {
|
|
operator,
|
|
field: "posts",
|
|
value: ["uuid-1", "uuid-2"],
|
|
} as const;
|
|
|
|
await expect(() => {
|
|
return dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
}).rejects.toThrow(
|
|
`Operator ${operator} is not supported for the Airtable data provider`,
|
|
);
|
|
});
|
|
|
|
it("correct 'or' conditional filter", async () => {
|
|
const filter = {
|
|
operator: "or",
|
|
value: [
|
|
{
|
|
field: "title",
|
|
operator: "eq",
|
|
value: "Silver Bullet",
|
|
},
|
|
{
|
|
field: "title",
|
|
operator: "ne",
|
|
value: "The Mythical Man Month",
|
|
},
|
|
],
|
|
} as ConditionalFilter;
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: [filter],
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
// {field} must either be Silver Bullet or must not be Mythical Man Month
|
|
expect(response.data[0]["query"]).toBe(
|
|
'AND(OR({title}="Silver Bullet",{title}!="The Mythical Man Month"))',
|
|
);
|
|
});
|
|
|
|
it("correct compound 'or' conditional filter", async () => {
|
|
const filters = [
|
|
{
|
|
operator: "or",
|
|
value: [
|
|
{
|
|
field: "title",
|
|
operator: "eq",
|
|
value: "Silver Bullet",
|
|
},
|
|
{
|
|
field: "title",
|
|
operator: "ne",
|
|
value: "The Mythical Man Month",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
operator: "or",
|
|
value: [
|
|
{
|
|
field: "age",
|
|
operator: "gt",
|
|
value: 15,
|
|
},
|
|
{
|
|
field: "age",
|
|
operator: "lt",
|
|
value: 25,
|
|
},
|
|
],
|
|
},
|
|
] as ConditionalFilter[];
|
|
|
|
const response = await dataProvider(
|
|
"keywoytODSr6xAqfg",
|
|
"appKYl1H4k9g73sBT",
|
|
).getList({
|
|
resource: "posts",
|
|
filters: filters,
|
|
});
|
|
|
|
expect(response.total).toBe(1);
|
|
expect(response.data[0]["query"]).toBe(
|
|
'AND(OR({title}="Silver Bullet",{title}!="The Mythical Man Month"),OR({age}>15,{age}<25))',
|
|
);
|
|
});
|
|
});
|