예제 #1
0
 private void CollectHeaderReferences(OpenApiHeader header)
 {
     if (header == null)
     {
         return;
     }
     if (header.UnresolvedReference)
     {
         if (!_unresolvedReferences.Contains(header.Reference))
         {
             _unresolvedReferences.Add(header.Reference);
         }
         return;
     }
     CollectSchemaReferences(header.Schema);
     foreach (var content in header.Content)
     {
         CollectMediaTypeReferences(content.Value);
     }
     foreach (var example in header.Examples)
     {
         if (example.Value.UnresolvedReference && !_unresolvedReferences.Contains(example.Value.Reference))
         {
             _unresolvedReferences.Add(example.Value.Reference);
         }
     }
 }
예제 #2
0
        public void ValidateExampleShouldNotHaveDataTypeMismatchForSimpleSchema()
        {
            // Arrange
            IEnumerable <OpenApiError> errors;
            var header = new OpenApiHeader()
            {
                Required = true,
                Example  = new OpenApiInteger(55),
                Schema   = new OpenApiSchema()
                {
                    Type = "string",
                }
            };

            // Act
            var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
            var walker    = new OpenApiWalker(validator);

            walker.Walk(header);

            errors = validator.Errors;
            bool result = !errors.Any();

            // Assert
            result.Should().BeFalse();
            errors.Select(e => e.Message).Should().BeEquivalentTo(new[]
            {
                RuleHelpers.DataTypeMismatchedErrorMessage
            });
            errors.Select(e => e.Pointer).Should().BeEquivalentTo(new[]
            {
                "#/example",
            });
        }
예제 #3
0
        private static OpenApiSchema GetOrCreateSchema(OpenApiHeader p)
        {
            if (p.Schema == null)
            {
                p.Schema = new OpenApiSchema();
            }

            return(p.Schema);
        }
예제 #4
0
 /// <summary>
 /// Visits <see cref="OpenApiHeader"/> and child objects
 /// </summary>
 /// <param name="header"></param>
 internal void Walk(OpenApiHeader header)
 {
     _visitor.Visit(header);
     Walk(header.Content);
     Walk(header.Example);
     Walk(header.Examples);
     Walk(header.Schema);
     Walk(header as IOpenApiExtensible);
 }
예제 #5
0
        /// <summary>
        /// Visits <see cref="OpenApiHeader"/> and child objects
        /// </summary>
        internal void Walk(OpenApiHeader header)
        {
            if (header == null)
            {
                return;
            }

            _visitor.Visit(header);
            Walk(OpenApiConstants.Content, () => Walk(header.Content));
            Walk(OpenApiConstants.Example, () => Walk(header.Example));
            Walk(OpenApiConstants.Examples, () => Walk(header.Examples));
            Walk(OpenApiConstants.Schema, () => Walk(header.Schema));
            Walk(header as IOpenApiExtensible);
        }
예제 #6
0
        public override void Visit(OpenApiHeader header)
        {
            if (header.UnresolvedReference)
            {
                throw new ArgumentException("Single pass reference resolution expects this element to already be resolved");
            }
            var schema = ResolveElement(header.Schema);

            if (schema != null)
            {
                header.Schema = schema as OpenApiSchema;
            }
            ResolveDict(header.Examples);
        }
예제 #7
0
        /// <summary>
        /// Visits <see cref="OpenApiHeader"/> and child objects
        /// </summary>
        internal void Walk(OpenApiHeader header, bool isComponent = false)
        {
            if (header == null || ProcessAsReference(header, isComponent))
            {
                return;
            }

            _visitor.Visit(header);
            Walk(OpenApiConstants.Content, () => Walk(header.Content));
            Walk(OpenApiConstants.Example, () => Walk(header.Example));
            Walk(OpenApiConstants.Examples, () => Walk(header.Examples));
            Walk(OpenApiConstants.Schema, () => Walk(header.Schema));
            Walk(header as IOpenApiExtensible);
        }
        private static IOpenApiReferenceable ResolveReferenceOnHeaderElement(
            OpenApiHeader headerElement,
            string propertyName,
            string mapKey,
            JsonPointer pointer)
        {
            switch (propertyName)
            {
            case OpenApiConstants.Schema:
                return(headerElement.Schema);

            case OpenApiConstants.Examples when mapKey != null:
                return(headerElement.Examples[mapKey]);

            default:
                throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer));
            }
        }
