@nymphjs/nymph 1.0.0-beta.8 → 1.0.0-beta.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +376 -0
- package/README.md +9 -19
- package/dist/Entity.d.ts +269 -7
- package/dist/Entity.js +491 -105
- package/dist/Entity.js.map +1 -1
- package/dist/Entity.test.js +25 -3
- package/dist/Entity.test.js.map +1 -1
- package/dist/Entity.types.d.ts +225 -19
- package/dist/Nymph.d.ts +430 -11
- package/dist/Nymph.js +686 -168
- package/dist/Nymph.js.map +1 -1
- package/dist/Nymph.types.d.ts +65 -7
- package/dist/Nymph.types.js +2 -1
- package/dist/Nymph.types.js.map +1 -1
- package/dist/conf/d.d.ts +30 -0
- package/dist/conf/defaults.js +27 -0
- package/dist/conf/defaults.js.map +1 -1
- package/dist/driver/NymphDriver.d.ts +136 -38
- package/dist/driver/NymphDriver.js +264 -131
- package/dist/driver/NymphDriver.js.map +1 -1
- package/dist/driver/testArtifacts.d.ts +1 -1
- package/dist/driver/testArtifacts.js +493 -51
- package/dist/driver/testArtifacts.js.map +1 -1
- package/dist/errors/EntityInvalidDataError.d.ts +6 -0
- package/dist/errors/EntityInvalidDataError.js +7 -1
- package/dist/errors/EntityInvalidDataError.js.map +1 -1
- package/dist/errors/EntityUniqueConstraintError.d.ts +3 -0
- package/dist/errors/EntityUniqueConstraintError.js +11 -0
- package/dist/errors/EntityUniqueConstraintError.js.map +1 -0
- package/dist/errors/InvalidStateError.d.ts +3 -0
- package/dist/errors/InvalidStateError.js +11 -0
- package/dist/errors/InvalidStateError.js.map +1 -0
- package/dist/errors/QueryFailedError.js +1 -0
- package/dist/errors/QueryFailedError.js.map +1 -1
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/testArtifacts.d.ts +17 -5
- package/dist/testArtifacts.js +31 -27
- package/dist/testArtifacts.js.map +1 -1
- package/dist/testMocks.d.ts +13 -10
- package/dist/testMocks.js +32 -13
- package/dist/testMocks.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +21 -5
- package/dist/utils.js.map +1 -1
- package/package.json +16 -14
- package/src/Entity.test.ts +22 -5
- package/src/Entity.ts +423 -134
- package/src/Entity.types.ts +32 -66
- package/src/Nymph.ts +609 -176
- package/src/Nymph.types.ts +131 -26
- package/src/conf/d.ts +12 -0
- package/src/conf/defaults.ts +31 -0
- package/src/driver/NymphDriver.ts +289 -311
- package/src/driver/testArtifacts.ts +562 -181
- package/src/errors/EntityUniqueConstraintError.ts +6 -0
- package/src/errors/InvalidStateError.ts +6 -0
- package/src/errors/index.ts +4 -0
- package/src/nymphJoiProps.ts +2 -2
- package/src/testArtifacts.ts +18 -19
- package/src/testMocks.ts +55 -30
- package/src/utils.ts +22 -8
- package/tsconfig.json +3 -3
- package/typedoc.json +4 -0
|
@@ -3,18 +3,21 @@ import strtotime from 'locutus/php/datetime/strtotime';
|
|
|
3
3
|
import { guid } from '@nymphjs/guid';
|
|
4
4
|
|
|
5
5
|
import type Nymph from '../Nymph';
|
|
6
|
+
import { EntityUniqueConstraintError } from '../errors';
|
|
6
7
|
import {
|
|
7
8
|
TestBModel as TestBModelClass,
|
|
8
9
|
TestModel as TestModelClass,
|
|
9
10
|
TestModelData,
|
|
11
|
+
TestEmptyModel as TestEmptyModelClass,
|
|
10
12
|
} from '../testArtifacts';
|
|
11
13
|
|
|
12
|
-
export function
|
|
14
|
+
export function EntitiesTest(
|
|
13
15
|
nymph: Nymph,
|
|
14
|
-
it: (name: string, fn: () => void) => void
|
|
16
|
+
it: (name: string, fn: () => void) => void,
|
|
15
17
|
) {
|
|
16
18
|
const TestModel = nymph.addEntityClass(TestModelClass);
|
|
17
19
|
const TestBModel = nymph.addEntityClass(TestBModelClass);
|
|
20
|
+
const TestEmptyModel = nymph.addEntityClass(TestEmptyModelClass);
|
|
18
21
|
|
|
19
22
|
let testEntity: TestModelClass & TestModelData;
|
|
20
23
|
let testGuid: string;
|
|
@@ -34,12 +37,15 @@ export function QueriesTest(
|
|
|
34
37
|
testEntity.name = 'Entity Test ' + new Date().toLocaleString();
|
|
35
38
|
testEntity.null = null;
|
|
36
39
|
testEntity.string = 'test';
|
|
37
|
-
testEntity.array = [
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
testEntity.array = [
|
|
41
|
+
'full',
|
|
42
|
+
'of',
|
|
43
|
+
'values',
|
|
44
|
+
500,
|
|
45
|
+
{ test: true },
|
|
46
|
+
{ nullbyte: '\\\x00\u0000 \x00' },
|
|
47
|
+
];
|
|
48
|
+
testEntity.match = matchValue;
|
|
43
49
|
testEntity.number = 30;
|
|
44
50
|
testEntity.numberString = '30';
|
|
45
51
|
testEntity.timestamp = Date.now();
|
|
@@ -59,18 +65,10 @@ This one's zip code is 92064.`;
|
|
|
59
65
|
entityReferenceTest.test = 'good';
|
|
60
66
|
expect(await entityReferenceTest.$save()).toEqual(true);
|
|
61
67
|
|
|
62
|
-
// Test synchronous getEntity.
|
|
63
|
-
testEntity = nymph.driver.getEntitySync(
|
|
64
|
-
{ class: TestModel },
|
|
65
|
-
testGuid
|
|
66
|
-
) as TestModelClass & TestModelData;
|
|
67
|
-
expect(testEntity).toBeInstanceOf(TestModel);
|
|
68
|
-
expect(testEntity.guid).toEqual(testGuid);
|
|
69
|
-
|
|
70
68
|
// Test asynchronous getEntity.
|
|
71
69
|
testEntity = (await nymph.getEntity(
|
|
72
70
|
{ class: TestModel },
|
|
73
|
-
testGuid
|
|
71
|
+
testGuid,
|
|
74
72
|
)) as TestModelClass & TestModelData;
|
|
75
73
|
expect(testEntity).toBeInstanceOf(TestModel);
|
|
76
74
|
expect(testEntity.guid).toEqual(testGuid);
|
|
@@ -84,6 +82,8 @@ This one's zip code is 92064.`;
|
|
|
84
82
|
for (let i = 0; i < 100; i++) {
|
|
85
83
|
const testEntity = await TestModel.factory();
|
|
86
84
|
testEntity.name = `Multi Test ${i}`;
|
|
85
|
+
// Reverse the number for sort testing.
|
|
86
|
+
testEntity.number = 100 - i;
|
|
87
87
|
testEntity.$removeTag('test');
|
|
88
88
|
testEntity.$addTag('multiTest');
|
|
89
89
|
expect(await testEntity.$save()).toEqual(true);
|
|
@@ -94,20 +94,36 @@ This one's zip code is 92064.`;
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
it('delete old test data', async () => {
|
|
97
|
-
let
|
|
98
|
-
expect(Array.isArray(
|
|
99
|
-
for (const cur of
|
|
97
|
+
let amodels = await nymph.getEntities({ class: TestModel });
|
|
98
|
+
expect(Array.isArray(amodels)).toEqual(true);
|
|
99
|
+
for (const cur of amodels) {
|
|
100
100
|
expect(await cur.$delete()).toEqual(true);
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
expect(
|
|
103
|
+
amodels = await nymph.getEntities({ class: TestModel });
|
|
104
|
+
expect(amodels.length).toEqual(0);
|
|
105
|
+
|
|
106
|
+
let bmodels = await nymph.getEntities({ class: TestBModel });
|
|
107
|
+
expect(Array.isArray(bmodels)).toEqual(true);
|
|
108
|
+
for (const cur of bmodels) {
|
|
109
|
+
expect(await cur.$delete()).toEqual(true);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
bmodels = await nymph.getEntities({ class: TestBModel });
|
|
113
|
+
expect(bmodels.length).toEqual(0);
|
|
105
114
|
});
|
|
106
115
|
|
|
107
116
|
it('create entity', async () => {
|
|
108
117
|
await createTestEntities();
|
|
109
118
|
});
|
|
110
119
|
|
|
120
|
+
it("doesn't create empty entity", async () => {
|
|
121
|
+
const testEntity = await TestEmptyModel.factory();
|
|
122
|
+
|
|
123
|
+
expect(await testEntity.$save()).toBeFalsy();
|
|
124
|
+
expect(testEntity.guid).toBeNull();
|
|
125
|
+
});
|
|
126
|
+
|
|
111
127
|
it('update mdate on save', async () => {
|
|
112
128
|
await createTestEntities();
|
|
113
129
|
|
|
@@ -150,7 +166,7 @@ This one's zip code is 92064.`;
|
|
|
150
166
|
|
|
151
167
|
if (!(await transaction.inTransaction())) {
|
|
152
168
|
console.log(
|
|
153
|
-
'This Nymph driver or database seems to not support transactions. Skipping transaction tests.'
|
|
169
|
+
'This Nymph driver or database seems to not support transactions. Skipping transaction tests.',
|
|
154
170
|
);
|
|
155
171
|
await transaction.rollback('test');
|
|
156
172
|
return;
|
|
@@ -181,7 +197,7 @@ This one's zip code is 92064.`;
|
|
|
181
197
|
expect(await testEntity.$delete()).toEqual(true);
|
|
182
198
|
const resultEntity = await transaction.getEntity(
|
|
183
199
|
{ class: TestModel },
|
|
184
|
-
testGuid
|
|
200
|
+
testGuid,
|
|
185
201
|
);
|
|
186
202
|
expect(resultEntity).toBeNull();
|
|
187
203
|
|
|
@@ -194,13 +210,13 @@ This one's zip code is 92064.`;
|
|
|
194
210
|
// Verify it's back.
|
|
195
211
|
testEntity = (await transaction.getEntity(
|
|
196
212
|
{ class: TestModel },
|
|
197
|
-
testGuid
|
|
213
|
+
testGuid,
|
|
198
214
|
)) as TestModelClass & TestModelData;
|
|
199
215
|
|
|
200
216
|
expect(testEntity.guid).toEqual(testGuid);
|
|
201
217
|
|
|
202
|
-
// Start a new transaction.
|
|
203
|
-
transaction = await nymph.startTransaction('test');
|
|
218
|
+
// Start a new transaction with a dot in the name.
|
|
219
|
+
transaction = await nymph.startTransaction('test.1');
|
|
204
220
|
testEntity.$nymph = transaction;
|
|
205
221
|
|
|
206
222
|
// Verify in a transaction.
|
|
@@ -211,7 +227,7 @@ This one's zip code is 92064.`;
|
|
|
211
227
|
expect(await testEntity.$save()).toEqual(true);
|
|
212
228
|
|
|
213
229
|
// Commit the transaction.
|
|
214
|
-
await transaction.commit('test');
|
|
230
|
+
await transaction.commit('test.1');
|
|
215
231
|
testEntity.$nymph = nymph;
|
|
216
232
|
|
|
217
233
|
// Verify not in a transaction.
|
|
@@ -240,7 +256,7 @@ This one's zip code is 92064.`;
|
|
|
240
256
|
limit: 1,
|
|
241
257
|
sort: 'cdate',
|
|
242
258
|
},
|
|
243
|
-
{ type: '&', tag: 'test' }
|
|
259
|
+
{ type: '&', tag: 'test' },
|
|
244
260
|
);
|
|
245
261
|
expect(resultEntities.length).toEqual(1);
|
|
246
262
|
expect(testEntity.$is(resultEntities[0])).toEqual(true);
|
|
@@ -252,7 +268,7 @@ This one's zip code is 92064.`;
|
|
|
252
268
|
// Retrieving entity by GUID and tags...
|
|
253
269
|
const resultEntity = await nymph.getEntity(
|
|
254
270
|
{ class: TestModel },
|
|
255
|
-
{ type: '&', guid: testGuid, tag: 'test' }
|
|
271
|
+
{ type: '&', guid: testGuid, tag: 'test' },
|
|
256
272
|
);
|
|
257
273
|
expect(testEntity.$is(resultEntity)).toEqual(true);
|
|
258
274
|
});
|
|
@@ -263,7 +279,7 @@ This one's zip code is 92064.`;
|
|
|
263
279
|
// Retrieving entity by GUID and tags...
|
|
264
280
|
const resultEntity = await nymph.getEntity(
|
|
265
281
|
{ class: TestModel },
|
|
266
|
-
{ type: '|', guid: [testGuid, guid()] }
|
|
282
|
+
{ type: '|', guid: [testGuid, guid()] },
|
|
267
283
|
);
|
|
268
284
|
expect(testEntity.$is(resultEntity)).toEqual(true);
|
|
269
285
|
});
|
|
@@ -274,7 +290,7 @@ This one's zip code is 92064.`;
|
|
|
274
290
|
// Retrieving entity by GUID and tags...
|
|
275
291
|
const resultEntity = await nymph.getEntity(
|
|
276
292
|
{ class: TestModel },
|
|
277
|
-
{ type: '|', guid: [guid(), guid()] }
|
|
293
|
+
{ type: '|', guid: [guid(), guid()] },
|
|
278
294
|
);
|
|
279
295
|
expect(testEntity.$is(resultEntity)).toEqual(false);
|
|
280
296
|
});
|
|
@@ -285,7 +301,7 @@ This one's zip code is 92064.`;
|
|
|
285
301
|
// Retrieving entity by !GUID...
|
|
286
302
|
const resultEntity = await nymph.getEntities(
|
|
287
303
|
{ class: TestModel },
|
|
288
|
-
{ type: '&', '!guid': guid(), tag: 'test' }
|
|
304
|
+
{ type: '&', '!guid': guid(), tag: 'test' },
|
|
289
305
|
);
|
|
290
306
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
291
307
|
});
|
|
@@ -296,7 +312,7 @@ This one's zip code is 92064.`;
|
|
|
296
312
|
// Retrieving entity by !tags...
|
|
297
313
|
const resultEntity = await nymph.getEntities(
|
|
298
314
|
{ class: TestModel },
|
|
299
|
-
{ type: '&', guid: testGuid, '!tag': ['barbecue', 'pickles'] }
|
|
315
|
+
{ type: '&', guid: testGuid, '!tag': ['barbecue', 'pickles'] },
|
|
300
316
|
);
|
|
301
317
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
302
318
|
});
|
|
@@ -307,7 +323,7 @@ This one's zip code is 92064.`;
|
|
|
307
323
|
// Testing GUID and wrong tags...
|
|
308
324
|
const resultEntity = await nymph.getEntity(
|
|
309
325
|
{ class: TestModel },
|
|
310
|
-
{ type: '&', guid: testGuid, tag: ['pickles'] }
|
|
326
|
+
{ type: '&', guid: testGuid, tag: ['pickles'] },
|
|
311
327
|
);
|
|
312
328
|
expect(resultEntity).toBeNull();
|
|
313
329
|
});
|
|
@@ -318,7 +334,7 @@ This one's zip code is 92064.`;
|
|
|
318
334
|
// Retrieving entity by tags...
|
|
319
335
|
const resultEntity = await nymph.getEntities(
|
|
320
336
|
{ class: TestModel },
|
|
321
|
-
{ type: '&', tag: 'test' }
|
|
337
|
+
{ type: '&', tag: 'test' },
|
|
322
338
|
);
|
|
323
339
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
324
340
|
});
|
|
@@ -329,7 +345,7 @@ This one's zip code is 92064.`;
|
|
|
329
345
|
// Testing wrong tags...
|
|
330
346
|
const resultEntity = await nymph.getEntities(
|
|
331
347
|
{ class: TestModel },
|
|
332
|
-
{ type: '&', tag: 'pickles' }
|
|
348
|
+
{ type: '&', tag: 'pickles' },
|
|
333
349
|
);
|
|
334
350
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
335
351
|
});
|
|
@@ -340,7 +356,7 @@ This one's zip code is 92064.`;
|
|
|
340
356
|
// Retrieving entity by tags inclusively...
|
|
341
357
|
const resultEntity = await nymph.getEntities(
|
|
342
358
|
{ class: TestModel },
|
|
343
|
-
{ type: '|', tag: ['pickles', 'test', 'barbecue'] }
|
|
359
|
+
{ type: '|', tag: ['pickles', 'test', 'barbecue'] },
|
|
344
360
|
);
|
|
345
361
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
346
362
|
});
|
|
@@ -351,7 +367,7 @@ This one's zip code is 92064.`;
|
|
|
351
367
|
// Testing wrong inclusive tags...
|
|
352
368
|
const resultEntity = await nymph.getEntities(
|
|
353
369
|
{ class: TestModel },
|
|
354
|
-
{ type: '|', tag: ['pickles', 'barbecue'] }
|
|
370
|
+
{ type: '|', tag: ['pickles', 'barbecue'] },
|
|
355
371
|
);
|
|
356
372
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
357
373
|
});
|
|
@@ -363,7 +379,7 @@ This one's zip code is 92064.`;
|
|
|
363
379
|
const resultEntity = await nymph.getEntities(
|
|
364
380
|
{ class: TestModel },
|
|
365
381
|
{ type: '&', tag: 'test' },
|
|
366
|
-
{ type: '|', tag: ['pickles', 'test', 'barbecue'] }
|
|
382
|
+
{ type: '|', tag: ['pickles', 'test', 'barbecue'] },
|
|
367
383
|
);
|
|
368
384
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
369
385
|
});
|
|
@@ -375,7 +391,7 @@ This one's zip code is 92064.`;
|
|
|
375
391
|
const resultEntity = await nymph.getEntities(
|
|
376
392
|
{ class: TestModel },
|
|
377
393
|
{ type: '&', tag: 'test' },
|
|
378
|
-
{ type: '|', tag: ['pickles', 'barbecue'] }
|
|
394
|
+
{ type: '|', tag: ['pickles', 'barbecue'] },
|
|
379
395
|
);
|
|
380
396
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
381
397
|
});
|
|
@@ -387,7 +403,7 @@ This one's zip code is 92064.`;
|
|
|
387
403
|
const resultEntity = await nymph.getEntities(
|
|
388
404
|
{ class: TestModel },
|
|
389
405
|
{ type: '&', tag: 'pickles' },
|
|
390
|
-
{ type: '|', tag: ['test', 'barbecue'] }
|
|
406
|
+
{ type: '|', tag: ['test', 'barbecue'] },
|
|
391
407
|
);
|
|
392
408
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
393
409
|
});
|
|
@@ -398,7 +414,7 @@ This one's zip code is 92064.`;
|
|
|
398
414
|
// Retrieving entity by defined...
|
|
399
415
|
const resultEntity = await nymph.getEntities(
|
|
400
416
|
{ class: TestModel },
|
|
401
|
-
{ type: '&', defined: 'string' }
|
|
417
|
+
{ type: '&', defined: 'string' },
|
|
402
418
|
);
|
|
403
419
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
404
420
|
});
|
|
@@ -409,7 +425,7 @@ This one's zip code is 92064.`;
|
|
|
409
425
|
// Retrieving entity by !defined...
|
|
410
426
|
const resultEntity = await nymph.getEntities(
|
|
411
427
|
{ class: TestModel },
|
|
412
|
-
{ type: '&', tag: 'test', '!defined': 'pickles' }
|
|
428
|
+
{ type: '&', tag: 'test', '!defined': 'pickles' },
|
|
413
429
|
);
|
|
414
430
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
415
431
|
});
|
|
@@ -421,7 +437,7 @@ This one's zip code is 92064.`;
|
|
|
421
437
|
const resultEntity = await nymph.getEntities(
|
|
422
438
|
{ class: TestModel },
|
|
423
439
|
{ type: '!&', defined: 'pickles' },
|
|
424
|
-
{ type: '&', tag: 'test' }
|
|
440
|
+
{ type: '&', tag: 'test' },
|
|
425
441
|
);
|
|
426
442
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
427
443
|
});
|
|
@@ -430,9 +446,50 @@ This one's zip code is 92064.`;
|
|
|
430
446
|
await createTestEntities();
|
|
431
447
|
|
|
432
448
|
// Retrieving entity by equal...
|
|
433
|
-
|
|
449
|
+
let resultEntity = await nymph.getEntities(
|
|
450
|
+
{ class: TestModel },
|
|
451
|
+
{ type: '&', equal: ['string', 'test'] },
|
|
452
|
+
);
|
|
453
|
+
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
454
|
+
|
|
455
|
+
// Retrieving entity by equal...
|
|
456
|
+
resultEntity = await nymph.getEntities(
|
|
434
457
|
{ class: TestModel },
|
|
435
|
-
{ type: '&', equal: ['
|
|
458
|
+
{ type: '&', equal: ['null', null] },
|
|
459
|
+
);
|
|
460
|
+
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
461
|
+
|
|
462
|
+
// Retrieving entity by equal...
|
|
463
|
+
resultEntity = await nymph.getEntities(
|
|
464
|
+
{ class: TestModel },
|
|
465
|
+
{ type: '&', equal: ['boolean', true] },
|
|
466
|
+
);
|
|
467
|
+
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
468
|
+
|
|
469
|
+
// Retrieving entity by equal...
|
|
470
|
+
resultEntity = await nymph.getEntities(
|
|
471
|
+
{ class: TestModel },
|
|
472
|
+
{ type: '&', equal: ['number', 30] },
|
|
473
|
+
);
|
|
474
|
+
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
475
|
+
|
|
476
|
+
// Retrieving entity by equal...
|
|
477
|
+
resultEntity = await nymph.getEntities(
|
|
478
|
+
{ class: TestModel },
|
|
479
|
+
{
|
|
480
|
+
type: '&',
|
|
481
|
+
equal: [
|
|
482
|
+
'array',
|
|
483
|
+
[
|
|
484
|
+
'full',
|
|
485
|
+
'of',
|
|
486
|
+
'values',
|
|
487
|
+
500,
|
|
488
|
+
{ test: true },
|
|
489
|
+
{ nullbyte: '\\\x00\u0000 \x00' },
|
|
490
|
+
],
|
|
491
|
+
],
|
|
492
|
+
},
|
|
436
493
|
);
|
|
437
494
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
438
495
|
});
|
|
@@ -446,7 +503,7 @@ This one's zip code is 92064.`;
|
|
|
446
503
|
// Retrieving entity by !equal...
|
|
447
504
|
const resultEntity = await nymph.getEntities(
|
|
448
505
|
{ class: TestModel },
|
|
449
|
-
{ type: '&', tag: 'test', '!equal': ['string', 'wrong'] }
|
|
506
|
+
{ type: '&', tag: 'test', '!equal': ['string', 'wrong'] },
|
|
450
507
|
);
|
|
451
508
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
452
509
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -458,7 +515,7 @@ This one's zip code is 92064.`;
|
|
|
458
515
|
// Retrieving entity by like...
|
|
459
516
|
const resultEntity = await nymph.getEntities(
|
|
460
517
|
{ class: TestModel },
|
|
461
|
-
{ type: '&', like: ['string', 't_s%'] }
|
|
518
|
+
{ type: '&', like: ['string', 't_s%'] },
|
|
462
519
|
);
|
|
463
520
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
464
521
|
});
|
|
@@ -472,7 +529,7 @@ This one's zip code is 92064.`;
|
|
|
472
529
|
// Retrieving entity by !like...
|
|
473
530
|
const resultEntity = await nymph.getEntities(
|
|
474
531
|
{ class: TestModel },
|
|
475
|
-
{ type: '&', tag: 'test', '!like': ['string', 'wr_n%'] }
|
|
532
|
+
{ type: '&', tag: 'test', '!like': ['string', 'wr_n%'] },
|
|
476
533
|
);
|
|
477
534
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
478
535
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -484,7 +541,7 @@ This one's zip code is 92064.`;
|
|
|
484
541
|
// Retrieving entity by ilike...
|
|
485
542
|
const resultEntity = await nymph.getEntities(
|
|
486
543
|
{ class: TestModel },
|
|
487
|
-
{ type: '&', ilike: ['string', 'T_s%'] }
|
|
544
|
+
{ type: '&', ilike: ['string', 'T_s%'] },
|
|
488
545
|
);
|
|
489
546
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
490
547
|
});
|
|
@@ -498,7 +555,7 @@ This one's zip code is 92064.`;
|
|
|
498
555
|
// Retrieving entity by !ilike...
|
|
499
556
|
const resultEntity = await nymph.getEntities(
|
|
500
557
|
{ class: TestModel },
|
|
501
|
-
{ type: '&', tag: 'test', '!ilike': ['string', 'wr_n%'] }
|
|
558
|
+
{ type: '&', tag: 'test', '!ilike': ['string', 'wr_n%'] },
|
|
502
559
|
);
|
|
503
560
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
504
561
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -510,7 +567,7 @@ This one's zip code is 92064.`;
|
|
|
510
567
|
// Retrieving entity by like...
|
|
511
568
|
const resultEntity = await nymph.getEntities(
|
|
512
569
|
{ class: TestModel },
|
|
513
|
-
{ type: '&', like: ['string', 'T_s%'] }
|
|
570
|
+
{ type: '&', like: ['string', 'T_s%'] },
|
|
514
571
|
);
|
|
515
572
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
516
573
|
});
|
|
@@ -521,7 +578,7 @@ This one's zip code is 92064.`;
|
|
|
521
578
|
// Retrieving entity by tags and equal...
|
|
522
579
|
const resultEntity = await nymph.getEntities(
|
|
523
580
|
{ class: TestModel },
|
|
524
|
-
{ type: '&', tag: 'test', equal: ['string', 'test'] }
|
|
581
|
+
{ type: '&', tag: 'test', equal: ['string', 'test'] },
|
|
525
582
|
);
|
|
526
583
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
527
584
|
});
|
|
@@ -532,7 +589,7 @@ This one's zip code is 92064.`;
|
|
|
532
589
|
// Testing wrong tags and right equal...
|
|
533
590
|
const resultEntity = await nymph.getEntities(
|
|
534
591
|
{ class: TestModel },
|
|
535
|
-
{ type: '&', tag: 'pickles', equal: ['string', 'test'] }
|
|
592
|
+
{ type: '&', tag: 'pickles', equal: ['string', 'test'] },
|
|
536
593
|
);
|
|
537
594
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
538
595
|
});
|
|
@@ -543,7 +600,7 @@ This one's zip code is 92064.`;
|
|
|
543
600
|
// Testing right tags and wrong equal...
|
|
544
601
|
const resultEntity = await nymph.getEntities(
|
|
545
602
|
{ class: TestModel },
|
|
546
|
-
{ type: '&', tag: 'test', equal: ['string', 'pickles'] }
|
|
603
|
+
{ type: '&', tag: 'test', equal: ['string', 'pickles'] },
|
|
547
604
|
);
|
|
548
605
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
549
606
|
});
|
|
@@ -554,7 +611,7 @@ This one's zip code is 92064.`;
|
|
|
554
611
|
// Testing wrong tags and wrong equal...
|
|
555
612
|
const resultEntity = await nymph.getEntities(
|
|
556
613
|
{ class: TestModel },
|
|
557
|
-
{ type: '&', tag: 'pickles', equal: ['string', 'pickles'] }
|
|
614
|
+
{ type: '&', tag: 'pickles', equal: ['string', 'pickles'] },
|
|
558
615
|
);
|
|
559
616
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
560
617
|
});
|
|
@@ -565,14 +622,21 @@ This one's zip code is 92064.`;
|
|
|
565
622
|
// Retrieving entity by contain...
|
|
566
623
|
let resultEntity = await nymph.getEntities(
|
|
567
624
|
{ class: TestModel },
|
|
568
|
-
{ type: '&', contain: ['array', 'values'] }
|
|
625
|
+
{ type: '&', contain: ['array', 'values'] },
|
|
569
626
|
);
|
|
570
627
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
571
628
|
|
|
572
|
-
// Retrieving entity by contain
|
|
629
|
+
// Retrieving entity by contain...
|
|
573
630
|
resultEntity = await nymph.getEntities(
|
|
574
631
|
{ class: TestModel },
|
|
575
|
-
{ type: '&', contain: ['
|
|
632
|
+
{ type: '&', contain: ['array', 500] },
|
|
633
|
+
);
|
|
634
|
+
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
635
|
+
|
|
636
|
+
// Retrieving entity by contain...
|
|
637
|
+
resultEntity = await nymph.getEntities(
|
|
638
|
+
{ class: TestModel },
|
|
639
|
+
{ type: '&', contain: ['array', { test: true }] },
|
|
576
640
|
);
|
|
577
641
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
578
642
|
});
|
|
@@ -584,7 +648,7 @@ This one's zip code is 92064.`;
|
|
|
584
648
|
const resultEntity = await nymph.getEntities(
|
|
585
649
|
{ class: TestModel },
|
|
586
650
|
{ type: '&', tag: 'test' },
|
|
587
|
-
{ type: '!&', contain: ['array', 'pickles'] }
|
|
651
|
+
{ type: '!&', contain: ['array', 'pickles'] },
|
|
588
652
|
);
|
|
589
653
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
590
654
|
});
|
|
@@ -595,14 +659,14 @@ This one's zip code is 92064.`;
|
|
|
595
659
|
// Testing wrong contain...
|
|
596
660
|
let resultEntity = await nymph.getEntities(
|
|
597
661
|
{ class: TestModel },
|
|
598
|
-
{ type: '&', contain: ['array', 'pickles'] }
|
|
662
|
+
{ type: '&', contain: ['array', 'pickles'] },
|
|
599
663
|
);
|
|
600
664
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
601
665
|
|
|
602
666
|
// Testing wrong contain...
|
|
603
667
|
resultEntity = await nymph.getEntities(
|
|
604
668
|
{ class: TestModel },
|
|
605
|
-
{ type: '&', contain: ['string', 'pickles'] }
|
|
669
|
+
{ type: '&', contain: ['string', 'pickles'] },
|
|
606
670
|
);
|
|
607
671
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
608
672
|
});
|
|
@@ -613,12 +677,12 @@ This one's zip code is 92064.`;
|
|
|
613
677
|
// Retrieving entity by regex match...
|
|
614
678
|
let resultEntity = await nymph.getEntities(
|
|
615
679
|
{ class: TestModel },
|
|
616
|
-
{ type: '&', match: ['match', '.*'] } // anything
|
|
680
|
+
{ type: '&', match: ['match', '.*'] }, // anything
|
|
617
681
|
);
|
|
618
682
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
619
683
|
resultEntity = await nymph.getEntities(
|
|
620
684
|
{ class: TestModel },
|
|
621
|
-
{ type: '&', tag: 'test', match: ['match', 'Edward McCheese'] } // a substring
|
|
685
|
+
{ type: '&', tag: 'test', match: ['match', 'Edward McCheese'] }, // a substring
|
|
622
686
|
);
|
|
623
687
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
624
688
|
resultEntity = await nymph.getEntities(
|
|
@@ -630,7 +694,7 @@ This one's zip code is 92064.`;
|
|
|
630
694
|
['string', '[0-9]'],
|
|
631
695
|
['match', 'Edward McCheese'],
|
|
632
696
|
],
|
|
633
|
-
} // inclusive test
|
|
697
|
+
}, // inclusive test
|
|
634
698
|
);
|
|
635
699
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
636
700
|
resultEntity = await nymph.getEntities(
|
|
@@ -639,7 +703,7 @@ This one's zip code is 92064.`;
|
|
|
639
703
|
type: '&',
|
|
640
704
|
tag: 'test',
|
|
641
705
|
match: ['match', '[-a-zA-Z0-9+_]+@[-a-zA-Z0-9_]+.[-a-zA-Z0-9_]{2,4}'],
|
|
642
|
-
} // a simple email
|
|
706
|
+
}, // a simple email
|
|
643
707
|
);
|
|
644
708
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
645
709
|
resultEntity = await nymph.getEntities(
|
|
@@ -648,7 +712,7 @@ This one's zip code is 92064.`;
|
|
|
648
712
|
type: '&',
|
|
649
713
|
tag: 'test',
|
|
650
714
|
match: ['match', '\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}'],
|
|
651
|
-
} // a phone number
|
|
715
|
+
}, // a phone number
|
|
652
716
|
);
|
|
653
717
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
654
718
|
});
|
|
@@ -659,7 +723,7 @@ This one's zip code is 92064.`;
|
|
|
659
723
|
// Retrieving entity by regex match...
|
|
660
724
|
const resultEntity = await nymph.getEntities(
|
|
661
725
|
{ class: TestModel },
|
|
662
|
-
{ type: '&', tag: 'test', imatch: ['match', 'edward mccheese'] } // a substring
|
|
726
|
+
{ type: '&', tag: 'test', imatch: ['match', 'edward mccheese'] }, // a substring
|
|
663
727
|
);
|
|
664
728
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
665
729
|
});
|
|
@@ -670,12 +734,12 @@ This one's zip code is 92064.`;
|
|
|
670
734
|
// Testing wrong regex match...
|
|
671
735
|
let resultEntity = await nymph.getEntities(
|
|
672
736
|
{ class: TestModel },
|
|
673
|
-
{ type: '&', match: ['match', '
|
|
737
|
+
{ type: '&', match: ['match', '='] },
|
|
674
738
|
);
|
|
675
739
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
676
740
|
resultEntity = await nymph.getEntities(
|
|
677
741
|
{ class: TestModel },
|
|
678
|
-
{ type: '&', tag: 'pickle', match: ['match', '.*'] }
|
|
742
|
+
{ type: '&', tag: 'pickle', match: ['match', '.*'] },
|
|
679
743
|
);
|
|
680
744
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
681
745
|
resultEntity = await nymph.getEntities(
|
|
@@ -686,7 +750,7 @@ This one's zip code is 92064.`;
|
|
|
686
750
|
['string', '[0-9]'],
|
|
687
751
|
['match', ',,'],
|
|
688
752
|
],
|
|
689
|
-
}
|
|
753
|
+
},
|
|
690
754
|
);
|
|
691
755
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
692
756
|
});
|
|
@@ -697,7 +761,7 @@ This one's zip code is 92064.`;
|
|
|
697
761
|
// Retrieving entity by regex match...
|
|
698
762
|
const resultEntity = await nymph.getEntities(
|
|
699
763
|
{ class: TestModel },
|
|
700
|
-
{ type: '&', tag: 'test', match: ['match', 'edward mccheese'] } // a substring
|
|
764
|
+
{ type: '&', tag: 'test', match: ['match', 'edward mccheese'] }, // a substring
|
|
701
765
|
);
|
|
702
766
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
703
767
|
});
|
|
@@ -709,7 +773,7 @@ This one's zip code is 92064.`;
|
|
|
709
773
|
const resultEntity = await nymph.getEntities(
|
|
710
774
|
{ class: TestModel },
|
|
711
775
|
{ type: '&', tag: 'test' },
|
|
712
|
-
{ type: '|', equal: ['string', 'pickles'], match: ['string', 'test'] }
|
|
776
|
+
{ type: '|', equal: ['string', 'pickles'], match: ['string', 'test'] },
|
|
713
777
|
);
|
|
714
778
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
715
779
|
});
|
|
@@ -726,7 +790,7 @@ This one's zip code is 92064.`;
|
|
|
726
790
|
['number', 30],
|
|
727
791
|
['pickles', 100],
|
|
728
792
|
],
|
|
729
|
-
}
|
|
793
|
+
},
|
|
730
794
|
);
|
|
731
795
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
732
796
|
|
|
@@ -739,7 +803,7 @@ This one's zip code is 92064.`;
|
|
|
739
803
|
['number', 31],
|
|
740
804
|
['pickles', 100],
|
|
741
805
|
],
|
|
742
|
-
}
|
|
806
|
+
},
|
|
743
807
|
);
|
|
744
808
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
745
809
|
|
|
@@ -752,7 +816,7 @@ This one's zip code is 92064.`;
|
|
|
752
816
|
['number', 29],
|
|
753
817
|
['pickles', 100],
|
|
754
818
|
],
|
|
755
|
-
}
|
|
819
|
+
},
|
|
756
820
|
);
|
|
757
821
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
758
822
|
|
|
@@ -765,7 +829,7 @@ This one's zip code is 92064.`;
|
|
|
765
829
|
['numberString', 30],
|
|
766
830
|
['pickles', 100],
|
|
767
831
|
],
|
|
768
|
-
}
|
|
832
|
+
},
|
|
769
833
|
);
|
|
770
834
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
771
835
|
|
|
@@ -778,7 +842,7 @@ This one's zip code is 92064.`;
|
|
|
778
842
|
['numberString', 31],
|
|
779
843
|
['pickles', 100],
|
|
780
844
|
],
|
|
781
|
-
}
|
|
845
|
+
},
|
|
782
846
|
);
|
|
783
847
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
784
848
|
|
|
@@ -791,7 +855,7 @@ This one's zip code is 92064.`;
|
|
|
791
855
|
['numberString', 29],
|
|
792
856
|
['pickles', 100],
|
|
793
857
|
],
|
|
794
|
-
}
|
|
858
|
+
},
|
|
795
859
|
);
|
|
796
860
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
797
861
|
});
|
|
@@ -808,7 +872,7 @@ This one's zip code is 92064.`;
|
|
|
808
872
|
['number', 30],
|
|
809
873
|
['pickles', 100],
|
|
810
874
|
],
|
|
811
|
-
}
|
|
875
|
+
},
|
|
812
876
|
);
|
|
813
877
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
814
878
|
|
|
@@ -821,7 +885,7 @@ This one's zip code is 92064.`;
|
|
|
821
885
|
['number', 31],
|
|
822
886
|
['pickles', 100],
|
|
823
887
|
],
|
|
824
|
-
}
|
|
888
|
+
},
|
|
825
889
|
);
|
|
826
890
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
827
891
|
|
|
@@ -834,7 +898,7 @@ This one's zip code is 92064.`;
|
|
|
834
898
|
['number', 29],
|
|
835
899
|
['pickles', 100],
|
|
836
900
|
],
|
|
837
|
-
}
|
|
901
|
+
},
|
|
838
902
|
);
|
|
839
903
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
840
904
|
|
|
@@ -847,7 +911,7 @@ This one's zip code is 92064.`;
|
|
|
847
911
|
['numberString', 30],
|
|
848
912
|
['pickles', 100],
|
|
849
913
|
],
|
|
850
|
-
}
|
|
914
|
+
},
|
|
851
915
|
);
|
|
852
916
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
853
917
|
|
|
@@ -860,7 +924,7 @@ This one's zip code is 92064.`;
|
|
|
860
924
|
['numberString', 31],
|
|
861
925
|
['pickles', 100],
|
|
862
926
|
],
|
|
863
|
-
}
|
|
927
|
+
},
|
|
864
928
|
);
|
|
865
929
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
866
930
|
|
|
@@ -873,7 +937,7 @@ This one's zip code is 92064.`;
|
|
|
873
937
|
['numberString', 29],
|
|
874
938
|
['pickles', 100],
|
|
875
939
|
],
|
|
876
|
-
}
|
|
940
|
+
},
|
|
877
941
|
);
|
|
878
942
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
879
943
|
});
|
|
@@ -890,7 +954,7 @@ This one's zip code is 92064.`;
|
|
|
890
954
|
['number', 30],
|
|
891
955
|
['pickles', 100],
|
|
892
956
|
],
|
|
893
|
-
}
|
|
957
|
+
},
|
|
894
958
|
);
|
|
895
959
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
896
960
|
|
|
@@ -903,7 +967,7 @@ This one's zip code is 92064.`;
|
|
|
903
967
|
['number', 31],
|
|
904
968
|
['pickles', 100],
|
|
905
969
|
],
|
|
906
|
-
}
|
|
970
|
+
},
|
|
907
971
|
);
|
|
908
972
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
909
973
|
|
|
@@ -916,7 +980,7 @@ This one's zip code is 92064.`;
|
|
|
916
980
|
['number', 29],
|
|
917
981
|
['pickles', 100],
|
|
918
982
|
],
|
|
919
|
-
}
|
|
983
|
+
},
|
|
920
984
|
);
|
|
921
985
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
922
986
|
|
|
@@ -929,7 +993,7 @@ This one's zip code is 92064.`;
|
|
|
929
993
|
['numberString', 30],
|
|
930
994
|
['pickles', 100],
|
|
931
995
|
],
|
|
932
|
-
}
|
|
996
|
+
},
|
|
933
997
|
);
|
|
934
998
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
935
999
|
|
|
@@ -942,7 +1006,7 @@ This one's zip code is 92064.`;
|
|
|
942
1006
|
['numberString', 31],
|
|
943
1007
|
['pickles', 100],
|
|
944
1008
|
],
|
|
945
|
-
}
|
|
1009
|
+
},
|
|
946
1010
|
);
|
|
947
1011
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
948
1012
|
|
|
@@ -955,7 +1019,7 @@ This one's zip code is 92064.`;
|
|
|
955
1019
|
['numberString', 29],
|
|
956
1020
|
['pickles', 100],
|
|
957
1021
|
],
|
|
958
|
-
}
|
|
1022
|
+
},
|
|
959
1023
|
);
|
|
960
1024
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
961
1025
|
});
|
|
@@ -972,7 +1036,7 @@ This one's zip code is 92064.`;
|
|
|
972
1036
|
['number', 30],
|
|
973
1037
|
['pickles', 100],
|
|
974
1038
|
],
|
|
975
|
-
}
|
|
1039
|
+
},
|
|
976
1040
|
);
|
|
977
1041
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
978
1042
|
|
|
@@ -985,7 +1049,7 @@ This one's zip code is 92064.`;
|
|
|
985
1049
|
['number', 31],
|
|
986
1050
|
['pickles', 100],
|
|
987
1051
|
],
|
|
988
|
-
}
|
|
1052
|
+
},
|
|
989
1053
|
);
|
|
990
1054
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
991
1055
|
|
|
@@ -998,7 +1062,7 @@ This one's zip code is 92064.`;
|
|
|
998
1062
|
['number', 29],
|
|
999
1063
|
['pickles', 100],
|
|
1000
1064
|
],
|
|
1001
|
-
}
|
|
1065
|
+
},
|
|
1002
1066
|
);
|
|
1003
1067
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1004
1068
|
|
|
@@ -1011,7 +1075,7 @@ This one's zip code is 92064.`;
|
|
|
1011
1075
|
['numberString', 30],
|
|
1012
1076
|
['pickles', 100],
|
|
1013
1077
|
],
|
|
1014
|
-
}
|
|
1078
|
+
},
|
|
1015
1079
|
);
|
|
1016
1080
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1017
1081
|
|
|
@@ -1024,7 +1088,7 @@ This one's zip code is 92064.`;
|
|
|
1024
1088
|
['numberString', 31],
|
|
1025
1089
|
['pickles', 100],
|
|
1026
1090
|
],
|
|
1027
|
-
}
|
|
1091
|
+
},
|
|
1028
1092
|
);
|
|
1029
1093
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1030
1094
|
|
|
@@ -1037,7 +1101,7 @@ This one's zip code is 92064.`;
|
|
|
1037
1101
|
['numberString', 29],
|
|
1038
1102
|
['pickles', 100],
|
|
1039
1103
|
],
|
|
1040
|
-
}
|
|
1104
|
+
},
|
|
1041
1105
|
);
|
|
1042
1106
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1043
1107
|
});
|
|
@@ -1049,7 +1113,7 @@ This one's zip code is 92064.`;
|
|
|
1049
1113
|
const resultEntity = await nymph.getEntities(
|
|
1050
1114
|
{ class: TestModel },
|
|
1051
1115
|
{ type: '&', tag: 'test' },
|
|
1052
|
-
{ type: '!&', gte: ['number', 60] }
|
|
1116
|
+
{ type: '!&', gte: ['number', 60] },
|
|
1053
1117
|
);
|
|
1054
1118
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1055
1119
|
});
|
|
@@ -1060,7 +1124,7 @@ This one's zip code is 92064.`;
|
|
|
1060
1124
|
// Testing wrong inequality...
|
|
1061
1125
|
const resultEntity = await nymph.getEntities(
|
|
1062
1126
|
{ class: TestModel },
|
|
1063
|
-
{ type: '&', lte: ['number', 29.99] }
|
|
1127
|
+
{ type: '&', lte: ['number', 29.99] },
|
|
1064
1128
|
);
|
|
1065
1129
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1066
1130
|
});
|
|
@@ -1071,7 +1135,7 @@ This one's zip code is 92064.`;
|
|
|
1071
1135
|
// Retrieving entity by time...
|
|
1072
1136
|
const resultEntity = await nymph.getEntities(
|
|
1073
1137
|
{ class: TestModel },
|
|
1074
|
-
{ type: '&', tag: 'test', gt: ['cdate', (testEntity.cdate ?? 0) - 120] }
|
|
1138
|
+
{ type: '&', tag: 'test', gt: ['cdate', (testEntity.cdate ?? 0) - 120] },
|
|
1075
1139
|
);
|
|
1076
1140
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1077
1141
|
});
|
|
@@ -1082,7 +1146,7 @@ This one's zip code is 92064.`;
|
|
|
1082
1146
|
// Testing wrong time...
|
|
1083
1147
|
const resultEntity = await nymph.getEntities(
|
|
1084
1148
|
{ class: TestModel },
|
|
1085
|
-
{ type: '&', tag: 'test', gte: ['cdate', (testEntity.cdate ?? 0) + 1] }
|
|
1149
|
+
{ type: '&', tag: 'test', gte: ['cdate', (testEntity.cdate ?? 0) + 1] },
|
|
1086
1150
|
);
|
|
1087
1151
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1088
1152
|
});
|
|
@@ -1095,7 +1159,7 @@ This one's zip code is 92064.`;
|
|
|
1095
1159
|
// Retrieving entity by relative time...
|
|
1096
1160
|
let resultEntity = await nymph.getEntities(
|
|
1097
1161
|
{ class: TestModel },
|
|
1098
|
-
{ type: '&', gt: ['timestamp', null, '-1 day'] }
|
|
1162
|
+
{ type: '&', gt: ['timestamp', null, '-1 day'] },
|
|
1099
1163
|
);
|
|
1100
1164
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1101
1165
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -1109,7 +1173,7 @@ This one's zip code is 92064.`;
|
|
|
1109
1173
|
['timestamp', null, '-1 day'],
|
|
1110
1174
|
['timestamp', null, '+5 days'],
|
|
1111
1175
|
],
|
|
1112
|
-
}
|
|
1176
|
+
},
|
|
1113
1177
|
);
|
|
1114
1178
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1115
1179
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -1117,7 +1181,7 @@ This one's zip code is 92064.`;
|
|
|
1117
1181
|
// Retrieving entity by relative time...
|
|
1118
1182
|
resultEntity = await nymph.getEntities(
|
|
1119
1183
|
{ class: TestModel },
|
|
1120
|
-
{ type: '&', gt: ['timestamp', null, '-3 days'] }
|
|
1184
|
+
{ type: '&', gt: ['timestamp', null, '-3 days'] },
|
|
1121
1185
|
);
|
|
1122
1186
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1123
1187
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(true);
|
|
@@ -1125,7 +1189,7 @@ This one's zip code is 92064.`;
|
|
|
1125
1189
|
// Retrieving entity by relative time...
|
|
1126
1190
|
resultEntity = await nymph.getEntities(
|
|
1127
1191
|
{ class: TestModel },
|
|
1128
|
-
{ type: '&', gt: ['cdate', null, '-1 day'] }
|
|
1192
|
+
{ type: '&', gt: ['cdate', null, '-1 day'] },
|
|
1129
1193
|
);
|
|
1130
1194
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1131
1195
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(true);
|
|
@@ -1139,7 +1203,7 @@ This one's zip code is 92064.`;
|
|
|
1139
1203
|
// Retrieving entity by relative time...
|
|
1140
1204
|
let resultEntity = await nymph.getEntities(
|
|
1141
1205
|
{ class: TestModel },
|
|
1142
|
-
{ type: '&', tag: 'test', gt: ['timestamp', null, '+1 day'] }
|
|
1206
|
+
{ type: '&', tag: 'test', gt: ['timestamp', null, '+1 day'] },
|
|
1143
1207
|
);
|
|
1144
1208
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1145
1209
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -1147,7 +1211,7 @@ This one's zip code is 92064.`;
|
|
|
1147
1211
|
// Retrieving entity by relative time...
|
|
1148
1212
|
resultEntity = await nymph.getEntities(
|
|
1149
1213
|
{ class: TestModel },
|
|
1150
|
-
{ type: '&', tag: 'test', lt: ['timestamp', null, '-3 days'] }
|
|
1214
|
+
{ type: '&', tag: 'test', lt: ['timestamp', null, '-3 days'] },
|
|
1151
1215
|
);
|
|
1152
1216
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1153
1217
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -1155,7 +1219,7 @@ This one's zip code is 92064.`;
|
|
|
1155
1219
|
// Retrieving entity by relative time...
|
|
1156
1220
|
resultEntity = await nymph.getEntities(
|
|
1157
1221
|
{ class: TestModel },
|
|
1158
|
-
{ type: '&', tag: 'test', gt: ['cdate', null, '+1 day'] }
|
|
1222
|
+
{ type: '&', tag: 'test', gt: ['cdate', null, '+1 day'] },
|
|
1159
1223
|
);
|
|
1160
1224
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1161
1225
|
expect(referenceEntity.$inArray(resultEntity)).toEqual(false);
|
|
@@ -1165,9 +1229,11 @@ This one's zip code is 92064.`;
|
|
|
1165
1229
|
await createTestEntities();
|
|
1166
1230
|
|
|
1167
1231
|
// Testing referenced entities...
|
|
1232
|
+
await testEntity.reference?.$wake();
|
|
1168
1233
|
expect(testEntity.reference?.test).toEqual('good');
|
|
1169
1234
|
|
|
1170
1235
|
// Testing referenced entity arrays...
|
|
1236
|
+
await Promise.all(testEntity.refArray?.map((e) => e.$wake()) || []);
|
|
1171
1237
|
expect(testEntity.refArray?.[0].test).toEqual('good');
|
|
1172
1238
|
});
|
|
1173
1239
|
|
|
@@ -1177,7 +1243,7 @@ This one's zip code is 92064.`;
|
|
|
1177
1243
|
// Retrieving entity by reference...
|
|
1178
1244
|
const resultEntity = await nymph.getEntities(
|
|
1179
1245
|
{ class: TestModel },
|
|
1180
|
-
{ type: '&', ref: ['reference', refGuid] }
|
|
1246
|
+
{ type: '&', ref: ['reference', refGuid] },
|
|
1181
1247
|
);
|
|
1182
1248
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1183
1249
|
});
|
|
@@ -1189,7 +1255,7 @@ This one's zip code is 92064.`;
|
|
|
1189
1255
|
const resultEntity = await nymph.getEntities(
|
|
1190
1256
|
{ class: TestModel },
|
|
1191
1257
|
{ type: '&', tag: 'test' },
|
|
1192
|
-
{ type: '!&', ref: ['reference', guid()] }
|
|
1258
|
+
{ type: '!&', ref: ['reference', guid()] },
|
|
1193
1259
|
);
|
|
1194
1260
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1195
1261
|
});
|
|
@@ -1200,7 +1266,7 @@ This one's zip code is 92064.`;
|
|
|
1200
1266
|
// Testing wrong reference...
|
|
1201
1267
|
const resultEntity = await nymph.getEntities(
|
|
1202
1268
|
{ class: TestModel },
|
|
1203
|
-
{ type: '&', ref: ['reference', guid()] }
|
|
1269
|
+
{ type: '&', ref: ['reference', guid()] },
|
|
1204
1270
|
);
|
|
1205
1271
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1206
1272
|
});
|
|
@@ -1211,7 +1277,7 @@ This one's zip code is 92064.`;
|
|
|
1211
1277
|
// Testing non-existent reference...
|
|
1212
1278
|
const resultEntity = await nymph.getEntities(
|
|
1213
1279
|
{ class: TestModel },
|
|
1214
|
-
{ type: '&', ref: ['pickle', refGuid] }
|
|
1280
|
+
{ type: '&', ref: ['pickle', refGuid] },
|
|
1215
1281
|
);
|
|
1216
1282
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1217
1283
|
});
|
|
@@ -1228,7 +1294,7 @@ This one's zip code is 92064.`;
|
|
|
1228
1294
|
['reference', refGuid],
|
|
1229
1295
|
['reference', guid()],
|
|
1230
1296
|
],
|
|
1231
|
-
}
|
|
1297
|
+
},
|
|
1232
1298
|
);
|
|
1233
1299
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1234
1300
|
});
|
|
@@ -1245,7 +1311,7 @@ This one's zip code is 92064.`;
|
|
|
1245
1311
|
['reference', guid()],
|
|
1246
1312
|
['reference', guid()],
|
|
1247
1313
|
],
|
|
1248
|
-
}
|
|
1314
|
+
},
|
|
1249
1315
|
);
|
|
1250
1316
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1251
1317
|
});
|
|
@@ -1256,7 +1322,7 @@ This one's zip code is 92064.`;
|
|
|
1256
1322
|
// Retrieving entity by array reference...
|
|
1257
1323
|
const resultEntity = await nymph.getEntities(
|
|
1258
1324
|
{ class: TestModel },
|
|
1259
|
-
{ type: '&', ref: ['refArray', refGuid] }
|
|
1325
|
+
{ type: '&', ref: ['refArray', refGuid] },
|
|
1260
1326
|
);
|
|
1261
1327
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1262
1328
|
});
|
|
@@ -1273,7 +1339,7 @@ This one's zip code is 92064.`;
|
|
|
1273
1339
|
['refArray', refGuid],
|
|
1274
1340
|
['refArray', guid()],
|
|
1275
1341
|
],
|
|
1276
|
-
}
|
|
1342
|
+
},
|
|
1277
1343
|
);
|
|
1278
1344
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1279
1345
|
});
|
|
@@ -1307,6 +1373,8 @@ This one's zip code is 92064.`;
|
|
|
1307
1373
|
['array', 'of'],
|
|
1308
1374
|
['array', 'values'],
|
|
1309
1375
|
['array', 500],
|
|
1376
|
+
['array', { test: true }],
|
|
1377
|
+
['array', { nullbyte: '\\\x00\u0000 \x00' }],
|
|
1310
1378
|
],
|
|
1311
1379
|
},
|
|
1312
1380
|
{
|
|
@@ -1318,7 +1386,7 @@ This one's zip code is 92064.`;
|
|
|
1318
1386
|
['array', 'values'],
|
|
1319
1387
|
['array', 500],
|
|
1320
1388
|
],
|
|
1321
|
-
}
|
|
1389
|
+
},
|
|
1322
1390
|
);
|
|
1323
1391
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1324
1392
|
});
|
|
@@ -1338,13 +1406,13 @@ This one's zip code is 92064.`;
|
|
|
1338
1406
|
|
|
1339
1407
|
const resultSelectors = await nymph.getEntities(
|
|
1340
1408
|
{ class: TestModel },
|
|
1341
|
-
{ type: '&', ref: ['reference', refGuid] }
|
|
1409
|
+
{ type: '&', ref: ['reference', refGuid] },
|
|
1342
1410
|
);
|
|
1343
1411
|
|
|
1344
1412
|
// Testing count return with selectors...
|
|
1345
1413
|
const resultSelectorsCount = await nymph.getEntities(
|
|
1346
1414
|
{ class: TestModel, return: 'count' },
|
|
1347
|
-
{ type: '&', ref: ['reference', refGuid] }
|
|
1415
|
+
{ type: '&', ref: ['reference', refGuid] },
|
|
1348
1416
|
);
|
|
1349
1417
|
expect(resultSelectorsCount).toBeGreaterThanOrEqual(1);
|
|
1350
1418
|
expect(resultSelectorsCount).toEqual(resultSelectors.length);
|
|
@@ -1367,7 +1435,7 @@ This one's zip code is 92064.`;
|
|
|
1367
1435
|
// Testing empty count...
|
|
1368
1436
|
const resultSelectorsEmpty = await nymph.getEntities(
|
|
1369
1437
|
{ class: TestModel, return: 'count' },
|
|
1370
|
-
{ type: '&', ref: ['reference', guid()] }
|
|
1438
|
+
{ type: '&', ref: ['reference', guid()] },
|
|
1371
1439
|
);
|
|
1372
1440
|
expect(resultSelectorsEmpty).toEqual(0);
|
|
1373
1441
|
});
|
|
@@ -1401,6 +1469,8 @@ This one's zip code is 92064.`;
|
|
|
1401
1469
|
['array', 'of'],
|
|
1402
1470
|
['array', 'values'],
|
|
1403
1471
|
['array', 500],
|
|
1472
|
+
['array', { test: true }],
|
|
1473
|
+
['array', { nullbyte: '\\\x00\u0000 \x00' }],
|
|
1404
1474
|
],
|
|
1405
1475
|
},
|
|
1406
1476
|
{
|
|
@@ -1412,7 +1482,7 @@ This one's zip code is 92064.`;
|
|
|
1412
1482
|
['array', 'values'],
|
|
1413
1483
|
['array', 500],
|
|
1414
1484
|
],
|
|
1415
|
-
}
|
|
1485
|
+
},
|
|
1416
1486
|
);
|
|
1417
1487
|
expect(resultGuid.indexOf(testEntity.guid ?? '')).toBeGreaterThan(-1);
|
|
1418
1488
|
});
|
|
@@ -1449,6 +1519,8 @@ This one's zip code is 92064.`;
|
|
|
1449
1519
|
['array', 'of'],
|
|
1450
1520
|
['array', 'values'],
|
|
1451
1521
|
['array', 500],
|
|
1522
|
+
['array', { test: true }],
|
|
1523
|
+
['array', { nullbyte: '\\\x00\u0000 \x00' }],
|
|
1452
1524
|
],
|
|
1453
1525
|
},
|
|
1454
1526
|
{
|
|
@@ -1462,7 +1534,7 @@ This one's zip code is 92064.`;
|
|
|
1462
1534
|
],
|
|
1463
1535
|
},
|
|
1464
1536
|
],
|
|
1465
|
-
}
|
|
1537
|
+
},
|
|
1466
1538
|
);
|
|
1467
1539
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1468
1540
|
|
|
@@ -1494,6 +1566,8 @@ This one's zip code is 92064.`;
|
|
|
1494
1566
|
['array', 'of'],
|
|
1495
1567
|
['array', 'values'],
|
|
1496
1568
|
['array', 500],
|
|
1569
|
+
['array', { test: true }],
|
|
1570
|
+
['array', { nullbyte: '\\\x00\u0000 \x00' }],
|
|
1497
1571
|
],
|
|
1498
1572
|
},
|
|
1499
1573
|
{
|
|
@@ -1507,7 +1581,7 @@ This one's zip code is 92064.`;
|
|
|
1507
1581
|
],
|
|
1508
1582
|
},
|
|
1509
1583
|
],
|
|
1510
|
-
}
|
|
1584
|
+
},
|
|
1511
1585
|
);
|
|
1512
1586
|
expect(testEntity.$inArray(resultEntity2)).toEqual(true);
|
|
1513
1587
|
|
|
@@ -1523,7 +1597,7 @@ This one's zip code is 92064.`;
|
|
|
1523
1597
|
},
|
|
1524
1598
|
{ type: '&', gte: ['number', 16000] },
|
|
1525
1599
|
],
|
|
1526
|
-
}
|
|
1600
|
+
},
|
|
1527
1601
|
);
|
|
1528
1602
|
expect(testEntity.$inArray(resultEntity3)).toEqual(true);
|
|
1529
1603
|
|
|
@@ -1545,7 +1619,7 @@ This one's zip code is 92064.`;
|
|
|
1545
1619
|
},
|
|
1546
1620
|
},
|
|
1547
1621
|
],
|
|
1548
|
-
}
|
|
1622
|
+
},
|
|
1549
1623
|
);
|
|
1550
1624
|
expect(testEntity.$inArray(resultEntity4)).toEqual(true);
|
|
1551
1625
|
});
|
|
@@ -1564,7 +1638,7 @@ This one's zip code is 92064.`;
|
|
|
1564
1638
|
},
|
|
1565
1639
|
{ type: '&', gte: ['number', 16000] },
|
|
1566
1640
|
],
|
|
1567
|
-
}
|
|
1641
|
+
},
|
|
1568
1642
|
);
|
|
1569
1643
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1570
1644
|
});
|
|
@@ -1581,7 +1655,7 @@ This one's zip code is 92064.`;
|
|
|
1581
1655
|
'reference',
|
|
1582
1656
|
[{ class: TestModel }, { type: '&', equal: ['test', 'good'] }],
|
|
1583
1657
|
],
|
|
1584
|
-
}
|
|
1658
|
+
},
|
|
1585
1659
|
);
|
|
1586
1660
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1587
1661
|
});
|
|
@@ -1598,7 +1672,7 @@ This one's zip code is 92064.`;
|
|
|
1598
1672
|
'reference',
|
|
1599
1673
|
[{ class: TestModel }, { type: '&', equal: ['test', 'pickles'] }],
|
|
1600
1674
|
],
|
|
1601
|
-
}
|
|
1675
|
+
},
|
|
1602
1676
|
);
|
|
1603
1677
|
expect(testEntity.$inArray(resultEntity)).toEqual(true);
|
|
1604
1678
|
});
|
|
@@ -1615,7 +1689,7 @@ This one's zip code is 92064.`;
|
|
|
1615
1689
|
'reference',
|
|
1616
1690
|
[{ class: TestBModel }, { type: '&', equal: ['test', 'good'] }],
|
|
1617
1691
|
],
|
|
1618
|
-
}
|
|
1692
|
+
},
|
|
1619
1693
|
);
|
|
1620
1694
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1621
1695
|
});
|
|
@@ -1632,31 +1706,28 @@ This one's zip code is 92064.`;
|
|
|
1632
1706
|
'reference',
|
|
1633
1707
|
[{ class: TestModel }, { type: '&', equal: ['test', 'pickles'] }],
|
|
1634
1708
|
],
|
|
1635
|
-
}
|
|
1709
|
+
},
|
|
1636
1710
|
);
|
|
1637
1711
|
expect(testEntity.$inArray(resultEntity)).toEqual(false);
|
|
1638
1712
|
});
|
|
1639
1713
|
|
|
1640
|
-
it('sort option', async () => {
|
|
1714
|
+
it('cdate and mdate sort option', async () => {
|
|
1641
1715
|
await createMultipleTestEntities();
|
|
1642
1716
|
|
|
1643
|
-
for (const sort of ['cdate', 'mdate']) {
|
|
1717
|
+
for (const sort of ['cdate', 'mdate'] as ('cdate' | 'mdate')[]) {
|
|
1644
1718
|
// Retrieving entities sorted...
|
|
1645
|
-
let resultEntities = await nymph.getEntities({
|
|
1646
|
-
class: TestModel,
|
|
1647
|
-
sort: sort as 'cdate' | 'mdate',
|
|
1648
|
-
});
|
|
1719
|
+
let resultEntities = await nymph.getEntities({ class: TestModel, sort });
|
|
1649
1720
|
expect(resultEntities.length).toBeGreaterThan(100);
|
|
1650
1721
|
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1651
|
-
expect(
|
|
1652
|
-
resultEntities[i
|
|
1653
|
-
)
|
|
1722
|
+
expect(resultEntities[i + 1][sort]).toBeGreaterThan(
|
|
1723
|
+
resultEntities[i][sort] ?? 0,
|
|
1724
|
+
);
|
|
1654
1725
|
}
|
|
1655
1726
|
|
|
1656
1727
|
// And test the same with guid return...
|
|
1657
1728
|
let resultGuids = await nymph.getEntities({
|
|
1658
1729
|
class: TestModel,
|
|
1659
|
-
sort
|
|
1730
|
+
sort,
|
|
1660
1731
|
return: 'guid',
|
|
1661
1732
|
});
|
|
1662
1733
|
expect(resultGuids.length).toBeGreaterThan(100);
|
|
@@ -1667,48 +1738,121 @@ This one's zip code is 92064.`;
|
|
|
1667
1738
|
// Retrieving entities reverse sorted...
|
|
1668
1739
|
resultEntities = await nymph.getEntities({
|
|
1669
1740
|
class: TestModel,
|
|
1670
|
-
sort
|
|
1741
|
+
sort,
|
|
1671
1742
|
reverse: true,
|
|
1672
1743
|
});
|
|
1673
1744
|
expect(resultEntities.length).toBeGreaterThan(100);
|
|
1674
1745
|
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1675
|
-
expect(resultEntities[i + 1][sort
|
|
1676
|
-
resultEntities[i][sort
|
|
1746
|
+
expect(resultEntities[i + 1][sort]).toBeLessThan(
|
|
1747
|
+
resultEntities[i][sort] ?? 0,
|
|
1677
1748
|
);
|
|
1678
1749
|
}
|
|
1679
1750
|
|
|
1680
1751
|
// And again with other selectors.
|
|
1681
1752
|
// Retrieving entities sorted...
|
|
1682
1753
|
resultEntities = await nymph.getEntities(
|
|
1683
|
-
{ class: TestModel, sort
|
|
1684
|
-
{ type: '&', match: ['name', '^Multi Test '] }
|
|
1754
|
+
{ class: TestModel, sort },
|
|
1755
|
+
{ type: '&', match: ['name', '^Multi Test '] },
|
|
1685
1756
|
);
|
|
1686
1757
|
expect(resultEntities.length).toEqual(100);
|
|
1687
1758
|
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1688
|
-
expect(
|
|
1689
|
-
resultEntities[i
|
|
1690
|
-
)
|
|
1759
|
+
expect(resultEntities[i + 1][sort]).toBeGreaterThan(
|
|
1760
|
+
resultEntities[i][sort] ?? 0,
|
|
1761
|
+
);
|
|
1691
1762
|
}
|
|
1692
1763
|
|
|
1693
1764
|
// Retrieving entities reverse sorted...
|
|
1694
1765
|
resultEntities = await nymph.getEntities(
|
|
1695
|
-
{ class: TestModel, sort
|
|
1696
|
-
{ type: '&', match: ['name', '^Multi Test '] }
|
|
1766
|
+
{ class: TestModel, sort, reverse: true },
|
|
1767
|
+
{ type: '&', match: ['name', '^Multi Test '] },
|
|
1697
1768
|
);
|
|
1698
1769
|
expect(resultEntities.length).toEqual(100);
|
|
1699
1770
|
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1700
|
-
expect(resultEntities[i + 1][sort
|
|
1701
|
-
resultEntities[i][sort
|
|
1771
|
+
expect(resultEntities[i + 1][sort]).toBeLessThan(
|
|
1772
|
+
resultEntities[i][sort] ?? 0,
|
|
1702
1773
|
);
|
|
1703
1774
|
}
|
|
1704
1775
|
}
|
|
1705
1776
|
});
|
|
1706
1777
|
|
|
1778
|
+
it('property sort option', async () => {
|
|
1779
|
+
await createMultipleTestEntities();
|
|
1780
|
+
|
|
1781
|
+
// Retrieving entities sorted...
|
|
1782
|
+
let resultEntities = await nymph.getEntities({
|
|
1783
|
+
class: TestModel,
|
|
1784
|
+
sort: 'number',
|
|
1785
|
+
});
|
|
1786
|
+
expect(resultEntities.length).toBeGreaterThan(100);
|
|
1787
|
+
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1788
|
+
expect(resultEntities[i + 1].number ?? Infinity).toBeGreaterThanOrEqual(
|
|
1789
|
+
resultEntities[i].number ?? 0,
|
|
1790
|
+
);
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
// And test the same with guid return...
|
|
1794
|
+
let resultGuids = await nymph.getEntities({
|
|
1795
|
+
class: TestModel,
|
|
1796
|
+
sort: 'number',
|
|
1797
|
+
return: 'guid',
|
|
1798
|
+
});
|
|
1799
|
+
expect(resultGuids.length).toBeGreaterThan(100);
|
|
1800
|
+
for (let i = 0; i < resultGuids.length - 1; i++) {
|
|
1801
|
+
expect(resultGuids[i]).toEqual(resultEntities[i].guid);
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1804
|
+
// Retrieving entities reverse sorted...
|
|
1805
|
+
resultEntities = await nymph.getEntities({
|
|
1806
|
+
class: TestModel,
|
|
1807
|
+
sort: 'number',
|
|
1808
|
+
reverse: true,
|
|
1809
|
+
});
|
|
1810
|
+
expect(resultEntities.length).toBeGreaterThan(100);
|
|
1811
|
+
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1812
|
+
expect(resultEntities[i + 1].number ?? 0).toBeLessThanOrEqual(
|
|
1813
|
+
resultEntities[i].number ?? Infinity,
|
|
1814
|
+
);
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
// And again with other selectors.
|
|
1818
|
+
// Retrieving entities sorted...
|
|
1819
|
+
resultEntities = await nymph.getEntities(
|
|
1820
|
+
{ class: TestModel, sort: 'number' },
|
|
1821
|
+
{ type: '&', match: ['name', '^Multi Test '] },
|
|
1822
|
+
);
|
|
1823
|
+
expect(resultEntities.length).toEqual(100);
|
|
1824
|
+
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1825
|
+
expect(resultEntities[i + 1].number ?? Infinity).toBeGreaterThan(
|
|
1826
|
+
resultEntities[i].number ?? 0,
|
|
1827
|
+
);
|
|
1828
|
+
expect(resultEntities[i].name).toEqual(
|
|
1829
|
+
`Multi Test ${100 - (resultEntities[i].number ?? 0)}`,
|
|
1830
|
+
);
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
// Retrieving entities reverse sorted...
|
|
1834
|
+
resultEntities = await nymph.getEntities(
|
|
1835
|
+
{ class: TestModel, sort: 'number', reverse: true },
|
|
1836
|
+
{ type: '&', match: ['name', '^Multi Test '] },
|
|
1837
|
+
);
|
|
1838
|
+
expect(resultEntities.length).toEqual(100);
|
|
1839
|
+
for (let i = 0; i < resultEntities.length - 1; i++) {
|
|
1840
|
+
expect(resultEntities[i + 1].number ?? 0).toBeLessThan(
|
|
1841
|
+
resultEntities[i].number ?? Infinity,
|
|
1842
|
+
);
|
|
1843
|
+
expect(resultEntities[i].name).toEqual(
|
|
1844
|
+
`Multi Test ${100 - (resultEntities[i].number ?? 0)}`,
|
|
1845
|
+
);
|
|
1846
|
+
}
|
|
1847
|
+
});
|
|
1848
|
+
|
|
1707
1849
|
it('delete reference', async () => {
|
|
1708
1850
|
await createTestEntities();
|
|
1709
1851
|
|
|
1710
1852
|
// Deleting referenced entities...
|
|
1853
|
+
await testEntity.reference?.$wake();
|
|
1711
1854
|
expect(await testEntity.reference?.$delete()).toEqual(true);
|
|
1855
|
+
await Promise.all(testEntity.refArray?.map((e) => e.$wake()) || []);
|
|
1712
1856
|
expect(testEntity.reference?.guid).toBeNull();
|
|
1713
1857
|
});
|
|
1714
1858
|
|
|
@@ -1721,16 +1865,116 @@ This one's zip code is 92064.`;
|
|
|
1721
1865
|
|
|
1722
1866
|
const entity = await nymph.getEntity(
|
|
1723
1867
|
{ class: TestModel },
|
|
1724
|
-
{ type: '&', guid: testGuid }
|
|
1868
|
+
{ type: '&', guid: testGuid },
|
|
1725
1869
|
);
|
|
1726
1870
|
|
|
1727
1871
|
expect(entity).toBeNull();
|
|
1728
1872
|
});
|
|
1873
|
+
|
|
1874
|
+
it('allows non-duplicate unique strings', async () => {
|
|
1875
|
+
// Creating entity...
|
|
1876
|
+
const uniqueEntityA = await TestModel.factory();
|
|
1877
|
+
uniqueEntityA.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1878
|
+
uniqueEntityA.uniques = ['test a'];
|
|
1879
|
+
|
|
1880
|
+
// Saving entity...
|
|
1881
|
+
expect(await uniqueEntityA.$save()).toEqual(true);
|
|
1882
|
+
expect(uniqueEntityA.guid).not.toBeNull();
|
|
1883
|
+
|
|
1884
|
+
// Creating entity...
|
|
1885
|
+
const uniqueEntityB = await TestModel.factory();
|
|
1886
|
+
uniqueEntityB.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1887
|
+
uniqueEntityB.uniques = ['test b'];
|
|
1888
|
+
|
|
1889
|
+
// Saving entity...
|
|
1890
|
+
expect(await uniqueEntityB.$save()).toEqual(true);
|
|
1891
|
+
expect(uniqueEntityB.guid).not.toBeNull();
|
|
1892
|
+
|
|
1893
|
+
expect(uniqueEntityA.guid).not.toEqual(uniqueEntityB.guid);
|
|
1894
|
+
|
|
1895
|
+
expect(await uniqueEntityA.$delete()).toEqual(true);
|
|
1896
|
+
expect(await uniqueEntityB.$delete()).toEqual(true);
|
|
1897
|
+
});
|
|
1898
|
+
|
|
1899
|
+
it('throws on duplicate unique strings', async () => {
|
|
1900
|
+
// Creating entity...
|
|
1901
|
+
const uniqueEntityA = await TestModel.factory();
|
|
1902
|
+
uniqueEntityA.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1903
|
+
uniqueEntityA.uniques = ['test a'];
|
|
1904
|
+
|
|
1905
|
+
// Saving entity...
|
|
1906
|
+
expect(await uniqueEntityA.$save()).toEqual(true);
|
|
1907
|
+
expect(uniqueEntityA.guid).not.toBeNull();
|
|
1908
|
+
|
|
1909
|
+
// Creating entity...
|
|
1910
|
+
const uniqueEntityB = await TestModel.factory();
|
|
1911
|
+
uniqueEntityB.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1912
|
+
uniqueEntityB.uniques = ['test a'];
|
|
1913
|
+
|
|
1914
|
+
// Saving entity...
|
|
1915
|
+
try {
|
|
1916
|
+
await uniqueEntityB.$save();
|
|
1917
|
+
|
|
1918
|
+
throw Error("Shouldn't get past the uniqueness check.");
|
|
1919
|
+
} catch (e: any) {
|
|
1920
|
+
expect(e).toBeInstanceOf(EntityUniqueConstraintError);
|
|
1921
|
+
}
|
|
1922
|
+
expect(uniqueEntityB.guid).toBeNull();
|
|
1923
|
+
|
|
1924
|
+
expect(await uniqueEntityA.$delete()).toEqual(true);
|
|
1925
|
+
});
|
|
1926
|
+
|
|
1927
|
+
it('allows duplicate unique string if first transaction is rolled back', async () => {
|
|
1928
|
+
// Creating transaction entity...
|
|
1929
|
+
const tnymphA = await nymph.startTransaction('test-unique-a');
|
|
1930
|
+
const TestModelA = tnymphA.getEntityClass(TestModel);
|
|
1931
|
+
const uniqueEntityA = await TestModelA.factory();
|
|
1932
|
+
uniqueEntityA.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1933
|
+
uniqueEntityA.uniques = ['test a'];
|
|
1934
|
+
|
|
1935
|
+
// Saving entity...
|
|
1936
|
+
expect(await uniqueEntityA.$save()).toEqual(true);
|
|
1937
|
+
expect(uniqueEntityA.guid).not.toBeNull();
|
|
1938
|
+
|
|
1939
|
+
// Rolling back transaction...
|
|
1940
|
+
expect(await tnymphA.rollback('test-unique-a')).toEqual(true);
|
|
1941
|
+
|
|
1942
|
+
// Creating transaction entity...
|
|
1943
|
+
const tnymphB = await nymph.startTransaction('test-unique-b');
|
|
1944
|
+
const TestModelB = tnymphB.getEntityClass(TestModel);
|
|
1945
|
+
const uniqueEntityB = await TestModelB.factory();
|
|
1946
|
+
uniqueEntityB.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1947
|
+
uniqueEntityB.uniques = ['test a'];
|
|
1948
|
+
|
|
1949
|
+
// Saving entity...
|
|
1950
|
+
expect(await uniqueEntityB.$save()).toEqual(true);
|
|
1951
|
+
expect(uniqueEntityB.guid).not.toBeNull();
|
|
1952
|
+
|
|
1953
|
+
expect(uniqueEntityA.guid).not.toEqual(uniqueEntityB.guid);
|
|
1954
|
+
|
|
1955
|
+
expect(await tnymphB.commit('test-unique-b')).toEqual(true);
|
|
1956
|
+
|
|
1957
|
+
const uniqueEntityACheck = await nymph.getEntity(
|
|
1958
|
+
{ class: TestModel },
|
|
1959
|
+
{ type: '&', guid: uniqueEntityA.guid ?? '' },
|
|
1960
|
+
);
|
|
1961
|
+
expect(uniqueEntityACheck).toBeNull();
|
|
1962
|
+
|
|
1963
|
+
const uniqueEntityBCheck = await nymph.getEntity(
|
|
1964
|
+
{ class: TestModel },
|
|
1965
|
+
{ type: '&', guid: uniqueEntityB.guid ?? '' },
|
|
1966
|
+
);
|
|
1967
|
+
expect(uniqueEntityBCheck).not.toBeNull();
|
|
1968
|
+
|
|
1969
|
+
if (uniqueEntityBCheck != null) {
|
|
1970
|
+
expect(await uniqueEntityBCheck.$delete()).toEqual(true);
|
|
1971
|
+
}
|
|
1972
|
+
});
|
|
1729
1973
|
}
|
|
1730
1974
|
|
|
1731
1975
|
export function UIDTest(
|
|
1732
1976
|
nymph: Nymph,
|
|
1733
|
-
it: (name: string, fn: () => void) => void
|
|
1977
|
+
it: (name: string, fn: () => void) => void,
|
|
1734
1978
|
) {
|
|
1735
1979
|
it('delete old test data', async () => {
|
|
1736
1980
|
expect(await nymph.deleteUID('TestUID')).toEqual(true);
|
|
@@ -1771,7 +2015,7 @@ export function UIDTest(
|
|
|
1771
2015
|
|
|
1772
2016
|
export function ExportImportTest(
|
|
1773
2017
|
nymph: Nymph,
|
|
1774
|
-
it: (name: string, fn: () => void) => void
|
|
2018
|
+
it: (name: string, fn: () => void) => void,
|
|
1775
2019
|
) {
|
|
1776
2020
|
const TestModel = nymph.addEntityClass(TestModelClass);
|
|
1777
2021
|
const TestBModel = nymph.addEntityClass(TestBModelClass);
|
|
@@ -1807,23 +2051,38 @@ export function ExportImportTest(
|
|
|
1807
2051
|
const bmodels = await nymph.getEntities({ class: TestBModel });
|
|
1808
2052
|
|
|
1809
2053
|
expect(models.length).toEqual(30);
|
|
1810
|
-
expect(bmodels.length).toEqual(
|
|
1811
|
-
|
|
1812
|
-
const
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
2054
|
+
expect(bmodels.length).toEqual(30);
|
|
2055
|
+
|
|
2056
|
+
for (const model of models) {
|
|
2057
|
+
expect(model.name).toMatch(/^Entity Test /);
|
|
2058
|
+
expect(model.null).toBeDefined();
|
|
2059
|
+
expect(model.null).toBeNull();
|
|
2060
|
+
expect(model.string).toEqual('test');
|
|
2061
|
+
expect(model.array).toEqual([
|
|
2062
|
+
'full',
|
|
2063
|
+
'of',
|
|
2064
|
+
'values',
|
|
2065
|
+
500,
|
|
2066
|
+
{ test: true },
|
|
2067
|
+
{ nullbyte: '\\\x00\u0000 \x00' },
|
|
2068
|
+
]);
|
|
2069
|
+
expect(model.match).toEqual(matchValue);
|
|
2070
|
+
expect(model.number).toEqual(30);
|
|
2071
|
+
expect(model.numberString).toEqual('30');
|
|
2072
|
+
expect(model.timestamp).toBeGreaterThanOrEqual(strtotime('-2 minutes'));
|
|
2073
|
+
expect(model.index).toMatch(/^\d+a$/);
|
|
2074
|
+
|
|
2075
|
+
await model.reference?.$wake();
|
|
2076
|
+
expect(model.reference?.guid).not.toBeNull();
|
|
2077
|
+
expect(model.reference?.string).toEqual('another');
|
|
2078
|
+
expect(model.reference?.index).toMatch(/^\d+b$/);
|
|
2079
|
+
expect(model.index?.substring(0, -1)).toEqual(
|
|
2080
|
+
model.reference?.index?.substring(0, -1),
|
|
2081
|
+
);
|
|
2082
|
+
expect(model.reference?.$inArray(bmodels)).toEqual(true);
|
|
2083
|
+
await Promise.all(model.refArray?.map((e) => e.$wake()) || []);
|
|
2084
|
+
expect(model.refArray?.[0].guid).not.toBeNull();
|
|
2085
|
+
expect(model.refArray?.[0].guid).toEqual(model.reference?.guid);
|
|
1827
2086
|
}
|
|
1828
2087
|
}
|
|
1829
2088
|
|
|
@@ -1836,22 +2095,29 @@ export function ExportImportTest(
|
|
|
1836
2095
|
expect(await nymph.newUID('TestUID')).toEqual(2);
|
|
1837
2096
|
expect(await nymph.newUID('TestUID2')).toEqual(1);
|
|
1838
2097
|
|
|
1839
|
-
for (let i = 0; i <
|
|
1840
|
-
const EntityClass = i < 15 ? TestModel : TestBModel;
|
|
1841
|
-
|
|
2098
|
+
for (let i = 0; i < 30; i++) {
|
|
1842
2099
|
// Creating entity...
|
|
1843
|
-
const testEntity = await
|
|
2100
|
+
const testEntity = await TestModel.factory();
|
|
1844
2101
|
|
|
1845
2102
|
// Saving entity...
|
|
1846
2103
|
testEntity.name = 'Entity Test ' + new Date().toLocaleString();
|
|
1847
2104
|
testEntity.null = null;
|
|
1848
2105
|
testEntity.string = 'test';
|
|
1849
|
-
testEntity.array = [
|
|
2106
|
+
testEntity.array = [
|
|
2107
|
+
'full',
|
|
2108
|
+
'of',
|
|
2109
|
+
'values',
|
|
2110
|
+
500,
|
|
2111
|
+
{ test: true },
|
|
2112
|
+
{ nullbyte: '\\\x00\u0000 \x00' },
|
|
2113
|
+
];
|
|
2114
|
+
testEntity.match = matchValue;
|
|
1850
2115
|
testEntity.number = 30;
|
|
2116
|
+
testEntity.numberString = '30';
|
|
1851
2117
|
testEntity.timestamp = Date.now();
|
|
1852
2118
|
testEntity.index = i + 'a';
|
|
1853
2119
|
|
|
1854
|
-
const entityReferenceTest = await
|
|
2120
|
+
const entityReferenceTest = await TestBModel.factory();
|
|
1855
2121
|
entityReferenceTest.string = 'another';
|
|
1856
2122
|
entityReferenceTest.index = i + 'b';
|
|
1857
2123
|
|
|
@@ -1865,9 +2131,13 @@ export function ExportImportTest(
|
|
|
1865
2131
|
await checkEntityDataAndCount();
|
|
1866
2132
|
});
|
|
1867
2133
|
|
|
2134
|
+
it('needs migration', async () => {
|
|
2135
|
+
expect(await nymph.needsMigration()).toEqual(false);
|
|
2136
|
+
});
|
|
2137
|
+
|
|
1868
2138
|
it('export data', async () => {
|
|
1869
2139
|
expect(await nymph.export(__dirname + '/testentityexport.nex')).toEqual(
|
|
1870
|
-
true
|
|
2140
|
+
true,
|
|
1871
2141
|
);
|
|
1872
2142
|
});
|
|
1873
2143
|
|
|
@@ -1884,7 +2154,7 @@ export function ExportImportTest(
|
|
|
1884
2154
|
expect(bmodels.length).toEqual(0);
|
|
1885
2155
|
|
|
1886
2156
|
expect(await nymph.import(__dirname + '/testentityexport.nex')).toEqual(
|
|
1887
|
-
true
|
|
2157
|
+
true,
|
|
1888
2158
|
);
|
|
1889
2159
|
|
|
1890
2160
|
await checkEntityDataAndCount();
|
|
@@ -1892,3 +2162,114 @@ export function ExportImportTest(
|
|
|
1892
2162
|
fs.unlinkSync(__dirname + '/testentityexport.nex');
|
|
1893
2163
|
});
|
|
1894
2164
|
}
|
|
2165
|
+
|
|
2166
|
+
const matchValue = `Hello, my name is Edward McCheese. It is a pleasure to meet you. As you can see, I have several hats of the most pleasant nature.
|
|
2167
|
+
|
|
2168
|
+
This one's email address is nice_hat-wednesday+newyork@im-a-hat.hat.
|
|
2169
|
+
This one's phone number is (555) 555-1818.
|
|
2170
|
+
This one's zip code is 92064.
|
|
2171
|
+
This one's favorite emojis are 🔥❤️😊😂⭐🤔
|
|
2172
|
+
|
|
2173
|
+
These hats are absolutely fantastic.
|
|
2174
|
+
|
|
2175
|
+
\x00\x00\x00
|
|
2176
|
+
|
|
2177
|
+
Lorem ipsum odor amet, consectetuer adipiscing elit. Metus ad mattis sit pretium per, dignissim imperdiet luctus. Congue rhoncus turpis etiam aenean ultricies dapibus justo nunc. Netus non primis quis habitasse lacus. Nascetur dapibus sociosqu ridiculus primis; elementum netus consectetur ridiculus litora. Tristique facilisis erat ex class nulla cursus amet. Metus vitae tempor euismod vel; ullamcorper ac quisque vestibulum. Mauris libero pulvinar facilisi eros natoque massa.
|
|
2178
|
+
|
|
2179
|
+
Nunc vel hac nec tristique vivamus. Leo volutpat convallis eget integer tellus cubilia tincidunt malesuada? Consequat elit nisi tristique vehicula cubilia maecenas metus facilisi malesuada. In mattis euismod ad magnis fusce. Nisi congue sociosqu rhoncus lobortis fringilla sollicitudin at platea. Iaculis ut et varius metus eleifend laoreet hac odio libero. Non ridiculus tempus ultricies nullam curabitur.
|
|
2180
|
+
|
|
2181
|
+
Amet pellentesque aliquam placerat; vestibulum blandit platea porttitor pulvinar. Tellus tristique ad morbi in ac placerat luctus. Ante efficitur inceptos commodo lacus sodales sit varius nunc consequat. Senectus non vel est convallis mauris. Venenatis feugiat massa nostra, purus class primis sodales odio. Risus nulla integer feugiat ridiculus porta nascetur. Rutrum tincidunt enim parturient libero nisl ante sagittis nisi. Cubilia massa non vehicula vehicula amet parturient pellentesque. Habitant dapibus fames lectus pretium rhoncus.
|
|
2182
|
+
|
|
2183
|
+
Ridiculus nascetur mauris iaculis hendrerit ridiculus gravida auctor in. Class suscipit augue finibus semper vulputate nec. Tristique mi eu praesent commodo fermentum inceptos penatibus lobortis. Libero enim orci ultricies egestas ut pellentesque. Laoreet massa ad curabitur tellus libero laoreet habitasse enim nascetur. Iaculis euismod a euismod conubia purus. Commodo condimentum ultrices lorem ligula aenean; netus mattis sem non.
|
|
2184
|
+
|
|
2185
|
+
Curabitur duis imperdiet mus integer vel bibendum; fusce malesuada. Dignissim duis himenaeos primis odio, congue pharetra? Egestas mus sit eget proin quis. Neque dapibus dapibus nam sociosqu; maecenas viverra himenaeos. Himenaeos faucibus himenaeos faucibus ex litora eros faucibus cras. Maximus scelerisque nullam nunc congue fringilla. Nisi eu magna erat morbi cras enim amet litora. Nostra primis vitae arcu, accumsan sollicitudin curabitur. Potenti sit vel vehicula metus leo id. Etiam blandit quisque nam orci; neque lacinia rutrum.
|
|
2186
|
+
|
|
2187
|
+
Aliquam mollis varius hendrerit sem eleifend fermentum. Sapien rutrum condimentum inceptos ex feugiat consectetur mollis magna diam. Natoque enim nisi, ex risus finibus lacinia conubia vivamus suscipit. Habitasse interdum lorem ante, bibendum posuere dis. Lacus porttitor sapien proin; consequat velit ipsum venenatis. Vivamus porta mattis morbi nunc torquent neque. Senectus vehicula tincidunt parturient fringilla id amet urna libero pharetra.
|
|
2188
|
+
|
|
2189
|
+
Faucibus netus tincidunt et viverra augue ligula est quis. Ipsum tempus vehicula tortor dis tortor ad. Ex tincidunt torquent eleifend aenean urna commodo. Quam nullam imperdiet volutpat vel condimentum cubilia sociosqu. Etiam tempor sapien mattis, venenatis aptent id risus. Efficitur luctus vel; nam ut commodo sociosqu hendrerit. Quisque placerat gravida rhoncus blandit vitae. Himenaeos id risus est mollis aliquet nam curabitur.
|
|
2190
|
+
|
|
2191
|
+
Habitasse sed est fames quis lobortis leo mattis. Nisl cursus tincidunt cursus felis porttitor. Ante integer turpis non class lobortis suscipit. Condimentum velit vulputate quis sapien, lacus magna adipiscing nec primis. Blandit consequat ipsum nostra dignissim; tincidunt torquent fames. Ac faucibus elit iaculis duis lobortis. Euismod facilisi massa turpis mus neque. Class vulputate quisque elementum suscipit nostra tempus adipiscing. Malesuada himenaeos finibus ad inceptos volutpat scelerisque inceptos.
|
|
2192
|
+
|
|
2193
|
+
Natoque platea at feugiat cras tellus facilisi suspendisse lacinia maximus. Duis vestibulum eget molestie turpis risus dapibus dignissim torquent? Nulla nibh aptent fringilla scelerisque euismod mauris ornare. Orci finibus taciti habitasse fringilla laoreet convallis. Class sed fringilla eget quisque sit auctor. Id cursus mauris praesent maecenas iaculis. Ullamcorper luctus habitant ultrices pharetra etiam mattis morbi fringilla lorem.
|
|
2194
|
+
|
|
2195
|
+
Pharetra porta orci ridiculus inceptos eleifend sem ante quis. Molestie velit penatibus libero per sem litora congue. Porta quis egestas vivamus vitae potenti ornare. Elit molestie nullam vitae quam viverra. Nisl fringilla massa ridiculus donec ridiculus sed magnis. Cursus ad enim consequat ultricies tortor rhoncus pellentesque augue. Netus facilisis tempor elementum interdum at sagittis habitasse. Pretium imperdiet duis diam ullamcorper donec at suscipit. Id per inceptos ac luctus massa imperdiet tempor. Parturient libero suscipit non tempor ligula ullamcorper placerat varius.
|
|
2196
|
+
|
|
2197
|
+
Libero duis suspendisse cubilia rhoncus scelerisque faucibus mattis. Leo fusce urna at per inceptos vel lobortis. Quisque ex duis euismod dictum hac nibh eros. Penatibus eleifend tellus donec elit primis phasellus habitant dictum. Imperdiet consequat facilisi massa, lacus gravida sodales id sapien. Ornare sapien sit convallis suscipit nunc enim. Tempus at vitae class sollicitudin proin. Dolor aenean felis netus consectetur mattis phasellus vestibulum. Orci fringilla sodales montes sed himenaeos ex massa natoque porttitor.
|
|
2198
|
+
|
|
2199
|
+
Mus condimentum dui mollis dolor accumsan ligula pretium? Est phasellus platea iaculis vehicula et eros vel rutrum placerat. Nulla laoreet faucibus; congue netus magna senectus lectus dictum. Sodales aliquam eget himenaeos adipiscing, tempor feugiat. Lorem pellentesque iaculis fames lectus cubilia ornare sagittis rhoncus? Bibendum viverra tellus libero congue dignissim metus tellus aenean ultrices. Sollicitudin cras sollicitudin mattis lacus facilisis fermentum scelerisque porttitor rutrum.
|
|
2200
|
+
|
|
2201
|
+
Sapien aptent fames curae, consectetur dapibus mauris sollicitudin tellus. Laoreet etiam dignissim, suscipit platea libero vitae taciti eu nec. Donec lobortis metus nisi; est enim himenaeos molestie tellus sapien. Sapien tellus rhoncus blandit fusce hendrerit feugiat. Maximus sit hendrerit tincidunt nec imperdiet hendrerit semper suscipit. Quam augue proin netus rutrum et sem. Neque penatibus cubilia nec metus porta. Ornare pulvinar quam auctor, elit curae ad donec dis. Egestas aptent non tortor potenti morbi mauris.
|
|
2202
|
+
|
|
2203
|
+
Montes dui in pharetra primis consequat ante integer. Vulputate libero gravida rutrum tortor suscipit massa! Netus rhoncus platea torquent dapibus consectetur suspendisse etiam sociosqu. Quis placerat mauris et quam nascetur. Dictumst mi rutrum justo vitae ultricies feugiat nulla faucibus morbi. Consectetur nec condimentum euismod sodales nisi purus; finibus elementum facilisi.
|
|
2204
|
+
|
|
2205
|
+
Senectus mus faucibus ut morbi eu maximus. Turpis tincidunt sodales sociosqu lorem amet pulvinar laoreet faucibus. Mus bibendum vulputate hendrerit sollicitudin eu ridiculus posuere augue leo? Cubilia nostra consequat; fusce egestas himenaeos class ornare nec. Est montes tortor vivamus congue inceptos erat mi eget pellentesque. Amet vulputate fringilla aliquet fames tristique. Rutrum malesuada dapibus vehicula risus nunc torquent habitant turpis habitant. Ipsum proin viverra adipiscing cras et augue hendrerit. Efficitur euismod aliquam habitant; sit nisl potenti.
|
|
2206
|
+
|
|
2207
|
+
Conubia dignissim metus phasellus tristique augue, nullam quam finibus. Dignissim vel enim mattis praesent penatibus. Sapien pharetra curae torquent turpis fermentum feugiat facilisis nisi. Lacinia justo ante mauris finibus vitae ante efficitur dis. Urna gravida conubia amet rhoncus felis ut lorem placerat. Quisque fermentum suscipit aenean nisi suscipit ac? Quis ornare faucibus amet conubia justo maximus hendrerit phasellus aenean. Ex vivamus vulputate in mollis mauris praesent vehicula erat neque.
|
|
2208
|
+
|
|
2209
|
+
Orci nullam commodo habitant volutpat per tincidunt mus sit. Nisi cubilia fringilla viverra at orci magnis massa nam orci. Duis iaculis sapien nulla nascetur elit porta fermentum. Amus libero vivamus vel finibus magnis placerat himenaeos. Integer posuere suscipit non vulputate enim. Conubia id lobortis habitasse luctus odio maecenas enim conubia non. Mus egestas massa platea nullam sociosqu, magnis cras. Quam placerat nisi dui gravida ultricies, facilisis eu pharetra vivamus.
|
|
2210
|
+
|
|
2211
|
+
Fusce maecenas dis finibus senectus nascetur tortor. Nec rhoncus pretium vivamus donec vel ligula curabitur. Velit dis laoreet aenean, fusce metus blandit erat. Ligula purus natoque, arcu finibus tincidunt efficitur dolor curabitur. Ac risus et ipsum; consequat integer phasellus diam. Praesent ipsum gravida placerat porta volutpat tincidunt maximus sapien. Phasellus gravida orci enim velit condimentum.
|
|
2212
|
+
|
|
2213
|
+
Dui id laoreet penatibus orci sit a. Iaculis dis porttitor luctus; lacus dignissim quam commodo lorem. Nullam dictum quisque accumsan porttitor tortor fusce aenean. Aliquet quisque ultricies malesuada auctor facilisi tristique. Dolor nulla conubia ultricies odio ad. Nunc consectetur venenatis consequat nisi habitant. Praesent accumsan scelerisque morbi aliquam sociosqu auctor, nostra aenean.
|
|
2214
|
+
|
|
2215
|
+
Mauris amet conubia egestas eu posuere nullam. Est neque dictum in, lacus aliquam ultrices vestibulum. Dapibus dis habitasse cras conubia felis nibh. Egestas nisl iaculis nostra neque enim, ridiculus praesent. Consectetur eleifend eu mus; elit sed pellentesque fringilla. Ullamcorper hendrerit nibh aptent per congue libero ultrices eget. Mollis velit ad tortor lobortis ipsum.
|
|
2216
|
+
|
|
2217
|
+
Tristique neque justo potenti himenaeos; pellentesque nam vehicula. Maximus etiam ut nullam semper; fames curabitur quam ad morbi. Interdum curabitur platea augue porttitor a gravida. Leo imperdiet id aenean sit; habitasse quam tempus pellentesque? Nostra leo aenean amet lectus ultricies ridiculus nascetur ullamcorper. Taciti in iaculis quam nascetur proin varius eget vehicula.
|
|
2218
|
+
|
|
2219
|
+
Mattis hendrerit tempus interdum diam elementum primis augue phasellus sociosqu. Imperdiet pulvinar imperdiet lacinia posuere class magnis. Montes viverra scelerisque laoreet sociosqu proin lacus. Nam id justo praesent curabitur nam accumsan imperdiet commodo. Sociosqu netus sapien proin interdum ac. Dapibus tempor et sodales, natoque consequat torquent.
|
|
2220
|
+
|
|
2221
|
+
Lectus ultricies amet bibendum blandit finibus erat pellentesque. Nam quis ultrices curae; lorem gravida malesuada velit taciti enim. Facilisis fermentum suspendisse leo tristique litora dapibus rhoncus convallis. Netus iaculis eleifend viverra urna, vulputate ac convallis. Faucibus torquent dictum, nisl sed parturient libero. Ornare class habitant per consequat adipiscing rhoncus feugiat.
|
|
2222
|
+
|
|
2223
|
+
Proin molestie nullam eros parturient parturient curabitur aliquet. Rhoncus mus aenean sem aliquet sem finibus neque rutrum commodo. Efficitur litora lobortis nascetur adipiscing curae faucibus? Bibendum leo velit augue; potenti primis malesuada lacus ipsum. Facilisi potenti facilisis nam tempor consequat. Magnis suspendisse primis duis quam; suscipit quis fermentum phasellus. Massa ridiculus habitasse ipsum arcu sit maecenas gravida nisi? Dolor egestas lacinia lacinia libero nam curae suspendisse purus. Tristique inceptos curae netus scelerisque magna hendrerit commodo quis parturient. Eget accumsan erat sociosqu vestibulum platea turpis habitasse.
|
|
2224
|
+
|
|
2225
|
+
Maximus dignissim sed conubia a ipsum nullam condimentum dictumst. Suspendisse congue phasellus congue lacus sollicitudin senectus curae. Consequat sagittis in fringilla suscipit scelerisque suscipit. Rhoncus pharetra sodales malesuada sollicitudin lectus. Est primis pretium finibus felis pharetra nulla sapien lacinia. Nunc lorem aptent tristique quisque etiam posuere non ullamcorper. Potenti mus sed mus; non id eleifend pellentesque magnis.
|
|
2226
|
+
|
|
2227
|
+
Iaculis morbi mattis; ornare tincidunt neque mus egestas consectetur ultrices. Porta dapibus pretium, vulputate dis amet neque. Posuere auctor lacinia maecenas ridiculus ullamcorper tempus egestas cubilia nec. Cursus nulla lacinia mi facilisi, nisl tempor. Tempus elementum laoreet magnis neque morbi felis per. Suspendisse lectus vitae nunc amet himenaeos euismod aliquam. Quisque integer dictum aenean fermentum dictumst torquent.
|
|
2228
|
+
|
|
2229
|
+
Sociosqu per suspendisse augue phasellus velit dapibus parturient. At sit eu finibus posuere tincidunt. Phasellus duis scelerisque scelerisque taciti est venenatis. Arcu habitant augue amet eget maximus torquent. Eget gravida ut quisque ligula vel mus. Erat quis himenaeos; velit eget varius viverra interdum. Neque dapibus malesuada est a gravida libero integer aptent. Semper eleifend per at magnis, laoreet nibh orci vel ligula.
|
|
2230
|
+
|
|
2231
|
+
Odio purus finibus inceptos malesuada duis. Neque magnis est laoreet nibh gravida sagittis ullamcorper sodales. Parturient ultricies mattis lacus risus laoreet praesent. Tincidunt eleifend quis sagittis id nascetur. Nam scelerisque varius feugiat phasellus enim mauris nam. Tortor iaculis et cras; blandit sollicitudin pellentesque justo. Nam lacinia volutpat fusce nibh mollis; himenaeos iaculis. Vulputate dictum mattis sollicitudin accumsan at hendrerit.
|
|
2232
|
+
|
|
2233
|
+
Ipsum augue faucibus senectus porta dapibus metus. Netus sem amet nullam fermentum in dolor bibendum. Lacus quis enim vivamus enim risus elit suspendisse arcu. Penatibus proin pellentesque consequat nibh turpis fusce. Potenti sociosqu nunc tempor amet torquent. Aliquet porttitor adipiscing parturient curabitur hac? Condimentum morbi netus erat class hendrerit aptent. Placerat viverra molestie at eget donec quisque. Varius sem erat dolor, urna nunc ac duis inceptos maximus.
|
|
2234
|
+
|
|
2235
|
+
Nostra adipiscing dapibus eros vivamus accumsan elementum curae dignissim dignissim. Iaculis quisque fusce at conubia est habitant ipsum. Porttitor libero lobortis lobortis habitasse quis quisque nunc euismod aenean. Bibendum nullam volutpat quam vitae felis sit. Mauris bibendum nulla litora nec id, elit lacinia. Orci odio nunc est ante commodo dis quis diam convallis? Mattis a per cras amet egestas ex pellentesque nascetur augue. Egestas per massa per non metus hendrerit feugiat eu?
|
|
2236
|
+
|
|
2237
|
+
Praesent habitasse est elementum mattis potenti. Fermentum interdum enim orci dui faucibus sodales nisi mus. Tortor facilisi nunc potenti; dignissim magna varius! Risus cursus ornare tincidunt a feugiat massa cubilia. Sociosqu quis pharetra efficitur lorem ornare sapien arcu euismod. Elementum donec maecenas praesent scelerisque viverra mi natoque. Lacinia nibh eu commodo ut class blandit magnis.
|
|
2238
|
+
|
|
2239
|
+
Ullamcorper himenaeos mollis nostra placerat quam pellentesque nibh. Curae posuere cras dis senectus fringilla congue ipsum sit. Eros maecenas duis morbi consequat himenaeos ridiculus purus erat. Nascetur maximus massa eros class phasellus integer sed gravida. Vel donec lacinia donec curabitur penatibus integer ornare. Varius quam lectus magna per a mauris.
|
|
2240
|
+
|
|
2241
|
+
Imperdiet tempus malesuada ultrices egestas taciti nibh elit lacus. Nunc tempus tellus vitae duis rhoncus leo facilisis. Sapien nec mi lacus mi aliquet. Diam convallis fringilla libero duis integer integer dictum vel. Dolor montes nibh sapien dapibus ultrices praesent. Aeuismod phasellus taciti elit vehicula sit sociosqu. Lobortis neque urna dignissim penatibus felis vulputate. Primis magnis placerat, ligula massa facilisis nec.
|
|
2242
|
+
|
|
2243
|
+
Duis interdum himenaeos dis nisl et tortor condimentum accumsan. Laoreet amet fusce dis malesuada iaculis maximus fringilla. Conubia mus nibh felis vestibulum ad convallis mollis. Metus vivamus lobortis habitasse id nam. Egestas pretium eu penatibus consectetur malesuada congue tempus fusce. Rutrum neque pulvinar duis ligula fermentum malesuada. Tincidunt mollis molestie imperdiet ridiculus pharetra maximus sodales curabitur.
|
|
2244
|
+
|
|
2245
|
+
Sem nec integer fusce neque sagittis. Rutrum ipsum ante; urna enim primis consectetur nulla. Arcu ligula lectus varius magna ipsum, et dictum. Pharetra dignissim inceptos tristique natoque tempor volutpat. Luctus tristique himenaeos duis orci maecenas vel morbi. Habitasse a lacinia dignissim commodo elementum maecenas eu mollis. Fermentum tellus sem condimentum mattis elit lectus. Platea fusce arcu cras varius natoque? Volutpat tincidunt ridiculus mus massa ante dis sem ornare magna. Bibendum ornare ultrices proin efficitur; nascetur risus arcu.
|
|
2246
|
+
|
|
2247
|
+
Orci erat orci amet mollis venenatis. Feugiat torquent ex mattis, inceptos etiam integer. Class senectus aptent vivamus, semper dolor nisi at pretium volutpat. Natoque semper enim enim primis ultricies, pharetra pulvinar. Natoque litora tortor accumsan ridiculus lacinia integer; aliquet penatibus ridiculus. Placerat vestibulum justo tristique sapien senectus, et interdum et ridiculus. Urna aenean vel himenaeos; finibus a est efficitur donec. Dictum egestas quis fusce arcu; sapien himenaeos pretium congue. Semper et sapien nisi nascetur venenatis eros integer blandit.
|
|
2248
|
+
|
|
2249
|
+
Arcu per phasellus vehicula ad molestie? Eget arcu eget inceptos, eu ullamcorper diam. Gravida placerat elit ut hendrerit odio. Est lobortis imperdiet venenatis primis a. Facilisis integer maecenas adipiscing metus, rutrum curabitur. Dolor adipiscing himenaeos senectus tempus faucibus cras.
|
|
2250
|
+
|
|
2251
|
+
Massa torquent torquent ullamcorper erat nisl parturient primis eu pulvinar! Ridiculus sollicitudin dis eu, laoreet praesent hendrerit platea euismod. Lacinia dignissim suspendisse sagittis eu rutrum himenaeos curae massa diam. Platea ornare ridiculus consequat curabitur augue vestibulum ridiculus. Vel consectetur vivamus accumsan risus elementum? Imperdiet nascetur efficitur aliquam habitasse nascetur. Hendrerit quisque magnis in lacinia quis mauris.
|
|
2252
|
+
|
|
2253
|
+
Molestie fermentum blandit, viverra condimentum purus himenaeos. Fermentum congue a suspendisse ornare semper laoreet. Pharetra lacus non, iaculis ad taciti varius. Etiam nam risus vestibulum curabitur facilisis mattis, lorem hac id. Dignissim nibh tempor quam porta lectus nunc tincidunt aliquet. Tortor maximus maximus natoque nam magna torquent nec lectus mus. Vel fermentum semper vulputate penatibus vel purus.
|
|
2254
|
+
|
|
2255
|
+
Fermentum tincidunt penatibus platea himenaeos etiam sodales ad erat posuere. Vehicula vulputate sem blandit nullam sem. Condimentum eget lacus ad malesuada augue dui justo. Lobortis quis mauris pellentesque quam interdum sagittis. Nulla ullamcorper aptent hendrerit fusce hendrerit, cras cras magna. Ex quam torquent, congue dis est vulputate lacinia. Dignissim proin lacinia platea tortor elementum nullam. Purus natoque scelerisque habitant vestibulum; metus dui neque ipsum. Pellentesque augue montes fringilla et, maecenas habitant a.
|
|
2256
|
+
|
|
2257
|
+
Quam sapien eu scelerisque tristique, integer in rutrum gravida. Egestas lacinia nisi praesent turpis lacus maximus mus gravida. Dolor eget ultrices rhoncus velit; mollis id. Mi vulputate sed blandit nullam parturient venenatis. Neque vulputate iaculis nascetur felis fames ipsum adipiscing nullam? Vitae faucibus elit congue himenaeos orci volutpat nam. Magna tempus convallis vivamus eu semper. Egestas curabitur integer quis habitasse id taciti hac sociosqu morbi. Duis felis cursus potenti blandit cras dolor pharetra.
|
|
2258
|
+
|
|
2259
|
+
Ultricies vel primis nec mus malesuada congue? Habitasse semper mus ultricies; fermentum himenaeos placerat sodales. Platea sapien malesuada dignissim suscipit dis cras. Etiam odio pharetra metus donec odio natoque. Cras diam curae dapibus accumsan tortor mi laoreet. Ex mollis massa inceptos inceptos adipiscing. Cras rhoncus natoque accumsan augue enim. Parturient porttitor habitant semper platea elementum dictum ornare? Sociosqu blandit nullam vivamus elementum semper himenaeos.
|
|
2260
|
+
|
|
2261
|
+
Orci elit aliquam luctus habitant interdum. Tellus sollicitudin aliquam donec potenti praesent augue magnis auctor. Mattis faucibus iaculis etiam imperdiet lectus ad habitasse sollicitudin ac. Consequat maecenas quam dis adipiscing neque sociosqu. Ullamcorper in praesent himenaeos purus blandit nibh. Dignissim platea amet urna laoreet sociosqu lacinia accumsan consectetur risus. Adipiscing nullam arcu lobortis mi scelerisque feugiat non. Accumsan lacinia urna sit urna tincidunt nam pulvinar urna. Tellus cursus ac himenaeos sed aptent phasellus.
|
|
2262
|
+
|
|
2263
|
+
Scelerisque curabitur eget morbi leo phasellus morbi magnis. Elit nunc non vulputate eget at. Viverra efficitur dignissim fames ut condimentum tincidunt elementum lacus egestas. Dictum phasellus leo auctor dui diam. Sollicitudin placerat elit vehicula vulputate et at eleifend ullamcorper. Primis diam hac class leo justo etiam magnis. Justo maximus venenatis facilisis egestas hendrerit aptent arcu tortor consectetur. Consequat mus curabitur nisl; blandit enim at bibendum tempor bibendum. Ad nam arcu vehicula himenaeos sociosqu eu faucibus accumsan.
|
|
2264
|
+
|
|
2265
|
+
Maximus malesuada faucibus phasellus donec ligula. Rutrum pellentesque ultricies nullam; aenean scelerisque elementum. Porta luctus consectetur pharetra consequat varius. Ut dapibus senectus venenatis scelerisque fames ligula congue. Magna hendrerit faucibus ultricies tincidunt phasellus pellentesque, maecenas consequat! Malesuada senectus praesent sed condimentum aenean mi. Interdum sollicitudin mattis, purus vitae netus gravida. Nullam magna risus leo sit urna aenean.
|
|
2266
|
+
|
|
2267
|
+
Ut lacinia potenti vel varius habitant mus nullam adipiscing. Commodo potenti conubia hendrerit enim massa ad blandit. Nisl a massa nunc risus, condimentum enim. Hac aenean massa lacinia lobortis ad dolor sem. Nisl ex interdum blandit pulvinar pellentesque lorem. Sapien proin malesuada netus parturient pulvinar nec. Ex semper amet sem maximus blandit cras felis. Donec tellus auctor eleifend placerat natoque. Rutrum maecenas sollicitudin nisl consectetur in nulla rhoncus. Id rhoncus nec mi non lacinia leo efficitur nisi.
|
|
2268
|
+
|
|
2269
|
+
Dolor non phasellus id nascetur id nisi litora cubilia interdum. Lectus dolor sodales eu nulla porttitor placerat vulputate. Praesent ullamcorper consequat nulla torquent facilisis nunc. Rhoncus augue eleifend mauris erat duis varius felis. Dignissim nunc pulvinar vehicula dignissim maximus elit metus senectus. Venenatis conubia pulvinar commodo dui montes cubilia.
|
|
2270
|
+
|
|
2271
|
+
Cursus velit lacus aenean elit conubia. Velit in inceptos enim, elit lobortis est facilisis. Suscipit cursus dictum enim libero neque dolor himenaeos eu. Porta in integer praesent quisque quis sit. Primis velit tempus sit curae vehicula porttitor. Scelerisque nisi diam vehicula mi fusce dictum. Tincidunt mus eleifend commodo ridiculus adipiscing.
|
|
2272
|
+
|
|
2273
|
+
Pellentesque quis dignissim euismod in fermentum quam lobortis porta. Dis euismod ultricies montes odio sapien condimentum integer per. Torquent nascetur ante ante; diam ultrices nec habitant. Augue congue a conubia commodo ultricies tortor. Quis ridiculus netus vivamus dictumst efficitur parturient hendrerit. Facilisis ultrices suspendisse elit sodales eleifend maecenas tempor. Habitasse platea congue ac, pretium augue odio interdum netus. Mattis odio mi leo integer nisi diam phasellus elementum. Tortor himenaeos curabitur enim sit ac mi dictumst faucibus sociosqu.
|
|
2274
|
+
|
|
2275
|
+
Duis ex viverra auctor praesent elit ac. Sit ex at cubilia aenean scelerisque finibus ridiculus. Hendrerit imperdiet potenti erat risus commodo. Sit donec ullamcorper facilisi neque varius, suscipit malesuada hac. Nulla lacinia pulvinar non volutpat pellentesque lobortis ultrices dis. Faucibus luctus fusce, aliquam magnis pharetra sed dui nulla viverra. Lectus hendrerit eu pellentesque nostra mauris suspendisse himenaeos. Lectus bibendum inceptos commodo nulla magnis proin.`;
|