jinaga
Version:
Data management for web and mobile applications.
95 lines (76 loc) • 4.03 kB
text/typescript
import { JinagaClient, Model, PurgeConditions } from "../../src";
import { createModel, Item, Order, OrderCancelled, OrderCancelledReason, Product, Store } from "../orderModel";
describe("Real-time purge", () => {
it("Should find descendants if purge condition is not met", async () => {
const model = createModel();
const j = givenClientWithPurgeCondition(model);
const store = await j.fact(new Store("storeId"));
const order = await j.fact(new Order(store, new Date()));
const item1 = await j.fact(new Item(order, new Product(store, "product1"), 1));
const item2 = await j.fact(new Item(order, new Product(store, "product2"), 1));
const itemsInOrder = model.given(Order).match(order =>
order.successors(Item, item => item.order)
);
const items = await j.query(itemsInOrder, order);
expect(items).toEqual([item1, item2]);
});
it("Should purge successors when condition is met", async () => {
const model = createModel();
const j = givenClientWithPurgeCondition(model);
const store = await j.fact(new Store("storeId"));
const order = await j.fact(new Order(store, new Date()));
const item1 = await j.fact(new Item(order, new Product(store, "product1"), 1));
const item2 = await j.fact(new Item(order, new Product(store, "product2"), 1));
const orderCancelled = await j.fact(new OrderCancelled(order, new Date()));
const itemsInOrder = model.given(Order).match(order =>
order.successors(Item, item => item.order)
);
const items = await j.query(itemsInOrder, order);
expect(items).toEqual([]);
});
it("Should not purge the trigger fact", async () => {
const model = createModel();
const j = givenClientWithPurgeCondition(model);
const store = await j.fact(new Store("storeId"));
const order = await j.fact(new Order(store, new Date()));
const item1 = await j.fact(new Item(order, new Product(store, "product1"), 1));
const item2 = await j.fact(new Item(order, new Product(store, "product2"), 1));
const orderCancelled = await j.fact(new OrderCancelled(order, new Date()));
const cancelOfOrder = model.given(Order).match(order =>
order.successors(OrderCancelled, cancelled => cancelled.order)
);
const cancels = await j.query(cancelOfOrder, order);
expect(cancels).toEqual([orderCancelled]);
});
it("Should not purge ancestors of the trigger fact", async () => {
const model = createModel();
const j = createJinagaClient(p => p
.whenExists(model.given(Order).match(order =>
order.successors(OrderCancelledReason, reason => reason.orderCancelled.order)
))
);
const store = await j.fact(new Store("storeId"));
const order = await j.fact(new Order(store, new Date()));
const item1 = await j.fact(new Item(order, new Product(store, "product1"), 1));
const item2 = await j.fact(new Item(order, new Product(store, "product2"), 1));
const orderCancelled = await j.fact(new OrderCancelled(order, new Date()));
const reason = await j.fact(new OrderCancelledReason(orderCancelled, "reason"));
const cancelOfOrder = model.given(Order).match(order =>
order.successors(OrderCancelled, cancelled => cancelled.order)
);
const cancels = await j.query(cancelOfOrder, order);
expect(cancels).toEqual([orderCancelled]);
});
});
function givenClientWithPurgeCondition(model: Model) {
return createJinagaClient(p => p
.whenExists(model.given(Order).match((order, facts) => facts.ofType(OrderCancelled)
.join(orderCancelled => orderCancelled.order, order)
))
);
}
function createJinagaClient(purgeConditions: (p: PurgeConditions) => PurgeConditions) {
return JinagaClient.create({
purgeConditions
});
}