public static void CallbackBuilder_Build() { var cbb = new CallbackBuilder() { [CompoundExpression.Parse("http://test/{$statusCode}")] = new Referable <Path>("#/test"), [CompoundExpression.Parse("http://test/1/{$statusCode}")] = new Referable <Path>("#/test/1"), }; var cb = cbb.Build(); var rcb = new CallbackBuilder(cb); Assert.Equal(cbb, cb); Assert.Equal(cbb, rcb); }
public static void CompoundExpression_Parse() { var sut = CompoundExpression.Parse("http://example.com/api/foo?bar={$request.body#/bar}&baz={$url}&foo={$method}{$statusCode}"); Assert.Equal(7, sut.Count); Assert.Equal(ExpressionComponentType.Literal, sut[0].ComponentType); Assert.Equal(ExpressionComponentType.Field, sut[1].ComponentType); Assert.Equal(ExpressionComponentType.Literal, sut[2].ComponentType); Assert.Equal(ExpressionComponentType.Field, sut[3].ComponentType); Assert.Equal(ExpressionComponentType.Literal, sut[4].ComponentType); Assert.Equal(ExpressionComponentType.Field, sut[5].ComponentType); Assert.Equal(ExpressionComponentType.Field, sut[6].ComponentType); Assert.Equal("http://example.com/api/foo?bar=", sut[0].ToString()); Assert.Equal("$request.body#/bar", sut[1].ToString()); Assert.Equal("&baz=", sut[2].ToString()); Assert.Equal("$url", sut[3].ToString()); Assert.Equal("&foo=", sut[4].ToString()); Assert.Equal("$method", sut[5].ToString()); Assert.Equal("$statusCode", sut[6].ToString()); }
public static void OpenApiSerializer_Serialize() { var sut = new OpenApiSerializer(); #region Graph var actualGraphBuilder = new DocumentBuilder() { Components = new ComponentsBuilder() { Callbacks = { ["callback1"] = new CallbackBuilder() { [CompoundExpression.Parse("http://foo{$statusCode}")] = new PathBuilder() { Description = "path1", Delete = new OperationBuilder() { Callbacks = { ["callback1"] = "#/components/callbacks/callback1" }, Description = "Delete operation", ExternalDocumentation = new ExternalDocumentationBuilder() { Description = "External docs 1", Url = new Uri("http://example.org") }, OperationIdentifier = "Operation 1", Options = OperationOptions.Deprecated, Parameters = { [new ParameterKey("p1")] = "#/components/parameters/parameter1" }, RequestBody = "#/components/requestBodies/requestBody1", Responses = { [ResponseKey.Default] = "#/components/responses/response1" }, Summary = "Delete operation summary" }, Get = new OperationBuilder() { Description = "Get" }, Head = new OperationBuilder() { Description = "Head" }, Options = new OperationBuilder() { Description = "Options" }, Parameters = { [new ParameterKey("p1")] = "#/components/parameters/parameter1" }, Patch = new OperationBuilder() { Description = "Patch" }, Post = new OperationBuilder() { Description = "Post" }, Put = new OperationBuilder() { Description = "Put" }, Summary = "Summary", Trace = new OperationBuilder() { Description = "Trace" } } } }, Examples = { ["example1"] = new ExampleBuilder() { Description = "Description", ExternalValue = new Uri("http://example.org/example"), Summary = "Summary" } }, Headers = { ["header1"] = new ParameterBodyBuilder() { Content = { [new ContentType("application/json")] = new MediaTypeBuilder() { Encoding = { ["header1"] = new PropertyEncodingBuilder() { ContentType = new ContentType("application/json"), Headers = { ["header1"] = "#/components/headers/header1" }, Options = PropertyEncodingOptions.AllowReserved | PropertyEncodingOptions.Explode, Style = ParameterStyle.DeepObject } }, Examples = { ["Main Example"] = "#/components/examples/example1" }, Schema = "#/components/schemas/schema1" } } } }, Links = { ["link1"] = new LinkBuilder() { Description = "Description", OperationIdentifier = "operation1", OperationReference = "http://example.org/#/operation1", Server = new ServerBuilder() { Description = "Description", Url = new Uri("http://example.org"), Variables = { ["variable1"] = new ServerVariableBuilder() { Default = "Value", Description = "Description", Enum = { "Value", "Value1" } } } } } }, Parameters = { ["parameter1"] = new ParameterBuilder() { Content = { [new ContentType("application/json")] = new MediaTypeBuilder() { Schema = "#/components/schemas/schema1" } }, Description = "Description", Examples = { [new ContentType("application/json")] = "#/components/examples/example1" }, Location = ParameterLocation.Header, Name = "parameter1", Options = ParameterOptions.AllowEmptyValue | ParameterOptions.AllowReserved | ParameterOptions.Deprecated | ParameterOptions.Explode | ParameterOptions.Required, Schema = "#/components/schemas/schema1", Style = ParameterStyle.Matrix } }, RequestBodies = { ["requestbody1"] = new RequestBodyBuilder() { Content = { [new ContentType("application/json")] = new MediaTypeBuilder() { Schema = "#/components/schemas/schema1" } }, Description = "Description", Options = RequestBodyOptions.Required } }, Responses = { ["response1"] = new ResponseBuilder() { Content = { [new ContentType("application/json")] = new MediaTypeBuilder() { Schema = "#/components/schemas/schema1" } }, Description = "Description", Headers = { ["header1"] = "#/components/headers/header1" }, Links = { ["link1"] = "#/components/links/link1" } } }, Schemas = { ["schema1"] = new SchemaBuilder() { AdditionalProperties = { ["prop1"] = "#/components/schemas/schema1" }, Description = "Description", ExternalDocumentation = new ExternalDocumentationBuilder() { Description = "Description", Url = new Uri("http://example.org/docs") }, Format = "Format", Items = "#/components/schemas/schema1", ItemsRange = new CountRange(100, 200, RangeOptions.Inclusive), LengthRange = new CountRange(200, 300, RangeOptions.Exclusive), NumberRange = new NumberRange(300, 400, RangeOptions.Exclusive), Options = SchemaOptions.Deprecated | SchemaOptions.Nullable | SchemaOptions.Required | SchemaOptions.UniqueItems, Pattern = "[a-z]", Properties = { ["prop1"] = "#/components/schemas/schema1" }, PropertiesRange = new CountRange(100, 200), Title = "Schema1", JsonType = SchemaType.Object } }, SecuritySchemes = { ["sec1"] = new HttpSecuritySchemeBuilder() { BearerFormat = "Bearer", Description = "Description", Scheme = "Schema" }, ["sec2"] = new ApiKeySecuritySchemeBuilder() { Description = "Description", Location = ParameterLocation.Cookie, Name = "Name" }, ["sec3"] = new OpenIdConnectSecuritySchemeBuilder() { Description = "Description", Url = new Uri("http://example.org/openid") }, ["sec4"] = new OAuth2SecuritySchemeBuilder() { AuthorizationCodeFlow = new OAuthFlowBuilder() { AuthorizationUrl = new Uri("http://example.org/auth/auth"), RefreshUrl = new Uri("http://example.org/auth/refresh"), TokenUrl = new Uri("http://example.org/auth/token"), Scopes = { ["user:details"] = "Get the user details" } }, ClientCredentialsFlow = new OAuthFlowBuilder() { AuthorizationUrl = new Uri("http://example.org/cli/auth") }, Description = "Description", ImplicitFlow = new OAuthFlowBuilder() { AuthorizationUrl = new Uri("http://example.org/imp/auth") }, PasswordFlow = new OAuthFlowBuilder() { AuthorizationUrl = new Uri("http://example.org/pwd/auth") } } } }, ExternalDocumentation = new ExternalDocumentationBuilder() { Description = "Description", Url = new Uri("http://example.org/docs") }, Info = new InformationBuilder() { Contact = new ContactBuilder() { Email = new MailAddress("*****@*****.**"), Name = "Jonathan", Url = new Uri("http://example.org/jonathan") }, Description = "Description", License = new LicenseBuilder() { Name = "MIT", Url = new Uri("https://opensource.org/licenses/MIT") }, TermsOfService = new Uri("http://example.org/tos"), Title = "Title", Version = new SemanticVersion(1, 2, 3, "pre1", "build1") }, Version = new SemanticVersion(3, 0, 1), Paths = { ["path1"] = new PathBuilder() { Description = "Description" } }, Security = { "#/components/security/sec1" } }; var actualJson = sut.Serialize(actualGraphBuilder.Build()); #endregion #region JSON var expectedJson = new JsonObject() { ["components"] = new JsonObject() { ["callbacks"] = new JsonObject() { ["callback1"] = new JsonObject() { ["http://foo{$statusCode}"] = new JsonObject() { ["delete"] = new JsonObject() { ["callbacks"] = new JsonObject() { ["callback1"] = new JsonObject() { ["$ref"] = "#/components/callbacks/callback1" } }, ["deprecated"] = true, ["description"] = "Delete operation", ["externalDocs"] = new JsonObject() { ["description"] = "External docs 1", ["url"] = "http://example.org/" }, ["operationId"] = "Operation 1", ["parameters"] = new JsonArray() { "#/components/parameters/parameter1" }, ["requestBody"] = "#/components/requestBodies/requestBody1", ["responses"] = new JsonObject() { ["default"] = new JsonObject() { ["$ref"] = "#/components/responses/response1" } }, ["summary"] = "Delete operation summary" }, ["description"] = "path1", ["get"] = new JsonObject() { ["description"] = "Get" }, ["head"] = new JsonObject() { ["description"] = "Head" }, ["options"] = new JsonObject() { ["description"] = "Options" }, ["parameters"] = new JsonArray() { "#/components/parameters/parameter1" }, ["patch"] = new JsonObject() { ["description"] = "Patch" }, ["post"] = new JsonObject() { ["description"] = "Post" }, ["put"] = new JsonObject() { ["description"] = "Put" }, ["summary"] = "Summary", ["trace"] = new JsonObject() { ["description"] = "Trace" } } } }, ["examples"] = new JsonObject() { ["example1"] = new JsonObject() { ["description"] = "Description", ["externalValue"] = "http://example.org/example", ["summary"] = "Summary" } }, ["headers"] = new JsonObject() { ["header1"] = new JsonObject() { ["content"] = new JsonObject() { ["application/json"] = new JsonObject() { ["encoding"] = new JsonObject() { ["header1"] = new JsonObject() { ["allowReserved"] = true, ["contentType"] = "application/json", ["explode"] = true, ["headers"] = new JsonObject() { ["header1"] = new JsonObject() { ["$ref"] = "#/components/headers/header1" } }, ["style"] = "deepObject" } }, ["examples"] = new JsonObject() { ["Main Example"] = new JsonObject() { ["$ref"] = "#/components/examples/example1" } }, ["schema"] = "#/components/schemas/schema1" } } } }, ["links"] = new JsonObject() { ["link1"] = new JsonObject() { ["description"] = "Description", ["operationId"] = "operation1", ["operationRef"] = "http://example.org/#/operation1", ["server"] = new JsonObject() { ["description"] = "Description", ["url"] = "http://example.org/", ["variables"] = new JsonObject() { ["variable1"] = new JsonObject() { ["default"] = "Value", ["description"] = "Description", ["enum"] = new JsonArray() { "Value", "Value1" } } } } } }, ["parameters"] = new JsonObject() { ["parameter1"] = new JsonObject() { ["allowEmptyValue"] = true, ["allowReserved"] = true, ["content"] = new JsonObject() { ["application/json"] = new JsonObject() { ["schema"] = "#/components/schemas/schema1" } }, ["deprecated"] = true, ["description"] = "Description", ["examples"] = new JsonObject() { ["application/json"] = new JsonObject() { ["$ref"] = "#/components/examples/example1" } }, ["explode"] = true, ["in"] = "header", ["name"] = "parameter1", ["required"] = true, ["schema"] = "#/components/schemas/schema1", ["style"] = "matrix" } }, ["requestBodies"] = new JsonObject() { ["requestbody1"] = new JsonObject() { ["content"] = new JsonObject() { ["application/json"] = new JsonObject() { ["schema"] = "#/components/schemas/schema1" } }, ["description"] = "Description", ["requestBodies"] = true } }, ["responses"] = new JsonObject() { ["response1"] = new JsonObject() { ["content"] = new JsonObject() { ["application/json"] = new JsonObject() { ["schema"] = "#/components/schemas/schema1" } }, ["description"] = "Description", ["headers"] = new JsonObject() { ["header1"] = new JsonObject() { ["$ref"] = "#/components/headers/header1" } }, ["links"] = new JsonObject() { ["link1"] = new JsonObject() { ["$ref"] = "#/components/links/link1" } } } }, ["schemas"] = new JsonObject() { ["schema1"] = new JsonObject() { ["additionalProperties"] = new JsonObject() { ["prop1"] = new JsonObject() { ["$ref"] = "#/components/schemas/schema1" } }, ["deprecated"] = true, ["description"] = "Description", ["exclusiveMaximum"] = true, ["exclusiveMinimum"] = true, ["externalDocs"] = new JsonObject() { ["description"] = "Description", ["url"] = "http://example.org/docs" }, ["format"] = "Format", ["items"] = "#/components/schemas/schema1", ["maxLength"] = 300, ["maxProperties"] = 200, ["maximum"] = 400, ["minLength"] = 200, ["minProperties"] = 100, ["minimum"] = 300, ["nullable"] = true, ["pattern"] = "[a-z]", ["properties"] = new JsonObject() { ["prop1"] = new JsonObject() { ["$ref"] = "#/components/schemas/schema1" } }, ["required"] = true, ["title"] = "Schema1", ["type"] = "object", ["uniqueItems"] = true } }, ["securitySchemes"] = new JsonObject() { ["sec1"] = new JsonObject() { ["bearerFormat"] = "Bearer", ["description"] = "Description", ["scheme"] = "Schema", ["type"] = "http" }, ["sec2"] = new JsonObject() { ["description"] = "Description", ["in"] = "cookie", ["name"] = "Name", ["type"] = "apiKey" }, ["sec3"] = new JsonObject() { ["description"] = "Description", ["openIdConnectUrl"] = "http://example.org/openid", ["type"] = "openIdConnect" }, ["sec4"] = new JsonObject() { ["description"] = "Description", ["flows"] = new JsonObject() { ["authorizationCode"] = new JsonObject() { ["authorizationUrl"] = "http://example.org/auth/auth", ["refreshUrl"] = "http://example.org/auth/refresh", ["scopes"] = new JsonObject() { ["user:details"] = "Get the user details" }, ["tokenUrl"] = "http://example.org/auth/token" }, ["clientCredentials"] = new JsonObject() { ["authorizationUrl"] = "http://example.org/cli/auth", ["tokenUrl"] = null }, ["implicit"] = new JsonObject() { ["authorizationUrl"] = "http://example.org/imp/auth", ["tokenUrl"] = null }, ["password"] = new JsonObject() { ["authorizationUrl"] = "http://example.org/pwd/auth", ["tokenUrl"] = null } }, ["type"] = "oauth2" } } }, ["externalDocs"] = new JsonObject() { ["description"] = "Description", ["url"] = "http://example.org/docs" }, ["info"] = new JsonObject() { ["contact"] = new JsonObject() { ["email"] = "*****@*****.**", ["name"] = "Jonathan", ["url"] = "http://example.org/jonathan" }, ["description"] = "Description", ["license"] = new JsonObject() { ["name"] = "MIT", ["url"] = "https://opensource.org/licenses/MIT" }, ["termsOfService"] = "http://example.org/tos", ["title"] = "Title", ["version"] = "1.2.3-pre1+build1" }, ["openapi"] = "3.0.1", ["paths"] = new JsonObject() { ["path1"] = new JsonObject() { ["description"] = "Description" } }, ["security"] = new JsonArray() { new JsonObject() { ["$ref"] = "#/components/security/sec1" } } }; #endregion Assert.Equal(expectedJson.ToString(), actualJson.ToString()); }