@@ -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+
381622function newClassObject ( className : string ) {
382623 return {
383624 class : className ,
0 commit comments