public void InitializeOAuth2AuthCodeWorksWithCsdl()
        {
            // Arrange
            string annotation = @"<Annotation Term=""NS.MyOAuth2AuthCode"">
                <Record >
                  <PropertyValue Property=""TokenUrl"" String=""http://tokenUrl"" />
                  <PropertyValue Property=""AuthorizationUrl"" String=""http://authorizationUrl"" />
                </Record>
              </Annotation>";

            IEdmModel model = GetEdmModel(annotation);

            Assert.NotNull(model); // guard
            Assert.NotNull(model.EntityContainer);

            // Act
            OAuth2AuthCode authoCode = model.GetRecord <OAuth2AuthCode>(model.EntityContainer, "NS.MyOAuth2AuthCode");

            // Assert
            Assert.Null(authoCode.Name);
            Assert.Null(authoCode.Description);
            Assert.Null(authoCode.Scopes);
            Assert.Equal("http://tokenUrl", authoCode.TokenUrl);
            Assert.Equal("http://authorizationUrl", authoCode.AuthorizationUrl);
        }
        public void InitializeOAuth2AuthCodeWithRecordSuccess()
        {
            // Arrange
            IEdmRecordExpression record = new EdmRecordExpression(
                new EdmPropertyConstructor("TokenUrl", new EdmStringConstant("http://tokenUrl")),
                new EdmPropertyConstructor("AuthorizationUrl", new EdmStringConstant("http://authorizationUrl")));

            OAuth2AuthCode authCode = new OAuth2AuthCode();

            Assert.Null(authCode.Name);
            Assert.Null(authCode.Description);
            Assert.Null(authCode.Scopes);
            Assert.Null(authCode.AuthorizationUrl);
            Assert.Null(authCode.TokenUrl);

            // Act
            authCode.Initialize(record);

            // Assert
            Assert.Null(authCode.Name);
            Assert.Null(authCode.Description);
            Assert.Null(authCode.Scopes);
            Assert.Equal("http://authorizationUrl", authCode.AuthorizationUrl);
            Assert.Equal("http://tokenUrl", authCode.TokenUrl);
        }
        public void SchemeTypeKindAndOAuthTypeSetCorrectly()
        {
            // Arrange
            OAuth2AuthCode authCode = new OAuth2AuthCode();

            // Act & Assert
            Assert.Equal(SecuritySchemeType.OAuth2, authCode.SchemeType);
            Assert.Equal(OAuth2Type.AuthCode, authCode.OAuth2Type);
        }
        private static void AppendOAuth2(OpenApiSecurityScheme scheme, OAuthAuthorization oAuth2)
        {
            Debug.Assert(scheme != null);
            Debug.Assert(oAuth2 != null);

            scheme.Flows = new OpenApiOAuthFlows();
            OpenApiOAuthFlow flow = null;

            switch (oAuth2.OAuth2Type)
            {
            case OAuth2Type.AuthCode:     // AuthCode
                OAuth2AuthCode authCode = (OAuth2AuthCode)oAuth2;
                flow = new OpenApiOAuthFlow
                {
                    AuthorizationUrl = new Uri(authCode.AuthorizationUrl),
                    TokenUrl         = new Uri(authCode.TokenUrl)
                };
                scheme.Flows.AuthorizationCode = flow;
                break;

            case OAuth2Type.Pasword:     // Password
                OAuth2Password password = (OAuth2Password)oAuth2;
                flow = new OpenApiOAuthFlow
                {
                    TokenUrl = new Uri(password.TokenUrl)
                };
                scheme.Flows.Password = flow;
                break;

            case OAuth2Type.Implicit:     // Implicit
                OAuth2Implicit @implicit = (OAuth2Implicit)oAuth2;
                flow = new OpenApiOAuthFlow
                {
                    AuthorizationUrl = new Uri(@implicit.AuthorizationUrl)
                };
                scheme.Flows.Implicit = flow;
                break;

            case OAuth2Type.ClientCredentials:     // ClientCredentials
                OAuth2ClientCredentials credentials = (OAuth2ClientCredentials)oAuth2;
                flow = new OpenApiOAuthFlow
                {
                    TokenUrl = new Uri(credentials.TokenUrl)
                };
                scheme.Flows.ClientCredentials = flow;
                break;
            }

            Debug.Assert(flow != null);
            flow.RefreshUrl = new Uri(oAuth2.RefreshUrl);

            if (oAuth2.Scopes != null)
            {
                flow.Scopes = oAuth2.Scopes.ToDictionary(s => s.Scope, s => s.Description);
            }
        }