From 219a109a0593d3ad59f97727101bf7c6b6ce1d48 Mon Sep 17 00:00:00 2001 From: Kyriakos Barbounakis Date: Thu, 30 Jan 2025 19:35:42 +0200 Subject: [PATCH] validate json objects --- jest.setup.js | 3 +- spec/DateFunctions.spec.js | 13 ++++-- spec/QueryExpression.selectJson.spec.js | 56 ++++++++++++++++++++++++ spec/db/local.db | Bin 2535424 -> 2686976 bytes 4 files changed, 67 insertions(+), 5 deletions(-) diff --git a/jest.setup.js b/jest.setup.js index 92d10b6..51d9b02 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,6 +1,7 @@ +require('dotenv').config(); const { JsonLogger } = require('@themost/json-logger'); const { TraceUtils } = require('@themost/common'); -process.env.NODE_ENV='development'; +process.env.NODE_ENV = 'development'; TraceUtils.useLogger(new JsonLogger()); /* global jest */ jest.setTimeout(30000); \ No newline at end of file diff --git a/spec/DateFunctions.spec.js b/spec/DateFunctions.spec.js index 4ae0885..979ba10 100644 --- a/spec/DateFunctions.spec.js +++ b/spec/DateFunctions.spec.js @@ -1,4 +1,5 @@ import { TestApplication } from './TestApplication'; +import moment from 'moment'; describe('DateFunctions', () => { /** @@ -36,11 +37,13 @@ describe('DateFunctions', () => { it('should use getDay()', async () => { await app.executeInTestTranscaction(async (context) => { let items = await context.model('Order') - .asQueryable().where('orderDate').getDay().equal(15).silent().getItems(); + .asQueryable().where('orderDate').getDate().getDay().equal(15).silent().take(10).getItems(); expect(Array.isArray(items)).toBeTruthy(); expect(items.length).toBeGreaterThan(0); for (const item of items) { - expect(item.orderDate.getDate()).toEqual(15); + const orderDate = item.orderDate; + const dayOfMonth = parseInt(moment.utc(orderDate).format('D'), 10); + expect(dayOfMonth).toEqual(15); } }); }); @@ -52,7 +55,8 @@ describe('DateFunctions', () => { expect(Array.isArray(items)).toBeTruthy(); expect(items.length).toBeGreaterThan(0); for (const item of items) { - expect(item.orderDate.getMonth()).toEqual(3); + const orderMonth = parseInt(moment.utc(item.orderDate).format('M'), 10); + expect(orderMonth).toEqual(4); } }); }); @@ -77,7 +81,8 @@ describe('DateFunctions', () => { expect(Array.isArray(items)).toBeTruthy(); expect(items.length).toBeGreaterThan(0); for (const item of items) { - expect(item.orderDate.getHours()).toEqual(14); + const hour = parseInt(moment.utc(item.orderDate).format('H'), 10); + expect(hour).toEqual(14); } }); }); diff --git a/spec/QueryExpression.selectJson.spec.js b/spec/QueryExpression.selectJson.spec.js index 5f0ecbb..c980cb8 100644 --- a/spec/QueryExpression.selectJson.spec.js +++ b/spec/QueryExpression.selectJson.spec.js @@ -345,4 +345,60 @@ describe('SqlFormatter', () => { }); }); + it('should use jsonObject in ad-hoc queries', async () => { + await app.executeInTestTranscaction(async (context) => { + const {viewAdapter: Orders} = context.model('Order'); + const {viewAdapter: Customers} = context.model('Person'); + const {viewAdapter: OrderStatusTypes} = context.model('OrderStatusType'); + const q = new QueryExpression().select( + 'id', 'orderedItem', 'orderStatus', 'orderDate' + ).from(Orders).join(new QueryEntity(Customers).as('customers')).with( + new QueryExpression().where( + new QueryField('customer').from(Orders) + ).equal( + new QueryField('id').from('customers') + ) + ).join(new QueryEntity(OrderStatusTypes).as('orderStatusTypes')).with( + new QueryExpression().where( + new QueryField('orderStatus').from(Orders) + ).equal( + new QueryField('id').from('orderStatusTypes') + ) + ).where(new QueryField('description').from('customers')).equal('Eric Thomas'); + const select = q.$select[Orders]; + select.push({ + customer: { + $jsonObject: [ + 'familyName', + new QueryField('familyName').from('customers'), + 'givenName', + new QueryField('givenName').from('customers'), + ] + } + }, { + orderStatus: { + $jsonObject: [ + 'name', + new QueryField('name').from('orderStatusTypes'), + 'alternateName', + new QueryField('alternateName').from('orderStatusTypes'), + ] + } + }); + /** + * @type {Array<{id: number, orderedItem: number, orderDate: Date, orderStatus: { name: string, alternateName: string }, customer: {familyName: string, givenName: string}}>} + */ + const items = await context.db.executeAsync(q, []); + expect(items).toBeTruthy(); + for (const item of items) { + expect(item.customer).toBeTruthy(); + expect(item.customer.familyName).toEqual('Thomas'); + expect(item.customer.givenName).toEqual('Eric'); + expect(item.orderStatus).toBeTruthy(); + expect(item.orderStatus.name).toBeTruthy(); + } + + }); + }); + }); diff --git a/spec/db/local.db b/spec/db/local.db index b5ec071b981a3f1ca0eece98a08bdca7c3a2ede0..7f91614a4cde50e5e924546065aa3dd015106b6b 100644 GIT binary patch delta 2413 zcmY+EUu;uV9LIa^={;?s&T7MY9|=bw#@{iB1e+h7Iu2emM$Ovj&XFvbQO ztP|Z7JVy-bqH)m&jSoH%$c|AG;)Br#H8DOYiHR;~Ohk>wheeHvziZCfx#!{gO>T1U z=X}p6X>;Gdj&ixT(bW*~7P?%<)t4eQhPUu~&p%rXPxqxvd^!_H5QAsp_}zqe&b;HY zU*rBBT#QrXI(d)0L*68>k!ysKX);O1$S@foeI!dVq>H3U3uz>^q>_}AGP03GNtgsl zfcOYD|1}rPKg@gPkLGvg9X^`Hhm8qfzsNeF8B0S`)&~6oYl6PQlF*k~9rW|88u~d_ z0X@yip{H0J`dL;A{S1piUt-13PqQNENfv_6u^{vW%ZI+m{LmMe7kZqzp~slZb;xC$ zr{nN&j*dW&(jn*(+7Eq}9)ljHz0haq5$GX$5c)Jd0DX#fKo8P(=mFXa-B0b&C#gO9 z1hq#Wr&ZIu7em|-6G9*!h!^66EP*VA_#w+6%OL?s9wZ;K0>wA!{HZ zNEosfvJO%NSr3UoqL5<921p6S;=DK3R>|Fifgg}Tt9UvXYrtq5kH3QZ5HGuHr3_Tb z=PP0#VpPFr#{-{ZgVxOqzJ+h{$d}e{2-WhySJtN()yzaM;~V_S*Va9Rw)5N7;d<s!lXqNK*$A(#z(wl$oE7mw0Kt(P%sax!-*=1zX=mrxSE zs-=zmqc@@^F=(qIwMddD_BTQ)=h|i-xEuNy&*jCu25MKBJ>urOwUupr{+rPI_|-@( zg*r6oekXLFP_WlIH_dNvj+L6|fFO5k1K1upt=~K?NPdb(ME6ho8@e|t0;|`@m8uYXi zdP*o5bj}?RN=F3wtVSLd_dg?)jyri{f_L7@JEyKcYVRhd!CV@1LNG5X6Bp!Y+v&~l zHEb}qfc_Nv85s;OQkk)6gCQZ6c^6U4qfmdrheQmX5B&;HrqCJ*dklm56=^9?TkzX5 z*b+JQ&rmbG;uB^Q;bw#7>*zcU9k9`#0AaZ{e3?Cb6F3OU6ISUbth7(~0KQvc-vRy! zSV-fpk=#O!TcCujmYR!n@;XUgtL%i;6{P55jT=?mh|;rOijFCirBJr$5^ePcO?0Uu zZIT-9)5mUfijM2(EgHH^3fZg;zh8{O~NNYQl~w^ng$l%DNUbW)*qD3mR_L0es~iEdJ)T~fnNeQcvsbeoQD)zB?c zNJ<;tEJdf~3GMm`d!&xtQgo-r?U3C48h4)(ve&*w6ZRUugv&qUOWc^umH6CKS=Ozr JbgAhJ=s%0%JU;*c delta 237 zcmWm4xeftA0D$4$9cCTlzVBOUl{DVKBWxm(Xp|b|ii9WxC83k3MKK=7duaTMulqdj zZhD`Kc`QnMX&Bc0R3BOP@;UkTEcsr$&enBISlV^OqaQd)ZTy>76VVj9w-7tA)w4ez z{E)B_KoB8>p%6h7F~pHT5-FsSK^8gWQ9uzTlu