budibase/packages/core/test/indexApi.aggregates.spec.js

160 lines
6.2 KiB
JavaScript

import {
setupApphierarchy,
basicAppHierarchyCreator_WithFields_AndIndexes,
} from "./specHelpers"
import { permission } from "../src/authApi/permissions"
describe("aggregates", () => {
it("should calculate correct totals, when no condition supplied", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10)
await createInvoice(20)
await createInvoice(30)
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.all_invoices_by_type.Important.count).toBe(3)
expect(result.all_invoices_by_type.Important.totalIncVat.max).toBe(30)
expect(result.all_invoices_by_type.Important.totalIncVat.min).toBe(10)
expect(result.all_invoices_by_type.Important.totalIncVat.sum).toBe(60)
expect(result.all_invoices_by_type.Important.totalIncVat.mean).toBe(60 / 3)
})
it("should split totals into correct groups", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10, 0, "Important")
await createInvoice(20, 0, "NotImportant")
await createInvoice(30, 0, "NotImportant")
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.all_invoices_by_type.Important.count).toBe(1)
expect(result.all_invoices_by_type.NotImportant.count).toBe(2)
expect(result.all_invoices_by_type.Important.totalIncVat.sum).toBe(10)
expect(result.all_invoices_by_type.NotImportant.totalIncVat.sum).toBe(50)
})
it("should include all when all match condition", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10, 0, "Important", true)
await createInvoice(10, 0, "Important", true)
await createInvoice(10, 0, "Important", true)
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.written_off.Important.count).toBe(3)
expect(result.written_off.Important.totalIncVat.sum).toBe(30)
})
it("should add to '(none)' when group is blank, null or undefined", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10, 0, "", true)
await createInvoice(10, 0, null, true)
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.all_invoices_by_type["(none)"].count).toBe(2)
expect(result.all_invoices_by_type["(none)"].totalIncVat.sum).toBe(20)
})
it("should not include those that do not match condition", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10, 0, "Important", true)
await createInvoice(10, 0, "Important", true)
await createInvoice(10, 0, "Important", false)
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.written_off.Important.count).toBe(2)
expect(result.written_off.Important.totalIncVat.sum).toBe(20)
})
it("should have 'all' group when no grouping supplied", async () => {
const { createInvoice, indexApi } = await setup()
await createInvoice(10, 0, "Important", true)
await createInvoice(20, 0, "Important", true)
const result = await indexApi.aggregates("/Outstanding Invoices")
expect(result.all_invoices.all.count).toBe(2)
})
it("should calculate correct totals, sharded index - all records", async () => {
const { createInvoice, indexApi, invoicesByOutstandingKey } = await setup()
await createInvoice(10, 0, "Important")
await createInvoice(20, 20, "Important")
await createInvoice(30, 30, "Important")
const result = await indexApi.aggregates(invoicesByOutstandingKey)
expect(result.all_invoices_by_type.Important.count).toBe(3)
expect(result.all_invoices_by_type.Important.totalIncVat.max).toBe(30)
expect(result.all_invoices_by_type.Important.totalIncVat.min).toBe(10)
expect(result.all_invoices_by_type.Important.totalIncVat.sum).toBe(60)
expect(result.all_invoices_by_type.Important.totalIncVat.mean).toBe(60 / 3)
})
it("should calculate correct totals, sharded index - bounded by sharding", async () => {
const { createInvoice, indexApi, invoicesByOutstandingKey } = await setup()
await createInvoice(10, 0, "Important")
await createInvoice(20, 20, "Important")
await createInvoice(30, 30, "Important")
const result = await indexApi.aggregates(
invoicesByOutstandingKey,
{ totalIncVat: 10, paidAmount: 10 },
{ totalIncVat: 10, paidAmount: 10 }
)
expect(result.all_invoices_by_type.Important.count).toBe(2)
expect(result.all_invoices_by_type.Important.totalIncVat.max).toBe(30)
expect(result.all_invoices_by_type.Important.totalIncVat.min).toBe(20)
expect(result.all_invoices_by_type.Important.totalIncVat.sum).toBe(50)
expect(result.all_invoices_by_type.Important.totalIncVat.mean).toBe(50 / 2)
})
it("should throw error when user user does not have permission", async () => {
const { app, indexApi } = await setup()
app.removePermission(permission.readIndex.get("/customer_index"))
let err
try {
await indexApi.aggregates("/customer_index")
} catch (e) {
err = e
}
expect(err).toBeDefined()
expect(err.message.startsWith("Unauthorized")).toBeTruthy()
//expect(indexApi.aggregates("/customer_index")).rejects.toThrow(/Unauthorized/);
})
it("should not depend on having any other permissions", async () => {
const { app, indexApi } = await setup()
app.withOnlyThisPermission(permission.readIndex.get("/customer_index"))
await indexApi.aggregates("/customer_index")
})
})
const setup = async () => {
const { recordApi, app, indexApi } = await setupApphierarchy(
basicAppHierarchyCreator_WithFields_AndIndexes
)
const customer = recordApi.getNew("/customers", "customer")
await recordApi.save(customer)
const createInvoice = async (
totalAmount = 10,
paidAmount = 0,
type = "Important",
writtenOff = false
) => {
const invoice = recordApi.getNew(
`/customers/${customer.id}/invoices`,
"invoice"
)
invoice.totalIncVat = totalAmount
invoice.paidAmount = paidAmount
invoice.invoiceType = type
invoice.isWrittenOff = writtenOff
return await recordApi.save(invoice)
}
const invoicesByOutstandingKey = `/customers/${customer.id}/invoicesByOutstanding`
return { createInvoice, indexApi, invoicesByOutstandingKey, app }
}