@@ -538,7 +538,7 @@ void discriminatorInOneOfShouldOnlyReportErrorsInMatchingDiscriminator() {
538538 assertEquals ("required" , list .get (1 ).getType ());
539539 assertEquals ("numberOfBeds" , list .get (1 ).getProperty ());
540540 }
541-
541+
542542 @ Test
543543 void discriminatorMappingInOneOfShouldOnlyReportErrorsInMatchingDiscriminator () {
544544 String schemaData = "{\r \n "
@@ -640,4 +640,151 @@ void discriminatorMappingInOneOfShouldOnlyReportErrorsInMatchingDiscriminator()
640640 assertEquals ("numberOfBeds" , list .get (1 ).getProperty ());
641641 }
642642
643+ /**
644+ * See issue 436 and 985.
645+ */
646+ @ Test
647+ void oneOfMissingDiscriminatorValue () {
648+ String schemaData = " {\r \n "
649+ + " \" type\" : \" object\" ,\r \n "
650+ + " \" discriminator\" : { \" propertyName\" : \" name\" },\r \n "
651+ + " \" oneOf\" : [\r \n "
652+ + " {\r \n "
653+ + " \" $ref\" : \" #/defs/Foo\" \r \n "
654+ + " },\r \n "
655+ + " {\r \n "
656+ + " \" $ref\" : \" #/defs/Bar\" \r \n "
657+ + " }\r \n "
658+ + " ],\r \n "
659+ + " \" defs\" : {\r \n "
660+ + " \" Foo\" : {\r \n "
661+ + " \" type\" : \" object\" ,\r \n "
662+ + " \" properties\" : {\r \n "
663+ + " \" name\" : {\r \n "
664+ + " \" const\" : \" Foo\" \r \n "
665+ + " }\r \n "
666+ + " },\r \n "
667+ + " \" required\" : [ \" name\" ],\r \n "
668+ + " \" additionalProperties\" : false\r \n "
669+ + " },\r \n "
670+ + " \" Bar\" : {\r \n "
671+ + " \" type\" : \" object\" ,\r \n "
672+ + " \" properties\" : {\r \n "
673+ + " \" name\" : {\r \n "
674+ + " \" const\" : \" Bar\" \r \n "
675+ + " }\r \n "
676+ + " },\r \n "
677+ + " \" required\" : [ \" name\" ],\r \n "
678+ + " \" additionalProperties\" : false\r \n "
679+ + " }\r \n "
680+ + " }\r \n "
681+ + " }" ;
682+
683+ String inputData = "{}" ;
684+
685+ JsonSchemaFactory factory = JsonSchemaFactory .getInstance (VersionFlag .V202012 );
686+ SchemaValidatorsConfig config = new SchemaValidatorsConfig ();
687+ config .setOpenAPI3StyleDiscriminators (true );
688+ JsonSchema schema = factory .getSchema (schemaData , config );
689+ Set <ValidationMessage > messages = schema .validate (inputData , InputFormat .JSON );
690+ assertEquals (3 , messages .size ());
691+ List <ValidationMessage > list = messages .stream ().collect (Collectors .toList ());
692+ assertEquals ("oneOf" , list .get (0 ).getType ());
693+ assertEquals ("required" , list .get (1 ).getType ());
694+ assertEquals ("required" , list .get (2 ).getType ());
695+ }
696+
697+ /**
698+ * See issue 436.
699+ */
700+ @ Test
701+ void anyOfMissingDiscriminatorValue () {
702+ String schemaData = "{\r \n "
703+ + " \" type\" : \" array\" ,\r \n "
704+ + " \" items\" : {\r \n "
705+ + " \" anyOf\" : [\r \n "
706+ + " {\r \n "
707+ + " \" $ref\" : \" #/components/schemas/Kitchen\" \r \n "
708+ + " },\r \n "
709+ + " {\r \n "
710+ + " \" $ref\" : \" #/components/schemas/BedRoom\" \r \n "
711+ + " }\r \n "
712+ + " ]\r \n "
713+ + " },\r \n "
714+ + " \" components\" : {\r \n "
715+ + " \" schemas\" : {\r \n "
716+ + " \" Room\" : {\r \n "
717+ + " \" type\" : \" object\" ,\r \n "
718+ + " \" properties\" : {\r \n "
719+ + " \" @type\" : {\r \n "
720+ + " \" type\" : \" string\" \r \n "
721+ + " }\r \n "
722+ + " },\r \n "
723+ + " \" required\" : [\r \n "
724+ + " \" @type\" \r \n "
725+ + " ],\r \n "
726+ + " \" discriminator\" : {\r \n "
727+ + " \" propertyName\" : \" @type\" \r \n "
728+ + " }\r \n "
729+ + " },\r \n "
730+ + " \" BedRoom\" : {\r \n "
731+ + " \" type\" : \" object\" ,\r \n "
732+ + " \" allOf\" : [\r \n "
733+ + " {\r \n "
734+ + " \" $ref\" : \" #/components/schemas/Room\" \r \n "
735+ + " },\r \n "
736+ + " {\r \n "
737+ + " \" type\" : \" object\" ,\r \n "
738+ + " \" properties\" : {\r \n "
739+ + " \" numberOfBeds\" : {\r \n "
740+ + " \" type\" : \" integer\" \r \n "
741+ + " }\r \n "
742+ + " },\r \n "
743+ + " \" required\" : [\r \n "
744+ + " \" numberOfBeds\" \r \n "
745+ + " ]\r \n "
746+ + " }\r \n "
747+ + " ]\r \n "
748+ + " },\r \n "
749+ + " \" Kitchen\" : {\r \n "
750+ + " \" type\" : \" object\" ,\r \n "
751+ + " \" allOf\" : [\r \n "
752+ + " {\r \n "
753+ + " \" $ref\" : \" #/components/schemas/Room\" \r \n "
754+ + " },\r \n "
755+ + " {\r \n "
756+ + " \" type\" : \" object\" ,\r \n "
757+ + " \" properties\" : {\r \n "
758+ + " \" hasMicrowaveOven\" : {\r \n "
759+ + " \" type\" : \" boolean\" \r \n "
760+ + " }\r \n "
761+ + " },\r \n "
762+ + " \" required\" : [\r \n "
763+ + " \" hasMicrowaveOven\" \r \n "
764+ + " ]\r \n "
765+ + " }\r \n "
766+ + " ]\r \n "
767+ + " }\r \n "
768+ + " }\r \n "
769+ + " }\r \n "
770+ + "}" ;
771+
772+ String inputData = "[\r \n "
773+ + " {\r \n "
774+ + " \" hasMicrowaveOven\" : true\r \n "
775+ + " },\r \n "
776+ + " {\r \n "
777+ + " \" @type\" : \" BedRoom\" ,\r \n "
778+ + " \" numberOfBeds\" : 4\r \n "
779+ + " }\r \n "
780+ + "]" ;
781+
782+ JsonSchemaFactory factory = JsonSchemaFactory .getInstance (VersionFlag .V202012 );
783+ SchemaValidatorsConfig config = new SchemaValidatorsConfig ();
784+ config .setOpenAPI3StyleDiscriminators (true );
785+ JsonSchema schema = factory .getSchema (schemaData , config );
786+ Set <ValidationMessage > messages = schema .validate (inputData , InputFormat .JSON );
787+ List <ValidationMessage > list = messages .stream ().collect (Collectors .toList ());
788+ assertEquals ("required" , list .get (0 ).getType ());
789+ }
643790}
0 commit comments