UNPKG

pure-orm

Version:

A SQL Toolkit based on pure business objects passed to and from stateful data access objects

1,186 lines (1,151 loc) 50.4 kB
/* eslint-disable max-len */ import { createCore } from './core'; import { entities as orderEntities } from '../test-utils/order/entities'; import { entities as blogEntities } from '../test-utils/blog/entities'; import { entities as orderMoreEntities } from '../test-utils/order-more/entities'; import { entities as nineEntities } from '../test-utils/nine/entities'; import { entities as fiveEntities } from '../test-utils/five/entities'; import { entities as sixEntities } from '../test-utils/six/entities'; import { entities as twelveEntities } from '../test-utils/twelve/entities'; import { entities as thirteenEntities } from '../test-utils/thirteen/entities'; import { entities as fourteenEntities } from '../test-utils/fourteen/entities'; import { Articles } from '../test-utils/blog/models/article'; const two = require('../test-utils/two/results'); const three = require('../test-utils/three/results'); const one = require('../test-utils/one/results.json'); const four = require('../test-utils/four/results.json'); const five = require('../test-utils/five/results.json'); const six = require('../test-utils/six/results.json'); const seven = require('../test-utils/seven/results.json'); const eight = require('../test-utils/eight/results.json'); const nine = require('../test-utils/nine/results.json'); const ten = require('../test-utils/ten/results.json'); const eleven = require('../test-utils/eleven/results.json'); const twelve = require('../test-utils/twelve/results.json'); const thirteen = require('../test-utils/thirteen/results.json'); const fourteen = require('../test-utils/fourteen/results.json'); describe('createFromDatabase', () => { test('multiple rows reduce to one nested object (with all one-to-one or one-to-many tables)', () => { const core = createCore({ entities: orderEntities }); const orders = core.createFromDatabase(one); expect(orders.models.length).toEqual(1); const order = orders.models[0]; expect(order?.id).toEqual(3866); expect(order?.utmSource.id).toEqual(6); expect(order?.lineItems.models.length).toEqual(6); expect(order.lineItems.models[0].id).toEqual(2271); expect(order.lineItems.models[0].productVariant.id).toEqual(163); expect(order.lineItems.models[0].productVariant.product.id).toEqual(1); expect(order.lineItems.models[1].id).toEqual(2272); expect(order.lineItems.models[1].productVariant.id).toEqual(186); expect(order.lineItems.models[1].productVariant.product.id).toEqual(1); expect(order.lineItems.models[2].id).toEqual(2273); expect(order.lineItems.models[2].productVariant.id).toEqual(213); expect(order.lineItems.models[2].productVariant.product.id).toEqual(1); expect(order.lineItems.models[3].id).toEqual(2274); expect(order.lineItems.models[3].productVariant.id).toEqual(207); expect(order.lineItems.models[3].productVariant.product.id).toEqual(1); expect(order.lineItems.models[4].id).toEqual(2275); expect(order.lineItems.models[4].productVariant.id).toEqual(296); expect(order.lineItems.models[4].productVariant.product.id).toEqual(5); expect(order.lineItems.models[5].id).toEqual(2276); expect(order.lineItems.models[5].productVariant.id).toEqual(308); expect(order.lineItems.models[5].productVariant.product.id).toEqual(3); }); test('createFromDatabase where multiple rows reduce to one nested object (with many-to-many tables)', () => { const core = createCore({ entities: blogEntities }); const articles = core.createFromDatabase(two); expect(articles.models.length).toEqual(1); const article = articles.models[0]; expect(article.id).toEqual(14); expect(article.person.id).toEqual(8); expect(article.articleTags.models.length).toEqual(10); expect(article.articleTags.models[0].id).toEqual(36); expect(article.articleTags.models[0].tag.id).toEqual(3); expect(article.articleTags.models[1].id).toEqual(37); expect(article.articleTags.models[1].tag.id).toEqual(4); expect(article.articleTags.models[2].id).toEqual(38); expect(article.articleTags.models[2].tag.id).toEqual(5); expect(article.articleTags.models[3].id).toEqual(39); expect(article.articleTags.models[3].tag.id).toEqual(6); expect(article.articleTags.models[4].id).toEqual(40); expect(article.articleTags.models[4].tag.id).toEqual(7); expect(article.articleTags.models[5].id).toEqual(41); expect(article.articleTags.models[5].tag.id).toEqual(8); expect(article.articleTags.models[6].id).toEqual(42); expect(article.articleTags.models[6].tag.id).toEqual(9); expect(article.articleTags.models[7].id).toEqual(43); expect(article.articleTags.models[7].tag.id).toEqual(11); expect(article.articleTags.models[8].id).toEqual(44); expect(article.articleTags.models[8].tag.id).toEqual(12); expect(article.articleTags.models[9].id).toEqual(45); expect(article.articleTags.models[9].tag.id).toEqual(16); }); test('multiple rows reduce to many rows with nested objects (with many-to-many tables)', () => { const core = createCore({ entities: blogEntities }); const articles = core.createFromDatabase(three); expect(Array.isArray(articles.models)).toBe(true); expect(articles instanceof Articles).toBe(true); expect(articles.models.length).toEqual(2); const first = articles.models[0]; expect(first.person.id).toEqual(8); expect(first.articleTags.models.length).toEqual(10); expect(first.articleTags.models[0].id).toEqual(36); expect(first.articleTags.models[0].tag.id).toEqual(3); expect(first.articleTags.models[1].id).toEqual(37); expect(first.articleTags.models[1].tag.id).toEqual(4); expect(first.articleTags.models[2].id).toEqual(38); expect(first.articleTags.models[2].tag.id).toEqual(5); expect(first.articleTags.models[3].id).toEqual(39); expect(first.articleTags.models[3].tag.id).toEqual(6); expect(first.articleTags.models[4].id).toEqual(40); expect(first.articleTags.models[4].tag.id).toEqual(7); expect(first.articleTags.models[5].id).toEqual(41); expect(first.articleTags.models[5].tag.id).toEqual(8); expect(first.articleTags.models[6].id).toEqual(42); expect(first.articleTags.models[6].tag.id).toEqual(9); expect(first.articleTags.models[7].id).toEqual(43); expect(first.articleTags.models[7].tag.id).toEqual(11); expect(first.articleTags.models[8].id).toEqual(44); expect(first.articleTags.models[8].tag.id).toEqual(12); expect(first.articleTags.models[9].id).toEqual(45); expect(first.articleTags.models[9].tag.id).toEqual(16); const second = articles.models[1]; expect(second.id).toEqual(12); expect(second.person.id).toEqual(17); expect(second.articleTags.models.length).toEqual(3); expect(second.articleTags.models[0].id).toEqual(33); expect(second.articleTags.models[0].tag.id).toEqual(1); expect(second.articleTags.models[1].id).toEqual(34); expect(second.articleTags.models[1].tag.id).toEqual(5); expect(second.articleTags.models[2].id).toEqual(35); expect(second.articleTags.models[2].tag.id).toEqual(15); }); // Tests for where a deeply nested node which points to a node, is itself // reused (not recreated each time) so that nodes pointing to it all stack // together on it, rather than each attaching to different replica nodes // which overwrite themselves on the node it points to. // The example here is with the productVariant node being reused so that // productVariantImages append to it, instead of each productVariantImage // living on its own productVariant (which would keep overwriting itself // on the actualProductVariant node). test('node is already seen', () => { const core = createCore({ entities: orderMoreEntities }); const inventoryLevels = core.createFromDatabase(four); expect(inventoryLevels).toBeDefined(); const first = inventoryLevels?.models[0]; expect(first?.id).toEqual(15); expect(first?.actualProductVariant.id).toEqual(120); expect(first?.actualProductVariant.productVariants.models.length).toEqual( 1 ); expect( first?.actualProductVariant.productVariants.models[0] .actualProductVariantId ).toEqual(120); // I think the above test is good enough, and not sure I actual care about below // expect(first.actualProductVariant.productVariants.models[0].actualProductVariant.id).toEqual(120); expect(first?.actualProductVariant.productVariants.models[0].id).toEqual( 199 ); expect( first?.actualProductVariant.productVariants.models[0].color.id ).toEqual(1); expect( first?.actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( first?.actualProductVariant.productVariants.models[0].product.id ).toEqual(1); expect( first?.actualProductVariant.productVariants.models[0].size.id ).toEqual(4); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models.length ).toEqual(7); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[0].id ).toEqual(621); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[1].id ).toEqual(709); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[2].id ).toEqual(797); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[3].id ).toEqual(885); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[4].id ).toEqual(973); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[5].id ).toEqual(1061); expect( first?.actualProductVariant.productVariants.models[0].productVariantImages .models[6].id ).toEqual(1149); const second = inventoryLevels?.models[1]; expect(second?.id).toEqual(35); expect(second?.actualProductVariant.id).toEqual(125); expect(second?.actualProductVariant.productVariants.models.length).toEqual( 1 ); expect( second?.actualProductVariant.productVariants.models[0] .actualProductVariantId ).toEqual(125); // I think the above test is good enough, and not sure I actual care about below // expect(second.actualProductVariant.productVariants.models[0].actualProductVariant.id).toEqual(125); expect(second?.actualProductVariant.productVariants.models[0].id).toEqual( 209 ); expect( second?.actualProductVariant.productVariants.models[0].color.id ).toEqual(1); expect( second?.actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( second?.actualProductVariant.productVariants.models[0].product.id ).toEqual(1); expect( second?.actualProductVariant.productVariants.models[0].size.id ).toEqual(9); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models.length ).toEqual(7); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[0].id ).toEqual(679); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[1].id ).toEqual(767); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[2].id ).toEqual(855); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[3].id ).toEqual(943); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[4].id ).toEqual(1031); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[5].id ).toEqual(1119); expect( second?.actualProductVariant.productVariants.models[0] .productVariantImages.models[6].id ).toEqual(1207); }); // Test for a nested object (eg, parcel) with objects in it that referenced to // it (eg, parcel_events), correctly placing the objects (parcel_events) in // its (parcel) collection of models, and not errantly placing the established // parent node (parcel) as a direct reference of the child (parcel_event). // For example: the errant behavior was: // Parcel1 // ParcelEvent1 // Parcel1 // ParcelEvent2 // Instead of: // Parcel1 // ParcelEvent1 // ParcelEvent2 // NOTE: if this test ever breaks, you can widdle the five.json file to just // the two relevant line items of the one relevant order. This test should // be doing that, but since code coverage all-around isn't great and I already // had this fuller json dump from production, I just used it all - YOLO. test('a deeply nested models property was misbehaving', () => { const core = createCore({ entities: fiveEntities }); const orders = core.createFromDatabase(five); // The assertion that failed when the bug was present expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(2); // Lots of other assertions that are unrelated and shouldn't be here except // I'm insecure about the lack of tests so just going at it cause I can. expect(orders?.models[0].id).toEqual(14219); expect(orders?.models[0].email).toEqual('tswift@kujo.com'); expect(orders?.models[0].lineItems.models.length).toEqual(2); expect(orders?.models[0].lineItems.models[0].id).toEqual(17298); expect(orders?.models[0].lineItems.models[0].orderId).toEqual(14219); expect(orders?.models[0].lineItems.models[1].id).toEqual(17297); expect(orders?.models[0].lineItems.models[1].orderId).toEqual(14219); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models.length ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].id ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcelId ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].lineItemId ).toEqual(17297); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel.id ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(2); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[0].id ).toEqual(3); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[0].parcelId ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[0].status ).toEqual('in_transit'); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[1].id ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[1].parcelId ).toEqual(1); expect( orders?.models[0].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[1].status ).toEqual('placed'); expect(orders?.models[1].id).toEqual(13888); expect(orders?.models[1].email).toEqual('tswift@kujo.com'); expect(orders?.models[1].lineItems.models.length).toEqual(1); expect(orders?.models[1].lineItems.models[0].id).toEqual(16900); expect(orders?.models[1].lineItems.models[0].orderId).toEqual(13888); }); // Problem: // Parcel // ParcelLineItem // LineItem // Order // Customer // ParcelLineItem // LineItem // [MISSING ORDER] // Issue occcurs in nestClump // Problem only surfaced when custom was included test('a deeply nested models property was misbehaving', () => { const core = createCore({ entities: sixEntities }); const parcels = core.createFromDatabase(six); expect(parcels.models.length).toEqual(1); const parcel = parcels.models[0]; // The assertion that failed when the bug was present expect(parcel.parcelLineItems.models[1].lineItem.order).toBeDefined(); // Lots of other assertions that are unrelated and shouldn't be here except // I'm insecure about the lack of tests so just going at it cause I can. expect(parcel.id).toEqual(1); expect(parcel.parcelLineItems.models.length).toEqual(2); expect(parcel.parcelLineItems.models[0].id).toEqual(604); expect(parcel.parcelLineItems.models[0].lineItem.id).toEqual(17298); expect(parcel.parcelLineItems.models[0].lineItem.order.id).toEqual(14219); expect(parcel.parcelLineItems.models[0].lineItem.order.customer.id).toEqual( 5390 ); expect( parcel.parcelLineItems.models[0].lineItem.order.customer.email ).toEqual('tswift@kujo.com'); expect(parcel.parcelLineItems.models[1].id).toEqual(605); expect(parcel.parcelLineItems.models[1].lineItem.id).toEqual(17297); expect(parcel.parcelLineItems.models[1].lineItem.order.id).toEqual(14219); expect(parcel.parcelLineItems.models[1].lineItem.order.customer.id).toEqual( 5390 ); expect( parcel.parcelLineItems.models[1].lineItem.order.customer.email ).toEqual('tswift@kujo.com'); }); // Problem: // InventoryLevel // ActualProductVariant // ProductVariant(1) // Color // ProductVariant(2) // Instead of: // InventoryLevel // ActualProductVariant // ProductVariant // Color // ProductVariant(2) // Color // Issue occcurs in nestClump test('a deeply nested models property was attaching to wrong parent', () => { const core = createCore({ entities: orderMoreEntities }); const inventoryLevels = core.createFromDatabase(seven); expect(inventoryLevels.models.length).toEqual(1); const inventoryLevel = inventoryLevels.models[0]; // The assertion that failed when the bug was present expect( inventoryLevel.actualProductVariant.productVariants.models[1] ).toBeDefined(); // Lots of other assertions that are unrelated and shouldn't be here except // I'm insecure about the lack of tests so just going at it cause I can. expect(inventoryLevel.id).toEqual(30); expect(inventoryLevel.actualProductVariant.id).toEqual(15); expect( inventoryLevel.actualProductVariant.productVariants.models.length ).toEqual(2); expect( inventoryLevel.actualProductVariant.productVariants.models[0].id ).toEqual(179); expect( inventoryLevel.actualProductVariant.productVariants.models[0].color.id ).toEqual(4); expect( inventoryLevel.actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( inventoryLevel.actualProductVariant.productVariants.models[0].size.id ).toEqual(8); expect( inventoryLevel.actualProductVariant.productVariants.models[1].id ).toEqual(180); expect( inventoryLevel.actualProductVariant.productVariants.models[1].color.id ).toEqual(4); expect( inventoryLevel.actualProductVariant.productVariants.models[1].gender.id ).toEqual(2); expect( inventoryLevel.actualProductVariant.productVariants.models[1].size.id ).toEqual(11); }); // Problem: // Shipment // ShipmentActualProductVariant // ActualProductVariant // ProductVariant(1) // Product // ProductVariant(2) // ShipmentActualProductVariant // ActualProductVariant // Instead of: // Shipment // ShipmentActualProductVariant // ActualProductVariant // ProductVariant(1) // Product // ShipmentActualProductVariant // ActualProductVariant // ProductVariant(2) // Product // Issue occcurs in nestClump test('a deeply nested models property was attaching to wrong parent 2', () => { const core = createCore({ entities: orderMoreEntities }); const shipments = core.createFromDatabase(eight); // The assertion that failed when the bug was present expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants ).toBeDefined(); // IN ADDITION TO ABOVE ASSERTION and helpful test description of what is // being tested, the below tests tease out some logic that was hitherto // incorrect. This "some logic" should be defined and have separate tests // and jazz, but my brain hurts so TLDR these below tests are important but // (somewhat?) unrelated to the example/assertion above. "Are you serious?!" expect(shipments?.models.length).toEqual(2); expect(shipments?.models[0].id).toEqual(19); expect( shipments?.models[0].shipmentActualProductVariants.models.length ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[0].id ).toEqual(25); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.id ).toEqual(65); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models.length ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].id ).toEqual(310); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].product.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].size.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].color.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].id ).toEqual(309); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].product.id ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].size.id ).toEqual(4); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].color.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].gender.id ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[1].id ).toEqual(26); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.id ).toEqual(25); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models.length ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[0].id ).toEqual(194); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[0].product.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[0].size.id ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[0].color.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[1].id ).toEqual(195); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[1].product.id ).toEqual(2); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[1].size.id ).toEqual(5); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[1].color.id ).toEqual(1); expect( shipments?.models[0].shipmentActualProductVariants.models[1] .actualProductVariant.productVariants.models[1].gender.id ).toEqual(2); expect(shipments?.models[1].id).toEqual(18); expect( shipments?.models[1].shipmentActualProductVariants.models.length ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0].id ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.id ).toEqual(25); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models.length ).toEqual(2); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].id ).toEqual(194); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].product.id ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].size.id ).toEqual(2); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].color.id ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[0].gender.id ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].id ).toEqual(195); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].product.id ).toEqual(2); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].size.id ).toEqual(5); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].color.id ).toEqual(1); expect( shipments?.models[1].shipmentActualProductVariants.models[0] .actualProductVariant.productVariants.models[1].gender.id ).toEqual(2); }); // Issue occcurs in nestClump // Problem is with only top level nodes test('just top level nodes', () => { const core = createCore({ entities: nineEntities }); let featureSwitches; try { // This failed when the bug was present featureSwitches = core.createFromDatabase(nine); } catch (e) { expect(e).not.toBeDefined(); } expect(featureSwitches).toBeDefined(); // Lots of other assertions that are unrelated and shouldn't be here except // I'm insecure about the lack of tests so just going at it cause I can. expect(featureSwitches?.models.length).toEqual(2); expect(featureSwitches?.models[0].id).toEqual('google_one_tap_sign_in'); expect(featureSwitches?.models[1].id).toEqual('website_live_chat'); }); // Issue occcurs in nestClump // Problem is when oldest parent is an empty join record and is not included // which results in the oldest parent search returning -1 and parent heirarchy // is thus messed up. test('10', () => { const core = createCore({ entities: orderMoreEntities }); let orders; try { // This failed when the bug was present orders = core.createFromDatabase(ten); } catch (e) { expect(e).not.toBeDefined(); } expect(orders).toBeDefined(); // Lots of other assertions that are unrelated and shouldn't be here except // I'm insecure about the lack of tests so just going at it cause I can. expect(orders?.models.length).toEqual(5); expect(orders?.models[0].id).toEqual(24591); expect(orders?.models[0].customer.id).toEqual(5390); expect(orders?.models[0].physicalAddress.id).toEqual(48982); expect(orders?.models[0].lineItems.models.length).toEqual(1); expect(orders?.models[0].lineItems.models[0].id).toEqual(29883); expect(orders?.models[0].lineItems.models[0].productVariant.id).toEqual( 158 ); expect( orders?.models[0].lineItems.models[0].productVariant.product.id ).toEqual(1); expect( orders?.models[0].lineItems.models[0].productVariant.size.id ).toEqual(9); expect( orders?.models[0].lineItems.models[0].productVariant.color.id ).toEqual(3); expect( orders?.models[0].lineItems.models[0].productVariant.gender.id ).toEqual(1); expect( orders?.models[0].lineItems.models[0].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[0].lineItems.models[0].productVariant.productVariantImages .models[0].id ).toEqual(17); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models.length ).toEqual(1); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].id ).toEqual(6100); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel.id ).toEqual(5942); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(14); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[0].id ).toEqual(193775); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[1].id ).toEqual(193774); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[2].id ).toEqual(193773); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[3].id ).toEqual(193425); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[4].id ).toEqual(193424); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[5].id ).toEqual(193423); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[6].id ).toEqual(192713); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[7].id ).toEqual(192712); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[8].id ).toEqual(192711); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[9].id ).toEqual(192709); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[10].id ).toEqual(192171); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[11].id ).toEqual(192170); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[12].id ).toEqual(192169); expect( orders?.models[0].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[13].id ).toEqual(191790); expect(orders?.models[1].id).toEqual(24589); expect(orders?.models[1].customer.id).toEqual(5390); expect(orders?.models[1].physicalAddress.id).toEqual(48982); expect(orders?.models[1].lineItems.models.length).toEqual(1); expect(orders?.models[1].lineItems.models[0].id).toEqual(29880); expect(orders?.models[1].lineItems.models[0].productVariant.id).toEqual( 158 ); expect( orders?.models[1].lineItems.models[0].productVariant.product.id ).toEqual(1); expect( orders?.models[1].lineItems.models[0].productVariant.size.id ).toEqual(9); expect( orders?.models[1].lineItems.models[0].productVariant.color.id ).toEqual(3); expect( orders?.models[1].lineItems.models[0].productVariant.gender.id ).toEqual(1); expect( orders?.models[1].lineItems.models[0].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[1].lineItems.models[0].productVariant.productVariantImages .models[0].id ).toEqual(17); expect(orders?.models[2].id).toEqual(24587); expect(orders?.models[2].customer.id).toEqual(5390); expect(orders?.models[2].physicalAddress.id).toEqual(28145); expect(orders?.models[2].lineItems.models.length).toEqual(1); expect(orders?.models[2].lineItems.models[0].id).toEqual(29877); expect(orders?.models[2].lineItems.models[0].productVariant.id).toEqual( 158 ); expect( orders?.models[2].lineItems.models[0].productVariant.product.id ).toEqual(1); expect( orders?.models[2].lineItems.models[0].productVariant.size.id ).toEqual(9); expect( orders?.models[2].lineItems.models[0].productVariant.color.id ).toEqual(3); expect( orders?.models[2].lineItems.models[0].productVariant.gender.id ).toEqual(1); expect( orders?.models[2].lineItems.models[0].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[2].lineItems.models[0].productVariant.productVariantImages .models[0].id ).toEqual(17); expect( orders?.models[2].lineItems.models[0].parcelLineItems.models.length ).toEqual(1); expect( orders?.models[2].lineItems.models[0].parcelLineItems.models[0].id ).toEqual(6070); expect( orders?.models[2].lineItems.models[0].parcelLineItems.models[0].parcel.id ).toEqual(5914); expect( orders?.models[2].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(1); expect( orders?.models[2].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[0].id ).toEqual(189194); expect(orders?.models[3].id).toEqual(14219); expect(orders?.models[3].customer.id).toEqual(5390); expect(orders?.models[3].physicalAddress.id).toEqual(28145); expect(orders?.models[3].lineItems.models.length).toEqual(2); expect(orders?.models[3].lineItems.models[0].id).toEqual(17298); expect(orders?.models[3].lineItems.models[0].productVariant.id).toEqual( 353 ); expect( orders?.models[3].lineItems.models[0].productVariant.product.id ).toEqual(8); expect( orders?.models[3].lineItems.models[0].productVariant.size.id ).toEqual(20); expect( orders?.models[3].lineItems.models[0].productVariant.color.id ).toEqual(10); expect( orders?.models[3].lineItems.models[0].productVariant.gender.id ).toEqual(3); expect( orders?.models[3].lineItems.models[0].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[3].lineItems.models[0].productVariant.productVariantImages .models[0].id ).toEqual(789); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models.length ).toEqual(1); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].id ).toEqual(3338); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].parcel.id ).toEqual(3304); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(3); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[0].id ).toEqual(87279); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[1].id ).toEqual(87278); expect( orders?.models[3].lineItems.models[0].parcelLineItems.models[0].parcel .parcelEvents.models[2].id ).toEqual(84361); expect(orders?.models[3].lineItems.models[1].id).toEqual(17297); expect(orders?.models[3].lineItems.models[1].productVariant.id).toEqual( 344 ); expect( orders?.models[3].lineItems.models[1].productVariant.product.id ).toEqual(6); expect( orders?.models[3].lineItems.models[1].productVariant.size.id ).toEqual(22); expect( orders?.models[3].lineItems.models[1].productVariant.color.id ).toEqual(8); expect( orders?.models[3].lineItems.models[1].productVariant.gender.id ).toEqual(3); expect( orders?.models[3].lineItems.models[1].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[3].lineItems.models[1].productVariant.productVariantImages .models[0].id ).toEqual(780); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models.length ).toEqual(1); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].id ).toEqual(2311); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].parcel.id ).toEqual(2317); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models.length ).toEqual(3); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[0].id ).toEqual(52627); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[1].id ).toEqual(52626); expect( orders?.models[3].lineItems.models[1].parcelLineItems.models[0].parcel .parcelEvents.models[2].id ).toEqual(48326); expect(orders?.models[4].id).toEqual(13888); expect(orders?.models[4].customer.id).toEqual(5390); expect(orders?.models[4].physicalAddress.id).toEqual(7608); expect(orders?.models[4].lineItems.models.length).toEqual(1); expect(orders?.models[4].lineItems.models[0].id).toEqual(16900); expect(orders?.models[4].lineItems.models[0].productVariant.id).toEqual( 363 ); expect( orders?.models[4].lineItems.models[0].productVariant.product.id ).toEqual(5); expect( orders?.models[4].lineItems.models[0].productVariant.size.id ).toEqual(8); expect( orders?.models[4].lineItems.models[0].productVariant.color.id ).toEqual(12); expect( orders?.models[4].lineItems.models[0].productVariant.gender.id ).toEqual(1); expect( orders?.models[4].lineItems.models[0].productVariant.productVariantImages .models.length ).toEqual(1); expect( orders?.models[4].lineItems.models[0].productVariant.productVariantImages .models[0].id ).toEqual(829); }); // Issue occcurs in nestClump // Problem from early returning not logging bo so parent hierarcy was missing it test('11', () => { const core = createCore({ entities: orderMoreEntities }); let orders; try { // This failed when the bug was present orders = core.createFromDatabase(eleven); } catch (e) { expect(e).not.toBeDefined(); } expect(orders).toBeDefined(); }); // Issue occcurs in nestClump // Problem when a table references another model twice (two columns) test('12', () => { const core = createCore({ entities: twelveEntities }); let prompt; try { // This failed when the bug was present prompt = core.createFromDatabase(twelve); } catch (e) { expect(e).not.toBeDefined(); } expect(prompt).toBeDefined(); // Ideally the below should work // expect(prompt.fromMember.id).toEqual(1); }); // Issue occcurs in nestClump // Problem when a table has records that are supposed to nest under root // but nest under other stuff below it instead // Member // Recommendations [1] // Brand // Recommendations [1] // Passion // Recommendations [2] // -- instead of correct -- // Member // Recommendations[4] // Brand // Passion test('13', () => { const core = createCore({ entities: thirteenEntities }); const members = core.createFromDatabase(thirteen); const member = members?.models[0]; expect(member?.recommendations.models.length).toEqual(4); expect(member?.recommendations.models[0].brand.id).toEqual(2); expect(member?.recommendations.models[0].product.id).toEqual(7); expect(member?.recommendations.models[0].category.id).toEqual(1); expect( member?.recommendations.models[0].recommendationAudiences.models[0] .audience.id ).toEqual(1); expect(member?.recommendations.models[1].brand.id).toEqual(2); expect(member?.recommendations.models[1].product.id).toEqual(1); expect(member?.recommendations.models[1].category.id).toEqual(2); expect( member?.recommendations.models[1].recommendationAudiences.models[0] .audience.id ).toEqual(1); expect(member?.recommendations.models[2].brand.id).toEqual(3); expect(member?.recommendations.models[2].product.id).toEqual(27); expect(member?.recommendations.models[2].category.id).toEqual(3); expect( member?.recommendations.models[2].recommendationAudiences.models[0] .audience.id ).toEqual(1); expect(member?.recommendations.models[3].brand.id).toEqual(6); expect(member?.recommendations.models[3].product.id).toEqual(75); expect(member?.recommendations.models[3].category.id).toEqual(4); expect( member?.recommendations.models[3].recommendationAudiences.models[0] .audience.id ).toEqual(1); }); // Issue occcurs in nestClump // Problem when a table has two columns which reference the same other table test('14', () => { const core = createCore({ entities: fourteenEntities }); const persons = core.createFromDatabase(fourteen); expect(persons?.models.length).toEqual(1); expect(persons.models[0].id).toEqual(67); // Known issue: A reference always uses the model's name, // instead of some version of the column's name expect(persons.models[0].customers?.models.length).toEqual(1); expect(persons.models[0].customers.models[0].id).toEqual(4); }); }); describe('createOneFromDatabase', () => { test('reduces to one', () => { const core = createCore({ entities: orderEntities }); const order = core.createOneFromDatabase(one); expect(order instanceof orderEntities[0].Model).toBe(true); }); test('throws when less than one', () => { const core = createCore({ entities: blogEntities }); expect(() => core.createOneFromDatabase([])).toThrow(); }); test('throws when more than one', () => { const core = createCore({ entities: blogEntities }); expect(() => core.createOneFromDatabase(three)).toThrow(); }); }); describe('createOneOrNoneFromDatabase', () => { test('reduces to one', () => { const core = createCore({ entities: orderEntities }); const order = core.createOneOrNoneFromDatabase(one); expect(order instanceof orderEntities[0].Model).toBe(true); }); test('returns undefined when less than one', () => { const core = createCore({ entities: blogEntities }); expect(core.createOneOrNoneFromDatabase([])).toEqual(void 0); }); test('throws when more than one', () => { const core = createCore({ entities: blogEntities }); expect(() => core.createOneOrNoneFromDatabase(three)).toThrow(); }); }); describe('createManyFromDatabase', () => { test('one result', () => { const core = createCore({ entities: orderEntities }); const orders = core.createManyFromDatabase(one); expect(orders instanceof orderEntities[0].Collection).toBe(true); expect(Array.isArray(orders.models)).toBe(true); expect(orders.models.length).toEqual(1); }); test('throws when less than one', () => { const core = createCore({ entities: blogEntities }); expect(() => core.createManyFromDatabase([])).toThrow(); }); test('more than one', () => { const core = createCore({ entities: blogEntities }); const articles = core.createManyFromDatabase(three); expect(articles instanceof blogEntities[0].Collection).toBe(true); expect(Array.isArray(articles.models)).toBe(true); expect(articles.models.length).toEqual(2); }); }); describe('createAnyFromDatabase', () => { test('one result', () => { const core = createCore({ entities: orderEntities }); const orders = core.createAnyFromDatabase(one, orderEntities[0].Model); expect(orders instanceof orderEntities[0].Collection).toBe(true); expect(Array.isArray(orders.models)).toBe(true); expect(orders.models.length).toEqual(1); }); test('less than one using table name', () => { const core = createCore({ entities: blogEntities }); const articles = core.createAnyFromDatabase([], blogEntities[0].tableName); expect(articles instanceof blogEntities[0].Collection).toBe(true); expect(Array.isArray(articles.models)).toBe(true); expect(articles.models.length).toEqual(0); }); test('less than one using model class', () => { const core = createCore({ entities: blogEntities }); const articles = core.createAnyFromDatabase([], blogEntities[0].Model); expect(articles instanceof blogEntities[0].Collection).toBe(true); expect(Array.isArray(articles.models)).toBe(true); expect(articles.models.length).toEqual(0); }); test('more than one', () => { const core = createCore({ entities: blogEntities }); const articles = core.createAnyFromDatabase(three, blogEntities[0].Model); expect(articles instanceof blogEntities[0].Collection).toBe(true); expect(Array.isArray(articles.models)).toBe(true); expect(articles.models.length).toEqual(2); }); }); test('tables', () => { const core = createCore({ entities: orderEntities }); expect(Object.keys(core.tables).length).toEqual(5); expect(core.tables.utmSource.columns).toEqual( '"utm_source".id as "utm_source#id", "utm_source".value as "utm_source#value", "utm_source".label as "utm_source#label", "utm_source".internal as "utm_source#internal"' ); expect(core.tables.order.columns).toEqual( '"order".id as "order#id", "order".email as "order#email", "order".browser_ip as "order#browser_ip", "order".browser_user_agent as "order#browser_user_agent", "order".kujo_imported_date as "order#kujo_imported_date", "order".created_date as "order#created_date", "order".cancel_reason as "order#cancel_reason", "order".cancelled_date as "order#cancelled_date", "order".closed_date as "order#closed_date", "order".processed_date as "order#processed_date", "order".updated_date as "order#updated_date", "order".note as "order#note", "order".subtotal_price as "order#subtotal_price", "order".taxes_included as "order#taxes_included", "order".total_discounts as "order#total_discounts", "order".total_price as "order#total_price", "order".total_tax as "order#total_tax", "order".total_weight as "order#total_weight", "order".order_status_url as "order#order_status_url", "order".utm_source_id as "order#utm_source_id", "order".utm_medium_id as "order#utm_medium_id", "order".utm_campaign as "order#utm_campaign", "order".utm_content as "order#utm_content", "order".utm_term as "order#utm_term"' ); expect(core.tables.lineItem.columns).toEqual( '"line_item".id as "line_item#id", "line_item".product_variant_id as "line_item#product_variant_id", "line_item".order_id as "line_item#order_id", "line_item".fulfillment_status_id as "line_item#fulfillment_status_id", "line_item".fulfillable_quantity as "line_item#fulfillable_quantity", "line_item".fulfillment_service as "line_item#fulfillment_service", "line_item".grams as "line_item#grams", "line_item".price as "line_item#price", "line_item".quantity as "line_item#quantity", "line_item".requires_shipping as "line_item#requires_shipping", "line_item".taxable as "line_item#taxable", "line_item".total_discount as "line_item#total_discount"' ); expect(core.tables.productVariant.columns).toEqual( '"product_variant".id as "product_variant#id", "product_variant".product_id as "product_variant#product_id", "product_variant".actual_product_variant_id as "product_variant#actual_product_variant_id", "product_variant".color_id as "product_variant#color_id", "product_variant".gender_id as "product_variant#gender_id", "product_variant".size_id as "product_variant#size_id", "product_variant".barcode as "product_variant#barcode", "product_variant".price as "product_variant#price", "product_variant".compare_at_price as "product_variant#compare_at_price", "product_variant".created_date as "product_variant#created_date", "product_variant".updated_date as "product_variant#updated_date", "product_variant".grams as "product_variant#grams", "product_variant".requires_shipping as "product_variant#requires_shipping"' ); expect(core.tables.product.columns).toEqual( '"product"