Skip to content

Commit 3e262ce

Browse files
committed
adds tests for defaults / migrations of tokenization and indexing
1 parent ce90d32 commit 3e262ce

File tree

1 file changed

+241
-0
lines changed

1 file changed

+241
-0
lines changed

src/schema/journey.test.ts

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,247 @@ describe('schema', () => {
378378
});
379379
});
380380

381+
describe('property setting defaults and migrations', () => {
382+
const client = weaviate.client({
383+
scheme: 'http',
384+
host: 'localhost:8080',
385+
});
386+
387+
test.each([
388+
['text', null, 'text', 'word'],
389+
['text', '', 'text', 'word'],
390+
['text', 'word', 'text', 'word'],
391+
['text', 'lowercase', 'text', 'lowercase'],
392+
['text', 'whitespace', 'text', 'whitespace'],
393+
['text', 'field', 'text', 'field'],
394+
395+
['text[]', null, 'text[]', 'word'],
396+
['text[]', '', 'text[]', 'word'],
397+
['text[]', 'word', 'text[]', 'word'],
398+
['text[]', 'lowercase', 'text[]', 'lowercase'],
399+
['text[]', 'whitespace', 'text[]', 'whitespace'],
400+
['text[]', 'field', 'text[]', 'field'],
401+
402+
['string', null, 'text', 'whitespace'],
403+
['string', '', 'text', 'whitespace'],
404+
['string', 'word', 'text', 'whitespace'],
405+
['string', 'field', 'text', 'field'],
406+
407+
['string[]', null, 'text[]', 'whitespace'],
408+
['string[]', '', 'text[]', 'whitespace'],
409+
['string[]', 'word', 'text[]', 'whitespace'],
410+
['string[]', 'field', 'text[]', 'field'],
411+
412+
['int', null, 'int', null],
413+
['int', '', 'int', null],
414+
415+
['int[]', null, 'int[]', null],
416+
['int[]', '', 'int[]', null],
417+
])(
418+
'succeeds creating prop with data type and tokenization',
419+
async (
420+
dataType: string,
421+
tokenization: string | null,
422+
expectedDataType: string,
423+
expectedTokenization: string | null
424+
) => {
425+
await client.schema
426+
.classCreator()
427+
.withClass({
428+
class: 'SomeClass',
429+
properties: [
430+
{
431+
dataType: [dataType],
432+
name: 'property',
433+
tokenization: tokenization,
434+
},
435+
],
436+
})
437+
.do()
438+
.then((res: WeaviateClass) => {
439+
expect(res).toBeDefined();
440+
expect(res.properties).toHaveLength(1);
441+
expect(res.properties![0]).toHaveProperty('dataType', [expectedDataType]);
442+
if (expectedTokenization != null) {
443+
expect(res.properties![0]).toHaveProperty('tokenization', expectedTokenization);
444+
} else {
445+
expect(res.properties![0]).not.toHaveProperty('tokenization');
446+
}
447+
});
448+
449+
return deleteClass(client, 'SomeClass');
450+
}
451+
);
452+
453+
test.each([
454+
['string', 'whitespace'],
455+
['string', 'lowercase'],
456+
457+
['string[]', 'whitespace'],
458+
['string[]', 'lowercase'],
459+
460+
['int', 'word'],
461+
['int', 'whitespace'],
462+
['int', 'lowercase'],
463+
['int', 'field'],
464+
465+
['int[]', 'word'],
466+
['int[]', 'whitespace'],
467+
['int[]', 'lowercase'],
468+
['int[]', 'field'],
469+
])(
470+
'fails creating prop with data type and tokenization',
471+
async (dataType: string, tokenization: string | null) => {
472+
await client.schema
473+
.classCreator()
474+
.withClass({
475+
class: 'SomeClass',
476+
properties: [
477+
{
478+
dataType: [dataType],
479+
name: 'property',
480+
tokenization: tokenization,
481+
},
482+
],
483+
})
484+
.do()
485+
.catch((e: Error) => {
486+
expect(e.message).toContain('is not allowed for data type');
487+
});
488+
}
489+
);
490+
491+
test.each([
492+
['text', null, null, null, true, true],
493+
['text', null, null, false, true, false],
494+
['text', null, null, true, true, true],
495+
['text', null, false, null, false, true],
496+
['text', null, false, false, false, false],
497+
['text', null, false, true, false, true],
498+
['text', null, true, null, true, true],
499+
['text', null, true, false, true, false],
500+
['text', null, true, true, true, true],
501+
['text', false, null, null, false, false],
502+
['text', true, null, null, true, true],
503+
504+
['int', null, null, null, true, false],
505+
['int', null, null, false, true, false],
506+
['int', null, false, null, false, false],
507+
['int', null, false, false, false, false],
508+
['int', null, true, null, true, false],
509+
['int', null, true, false, true, false],
510+
['int', false, null, null, false, false],
511+
['int', true, null, null, true, false],
512+
])(
513+
'succeeds creating prop with data type and indexing',
514+
async (
515+
dataType: string,
516+
inverted: boolean | null,
517+
filterable: boolean | null,
518+
searchable: boolean | null,
519+
expectedFilterable: boolean,
520+
expectedSearchable: boolean
521+
) => {
522+
await client.schema
523+
.classCreator()
524+
.withClass({
525+
class: 'SomeClass',
526+
properties: [
527+
{
528+
dataType: [dataType],
529+
name: 'property',
530+
indexInverted: inverted,
531+
indexFilterable: filterable,
532+
indexSearchable: searchable,
533+
},
534+
],
535+
})
536+
.do()
537+
.then((res: WeaviateClass) => {
538+
expect(res).toBeDefined();
539+
expect(res.properties).toHaveLength(1);
540+
expect(res.properties![0]).toHaveProperty('indexFilterable', expectedFilterable);
541+
expect(res.properties![0]).toHaveProperty('indexSearchable', expectedSearchable);
542+
expect(res.properties![0]).not.toHaveProperty('indexInverted');
543+
});
544+
545+
return deleteClass(client, 'SomeClass');
546+
}
547+
);
548+
549+
const errMsg1 =
550+
'`indexInverted` is deprecated and can not be set together with `indexFilterable` or `indexSearchable`.';
551+
const errMsg2 =
552+
'`indexSearchable` is allowed only for text/text[] data types. For other data types set false or leave empty';
553+
test.each([
554+
['text', false, null, false, errMsg1],
555+
['text', false, null, true, errMsg1],
556+
['text', false, false, null, errMsg1],
557+
['text', false, false, false, errMsg1],
558+
['text', false, false, true, errMsg1],
559+
['text', false, true, null, errMsg1],
560+
['text', false, true, false, errMsg1],
561+
['text', false, true, true, errMsg1],
562+
['text', true, null, false, errMsg1],
563+
['text', true, null, true, errMsg1],
564+
['text', true, false, null, errMsg1],
565+
['text', true, false, false, errMsg1],
566+
['text', true, false, true, errMsg1],
567+
['text', true, true, null, errMsg1],
568+
['text', true, true, false, errMsg1],
569+
['text', true, true, true, errMsg1],
570+
571+
['int', false, null, false, errMsg1],
572+
['int', false, null, true, errMsg1],
573+
['int', false, false, null, errMsg1],
574+
['int', false, false, false, errMsg1],
575+
['int', false, false, true, errMsg1],
576+
['int', false, true, null, errMsg1],
577+
['int', false, true, false, errMsg1],
578+
['int', false, true, true, errMsg1],
579+
['int', true, null, false, errMsg1],
580+
['int', true, null, true, errMsg1],
581+
['int', true, false, null, errMsg1],
582+
['int', true, false, false, errMsg1],
583+
['int', true, false, true, errMsg1],
584+
['int', true, true, null, errMsg1],
585+
['int', true, true, false, errMsg1],
586+
['int', true, true, true, errMsg1],
587+
588+
['int', null, null, true, errMsg2],
589+
['int', null, false, true, errMsg2],
590+
['int', null, true, true, errMsg2],
591+
])(
592+
'fails creating prop with data type and indexing',
593+
async (
594+
dataType: string,
595+
inverted: boolean | null,
596+
filterable: boolean | null,
597+
searchable: boolean | null,
598+
errMsg: string
599+
) => {
600+
await client.schema
601+
.classCreator()
602+
.withClass({
603+
class: 'SomeClass',
604+
properties: [
605+
{
606+
dataType: [dataType],
607+
name: 'property',
608+
indexInverted: inverted,
609+
indexFilterable: filterable,
610+
indexSearchable: searchable,
611+
},
612+
],
613+
})
614+
.do()
615+
.catch((e: Error) => {
616+
expect(e.message).toContain(errMsg);
617+
});
618+
}
619+
);
620+
});
621+
381622
function newClassObject(className: string) {
382623
return {
383624
class: className,

0 commit comments

Comments
 (0)