@grouparoo/core
Version:
The Grouparoo Core
141 lines (122 loc) • 4.95 kB
text/typescript
import { helper } from "@grouparoo/spec-helper";
import { Property, Source } from "../../../src";
import { PropertyOps } from "../../../src/modules/ops/property";
describe("models/property", () => {
helper.grouparooTestServer({ truncate: true, enableTestPlugin: true });
describe("dependsOn", () => {
/**
* Source: Users Table (userId -> id)
* userID
* email
*
* Source: Purchases Table (userId -> user_id)
* purchasesCount
*
* Source: SupportTickets Table (email -> email
* supportTicketsCount
*
* Source: Queries
* emailDomain (requires email)
*/
let usersTableSource: Source;
let purchasesTableSource: Source;
let supportTicketsTableSource: Source;
let querySource: Source;
let userIdProperty: Property;
let emailProperty: Property;
let purchasesCountProperty: Property;
let supportTicketsCountProperty: Property;
let emailDomainProperty: Property;
beforeAll(async () => {
usersTableSource = await helper.factories.source();
await usersTableSource.setOptions({ table: "users" });
await usersTableSource.bootstrapUniqueProperty({
key: "userId",
type: "integer",
mappedColumn: "id",
});
await usersTableSource.setMapping({ id: "userId" });
await usersTableSource.update({ state: "ready" });
// bootstrapped
userIdProperty = await Property.findOne({
where: { key: "userId" },
});
emailProperty = await Property.create({
key: "email",
type: "string",
unique: true,
sourceId: usersTableSource.id,
});
await emailProperty.setOptions({ column: "email" });
await emailProperty.update({ state: "ready" });
purchasesTableSource = await helper.factories.source();
await purchasesTableSource.setOptions({ table: "purchases" });
await purchasesTableSource.setMapping({ user_id: "userId" });
await purchasesTableSource.update({ state: "ready" });
purchasesCountProperty = await Property.create({
key: "purchases",
type: "integer",
unique: false,
sourceId: purchasesTableSource.id,
});
await purchasesCountProperty.setOptions({ column: "purchases" });
await purchasesCountProperty.update({ state: "ready" });
supportTicketsTableSource = await helper.factories.source();
await supportTicketsTableSource.setOptions({ table: "support_tickets" });
await supportTicketsTableSource.setMapping({ customer_email: "email" });
await supportTicketsTableSource.update({ state: "ready" });
supportTicketsCountProperty = await Property.create({
key: "supportTickets",
type: "integer",
unique: false,
sourceId: supportTicketsTableSource.id,
});
await supportTicketsCountProperty.setOptions({
column: "support_tickets",
});
await supportTicketsCountProperty.update({ state: "ready" });
querySource = await helper.factories.source();
await querySource.setOptions({ table: "x" }); // we don't have a test quey source...
await querySource.setMapping({ x: "userId" });
await querySource.update({ state: "ready" });
emailDomainProperty = await Property.create({
key: "emailDomain",
type: "string",
unique: false,
sourceId: querySource.id,
});
await emailDomainProperty.setOptions({
column:
"select split_part(email, '@', 2) AS domain from users where email = {{{ email }}}",
});
await emailDomainProperty.update({ state: "ready" });
});
test("direct mapping rules do not depend on themselves", async () => {
const dependencies = await PropertyOps.dependencies(userIdProperty);
expect(dependencies.map((rule) => rule.id)).toEqual([]);
});
test("dependent rules of this source", async () => {
const dependencies = await PropertyOps.dependencies(emailProperty);
expect(dependencies.map((rule) => rule.id)).toEqual([userIdProperty.id]);
});
test("dependent rules for another source", async () => {
const dependencies = await PropertyOps.dependencies(
purchasesCountProperty
);
expect(dependencies.map((rule) => rule.id)).toEqual([userIdProperty.id]);
});
test("chained dependent rules for another source", async () => {
const dependencies = await PropertyOps.dependencies(
supportTicketsCountProperty
);
expect(dependencies.map((rule) => rule.id)).toEqual([emailProperty.id]);
});
test("mustache variables reference another rule", async () => {
const dependencies = await PropertyOps.dependencies(emailDomainProperty);
expect(dependencies.map((rule) => rule.id)).toEqual([
userIdProperty.id, // from the mapping
emailProperty.id, // from the mustache rule
]);
});
});
});