예제 #9
0
        public static OpenApiHeader LoadHeader(ParseNode node)
        {
            var mapNode = node.CheckMapNode("header");
            var header  = new OpenApiHeader();

            foreach (var property in mapNode)
            {
                property.ParseField(header, _headerFixedFields, _headerPatternFields);
            }

            var schema = node.Context.GetFromTempStorage <OpenApiSchema>("schema");

            if (schema != null)
            {
                header.Schema = schema;
                node.Context.SetTempStorage("schema", null);
            }

            return(header);
        }
        public static OpenApiHeader LoadHeader(ParseNode node)
        {
            var mapNode = node.CheckMapNode("header");

            var pointer = mapNode.GetReferencePointer();

            if (pointer != null)
            {
                return(mapNode.GetReferencedObject <OpenApiHeader>(ReferenceType.Header, pointer));
            }

            var header = new OpenApiHeader();

            foreach (var property in mapNode)
            {
                property.ParseField(header, _headerFixedFields, _headerPatternFields);
            }

            return(header);
        }
예제 #11
0
 public void Traverse(OpenApiHeader header)
 {
     if (header == null)
     {
         return;
     }
     Visitor.Visit(header);
     Traverse(header.Schema);
     if (header.Examples != null)
     {
         foreach (var example in header.Examples)
         {
             Traverse(example.Value);
         }
     }
     if (header.Content != null)
     {
         foreach (var mediaType in header.Content)
         {
             Traverse(mediaType.Value);
         }
     }
 }
        private static void LoadStyle(OpenApiHeader header, string style)
        {
            switch (style)
            {
            case "csv":
                header.Style = ParameterStyle.Simple;
                return;

            case "ssv":
                header.Style = ParameterStyle.SpaceDelimited;
                return;

            case "pipes":
                header.Style = ParameterStyle.PipeDelimited;
                return;

            case "tsv":
                throw new NotSupportedException();

            default:
                throw new OpenApiReaderException("Unrecognized header style: " + style);
            }
        }
예제 #13
0
        public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
        {
            // Arrange
            IEnumerable <OpenApiError> errors;

            var header = new OpenApiHeader()
            {
                Required = true,
                Schema   = new OpenApiSchema()
                {
                    Type = "object",
                    AdditionalProperties = new OpenApiSchema()
                    {
                        Type = "integer",
                    }
                },
                Examples =
                {
                    ["example0"] = new OpenApiExample()
                        {
                        Value = new OpenApiString("1"),
                        },
                    ["example1"] = new OpenApiExample()
                        {
                        Value = new OpenApiObject()
                        {
                        ["x"] = new OpenApiInteger(2),
                        ["y"] = new OpenApiString("20"),
                        ["z"] = new OpenApiString("200")
                        }
                        },
                    ["example2"] = new OpenApiExample()
                        {
                        Value =
                            new OpenApiArray()
                        {
                        new OpenApiInteger(3)
                        }
                        },
                    ["example3"] = new OpenApiExample()
                        {
                        Value = new OpenApiObject()
                        {
                        ["x"] = new OpenApiInteger(4),
                        ["y"] = new OpenApiInteger(40),
                        }
                        },
                }
            };

            // Act
            var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
            var walker    = new OpenApiWalker(validator);

            walker.Walk(header);

            errors = validator.Errors;
            bool result = !errors.Any();

            // Assert
            result.Should().BeFalse();
            errors.Select(e => e.Message).Should().BeEquivalentTo(new[]
            {
                RuleHelpers.DataTypeMismatchedErrorMessage,
                RuleHelpers.DataTypeMismatchedErrorMessage,
                RuleHelpers.DataTypeMismatchedErrorMessage,
            });
            errors.Select(e => e.Pointer).Should().BeEquivalentTo(new[]
            {
                // #enum/0 is not an error since the spec allows
                // representing an object using a string.
                "#/examples/example1/value/y",
                "#/examples/example1/value/z",
                "#/examples/example2/value"
            });
        }
 private void AddHeader(IList <PropertyParsingNode> nodes, OpenApiComponents components, OpenApiHeader header)
 {
     if (header == null)
     {
         return;
     }
     if (header.UnresolvedReference)
     {
         AddHeader(nodes, components, header.Reference);
         return;
     }
     AddSchema(nodes, components, header.Schema);
     foreach (var example in header.Examples)
     {
         if (example.Value.UnresolvedReference)
         {
             AddExample(nodes, components, example.Value.Reference);
         }
     }
     foreach (var content in header.Content)
     {
         AddSchema(nodes, components, content.Value.Schema);
         foreach (var example in content.Value.Examples)
         {
             if (example.Value.UnresolvedReference)
             {
                 AddExample(nodes, components, example.Value.Reference);
             }
         }
     }
 }
예제 #15
0
 public override void Visit(OpenApiHeader tag)
 {
     EncodeCall();
     base.Visit(tag);
 }
예제 #16
0
 /// <summary>
 /// Execute validation rules against an <see cref="OpenApiHeader"/>
 /// </summary>
 /// <param name="item">The object to be validated</param>
 public override void Visit(OpenApiHeader item) => Validate(item);
예제 #17
0
        public void LocateReferences()
        {
            var baseSchema = new OpenApiSchema()
            {
                Reference = new OpenApiReference()
                {
                    Id   = "base",
                    Type = ReferenceType.Schema
                },
                UnresolvedReference = false
            };

            var derivedSchema = new OpenApiSchema
            {
                AnyOf = new List <OpenApiSchema>()
                {
                    baseSchema
                },
                Reference = new OpenApiReference()
                {
                    Id   = "derived",
                    Type = ReferenceType.Schema
                },
                UnresolvedReference = false
            };

            var testHeader = new OpenApiHeader()
            {
                Schema    = derivedSchema,
                Reference = new OpenApiReference()
                {
                    Id   = "test-header",
                    Type = ReferenceType.Header
                },
                UnresolvedReference = false
            };

            var doc = new OpenApiDocument
            {
                Paths = new OpenApiPaths()
                {
                    ["/"] = new OpenApiPathItem()
                    {
                        Operations = new Dictionary <OperationType, OpenApiOperation>()
                        {
                            [OperationType.Get] = new OpenApiOperation()
                            {
                                Responses = new OpenApiResponses()
                                {
                                    ["200"] = new OpenApiResponse()
                                    {
                                        Content = new Dictionary <string, OpenApiMediaType>()
                                        {
                                            ["application/json"] = new OpenApiMediaType()
                                            {
                                                Schema = derivedSchema
                                            }
                                        },
                                        Headers = new Dictionary <string, OpenApiHeader>()
                                        {
                                            ["test-header"] = testHeader
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                Components = new OpenApiComponents()
                {
                    Schemas = new Dictionary <string, OpenApiSchema>()
                    {
                        ["derived"] = derivedSchema,
                        ["base"]    = baseSchema,
                    },
                    Headers = new Dictionary <string, OpenApiHeader>()
                    {
                        ["test-header"] = testHeader
                    }
                }
            };

            var locator = new LocatorVisitor();
            var walker  = new OpenApiWalker(locator);

            walker.Walk(doc);

            locator.Locations.Where(l => l.StartsWith("referenceAt:")).ShouldBeEquivalentTo(new List <string> {
                "referenceAt: #/paths/~1/get/responses/200/content/application~1json/schema",
                "referenceAt: #/paths/~1/get/responses/200/headers/test-header",
                "referenceAt: #/components/schemas/derived/anyOf/0",
                "referenceAt: #/components/headers/test-header/schema"
            });
        }
예제 #18
0
 public virtual void Visit(OpenApiHeader header)
 {
 }
예제 #19
0
 /// <summary>
 /// Visits <see cref="OpenApiHeader"/>
 /// </summary>
 public virtual void Visit(OpenApiHeader tag)
 {
 }
예제 #20
0
 public ChangedHeaderBO(OpenApiHeader oldHeader, OpenApiHeader newHeader, DiffContextBO context)
 {
     OldHeader = oldHeader;
     NewHeader = newHeader;
     _context  = context;
 }