public void GetPathsWithContainedNavigationPropertytWorks()
        {
            // Arrange
            string entityType =
                @"<EntityType Name=""Order"">
    <Key>
      <PropertyRef Name=""id"" />
    </Key>
    <NavigationProperty Name=""MultipleCustomers"" Type=""Collection(NS.Customer)"" ContainsTarget=""true"" />
    <NavigationProperty Name=""SingleCustomer"" Type=""NS.Customer"" ContainsTarget=""true"" />
  </EntityType>";

            string            entitySet = @"<EntitySet Name=""Orders"" EntityType=""NS.Order"" />";
            IEdmModel         model     = GetEdmModel(entityType, entitySet);
            ODataPathProvider provider  = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(7, paths.Count());

            var pathItems = paths.Select(p => p.GetPathItemName()).ToList();

            Assert.Contains("/Orders({id})/MultipleCustomers", pathItems);
            Assert.Contains("/Orders({id})/MultipleCustomers({ID})", pathItems);
            Assert.Contains("/Orders({id})/SingleCustomer", pathItems);
        }
        public void GetPathsWithStreamPropertyAndWithEntityHasStreamWorks(bool hasStream, string streamPropName)
        {
            // Arrange
            IEdmModel         model    = GetEdmModel(hasStream, streamPropName);
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);

            if (hasStream && !streamPropName.Equals("Content", StringComparison.OrdinalIgnoreCase))
            {
                Assert.Equal(7, paths.Count());
                Assert.Equal(new[] { "/me", "/me/photo", "/me/photo/$value", "/Todos", "/Todos({Id})", "/Todos({Id})/$value", "/Todos({Id})/Logo" },
                             paths.Select(p => p.GetPathItemName()));
            }
            else if ((hasStream && streamPropName.Equals("Content", StringComparison.OrdinalIgnoreCase)) ||
                     (!hasStream && streamPropName.Equals("Content", StringComparison.OrdinalIgnoreCase)))
            {
                Assert.Equal(6, paths.Count());
                Assert.Equal(new[] { "/me", "/me/photo", "/me/photo/$value", "/Todos", "/Todos({Id})", "/Todos({Id})/Content" },
                             paths.Select(p => p.GetPathItemName()));
            }
            else // !hasStream && !streamPropName.Equals("Content")
            {
                Assert.Equal(6, paths.Count());
                Assert.Equal(new[] { "/me", "/me/photo", "/me/photo/$value", "/Todos", "/Todos({Id})", "/Todos({Id})/Logo" },
                             paths.Select(p => p.GetPathItemName()));
            }
        }
        public void GetPathsWithUnboundOperationImportWorks()
        {
            // Arrange
            string boundAction =
                @"<Function Name=""GetNearestCustomers"">
   <ReturnType Type=""NS.Customer"" />
  </Function >
  <Action Name=""ResetDataSource"" />";

            string    unbounds = @"
<FunctionImport Name=""GetNearestCustomers"" Function=""NS.GetNearestCustomers"" EntitySet=""Customers"" />
<ActionImport Name =""ResetDataSource"" Action =""NS.ResetDataSource"" />";
            IEdmModel model    = GetEdmModel(boundAction, unbounds);

            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(4, paths.Count());
            Assert.Contains("/GetNearestCustomers()", paths.Select(p => p.GetPathItemName()));
            Assert.Contains("/ResetDataSource", paths.Select(p => p.GetPathItemName()));
        }
        public void GetPathsWithBoundFunctionOperationForContainmentNavigationPropertyPathsWorks(bool containsTarget)
        {
            // Arrange
            string navProp     = $@"<NavigationProperty Name=""Referral"" Type=""NS.NiceCustomer"" ContainsTarget=""{containsTarget}""/>";
            string boundAction =
                @"<Function Name=""Search"" IsBound=""true"">
   <Parameter Name=""bindingParameter"" Type=""NS.NiceCustomer"" />
     <ReturnType Type=""Collection(NS.Customer)"" />
</Function>
<EntityType Name=""NiceCustomer"">
    <Property Name=""Other"" Type=""Edm.Int32"" Nullable=""true"" />
</EntityType>";

            IEdmModel         model    = GetEdmModel(boundAction, "", navProp);
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);

            if (containsTarget)
            {
                Assert.Equal(5, paths.Count());
                Assert.Contains("/Customers({ID})/Referral/NS.Search()", paths.Select(p => p.GetPathItemName()));
            }
            else
            {
                Assert.Equal(4, paths.Count());
                Assert.DoesNotContain("/Customers({ID})/Referral/NS.Search()", paths.Select(p => p.GetPathItemName()));
            }
        }
        public void GetPathsForGraphBetaModelReturnsAllPaths()
        {
            // Arrange
            IEdmModel         model    = EdmModelHelper.GraphBetaModel;
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(4481, paths.Count());
        }
        public void GetPathsForEmptyEdmModelReturnsEmptyPaths()
        {
            // Arrange
            IEdmModel         model    = new EdmModel();
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model);

            // Assert
            Assert.NotNull(paths);
            Assert.Empty(paths);
        }
        public void GetPathsWithSingletonWorks()
        {
            // Arrange
            IEdmModel         model    = GetEdmModel("", @"<Singleton Name=""Me"" Type=""NS.Customer"" />");
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(3, paths.Count());
            Assert.Contains("/Me", paths.Select(p => p.GetPathItemName()));
        }
        public void GetPathsForSingleEntitySetWorks()
        {
            // Arrange
            IEdmModel         model    = GetEdmModel("", "");
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(2, paths.Count());
            Assert.Equal(new[] { "/Customers", "/Customers({ID})" }, paths.Select(p => p.GetPathItemName()));
        }
        public void GetPathsForGraphBetaModelReturnsAllPaths()
        {
            // Arrange
            IEdmModel         model    = EdmModelHelper.GraphBetaModel;
            var               settings = new OpenApiConvertSettings();
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(4887, paths.Count());
        }
        public void GetPathsForInheritanceModelWithoutDerivedTypesConstraintReturnsMore()
        {
            // Arrange
            IEdmModel         model    = GetInheritanceModel(string.Empty);
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(3, paths.Count());
        }
        public void GetPathsForGraphBetaModelReturnsAllPaths()
        {
            // Arrange
            IEdmModel model    = EdmModelHelper.GraphBetaModel;
            var       settings = new OpenApiConvertSettings()
            {
                ExpandDerivedTypesNavigationProperties = false
            };
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(13836, paths.Count());
        }
        public void GetPathsDoesntReturnPathsForCountWhenDisabled()
        {
            // Arrange
            IEdmModel         model    = GetInheritanceModel(string.Empty);
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings {
                EnableDollarCountPath = false,
                AppendBoundOperationsOnDerivedTypeCastSegments = true
            };

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(3, paths.Count());
        }
        public void GetPathsForInheritanceModelWithDerivedTypesConstraintNoAnnotationReturnsFewer()
        {
            // Arrange
            IEdmModel         model    = GetInheritanceModel(string.Empty);
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings
            {
                RequireDerivedTypesConstraintForBoundOperations = true
            };

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(2, paths.Count());
        }
        public void GetPathsForGraphBetaModelWithDerivedTypesConstraintReturnsAllPaths()
        {
            // Arrange
            IEdmModel         model    = EdmModelHelper.GraphBetaModel;
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings
            {
                RequireDerivedTypesConstraintForBoundOperations = true
            };

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(4544, paths.Count());
        }
        public void GetPathsWithReferenceableNavigationPropertyWorks()
        {
            // Arrange
            string entityType =
                @"<EntityType Name=""Order"">
    <Key>
      <PropertyRef Name=""id"" />
    </Key>
    <NavigationProperty Name=""MultipleCustomers"" Type=""Collection(NS.Customer)"">
        <Annotation Term=""Org.OData.Capabilities.V1.NavigationRestrictions"">
          <Record>
            <PropertyValue Property=""Referenceable"" Bool=""true"" />
          </Record>
        </Annotation>
     </NavigationProperty>
    <NavigationProperty Name=""SingleCustomer"" Type=""NS.Customer"">
        <Annotation Term=""Org.OData.Capabilities.V1.NavigationRestrictions"">
          <Record>
            <PropertyValue Property=""Referenceable"" Bool=""true"" />
          </Record> 
        </Annotation>
     </NavigationProperty>
  </EntityType>";

            string    entitySet = @"<EntitySet Name=""Orders"" EntityType=""NS.Order"" />";
            IEdmModel model     = GetEdmModel(entityType, entitySet);

            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(12, paths.Count());

            var pathItems = paths.Select(p => p.GetPathItemName()).ToList();

            Assert.Contains("/Orders({id})/MultipleCustomers", pathItems);
            Assert.Contains("/Orders({id})/SingleCustomer", pathItems);
            Assert.Contains("/Orders({id})/SingleCustomer/$ref", pathItems);
            Assert.Contains("/Orders({id})/MultipleCustomers/$ref", pathItems);
            Assert.Contains("/Orders({id})/MultipleCustomers({ID})/$ref", pathItems);
        }
        public void GetPathsWithStreamPropertyAndWithEntityHasStreamWorks(bool hasStream, string streamPropName)
        {
            // Arrange
            IEdmModel         model       = GetEdmModel(hasStream, streamPropName);
            ODataPathProvider provider    = new ODataPathProvider();
            var          settings         = new OpenApiConvertSettings();
            const string TodosContentPath = "/todos({id})/content";
            const string TodosValuePath   = "/todos({id})/$value";
            const string TodosLogoPath    = "/todos({id})/logo";

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Contains("/catalog/content", paths.Select(p => p.GetPathItemName()));
            Assert.Contains("/catalog/thumbnailPhoto", paths.Select(p => p.GetPathItemName()));
            Assert.Contains("/me/photo/$value", paths.Select(p => p.GetPathItemName()));

            if (streamPropName.Equals("logo"))
            {
                if (hasStream)
                {
                    Assert.Equal(14, paths.Count());
                    Assert.Contains(TodosValuePath, paths.Select(p => p.GetPathItemName()));
                    Assert.Contains(TodosLogoPath, paths.Select(p => p.GetPathItemName()));
                    Assert.DoesNotContain(TodosContentPath, paths.Select(p => p.GetPathItemName()));
                }
                else
                {
                    Assert.Equal(13, paths.Count());
                    Assert.Contains(TodosLogoPath, paths.Select(p => p.GetPathItemName()));
                    Assert.DoesNotContain(TodosContentPath, paths.Select(p => p.GetPathItemName()));
                    Assert.DoesNotContain(TodosValuePath, paths.Select(p => p.GetPathItemName()));
                }
            }
            else if (streamPropName.Equals("content"))
            {
                Assert.Equal(13, paths.Count());
                Assert.Contains(TodosContentPath, paths.Select(p => p.GetPathItemName()));
                Assert.DoesNotContain(TodosLogoPath, paths.Select(p => p.GetPathItemName()));
                Assert.DoesNotContain(TodosValuePath, paths.Select(p => p.GetPathItemName()));
            }
        }
        public void GetPathsWithBoundFunctionOperationWorks()
        {
            // Arrange
            string boundFunction =
                @"<Function Name=""delta"" IsBound=""true"">
   <Parameter Name=""bindingParameter"" Type=""Collection(NS.Customer)"" />
     <ReturnType Type=""Collection(NS.Customer)"" />
</Function>";
            IEdmModel         model    = GetEdmModel(boundFunction, "");
            ODataPathProvider provider = new ODataPathProvider();

            // Act
            var paths = provider.GetPaths(model);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(3, paths.Count());
            Assert.Contains("/Customers/NS.delta()", paths.Select(p => p.GetPathItemName()));
        }
        public void GetPathsForGraphBetaModelWithDerivedTypesConstraintReturnsAllPaths()
        {
            // Arrange
            IEdmModel         model    = EdmModelHelper.GraphBetaModel;
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings
            {
                RequireDerivedTypesConstraintForBoundOperations = true,
                ExpandDerivedTypesNavigationProperties          = false,
                AppendBoundOperationsOnDerivedTypeCastSegments  = true
            };

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(15293, paths.Count());
        }
        public void GetPathsWithBoundActionOperationWorks()
        {
            // Arrange
            string boundAction =
                @"<Action Name=""renew"" IsBound=""true"">
   <Parameter Name=""bindingParameter"" Type=""NS.Customer"" />
     <ReturnType Type=""Edm.Boolean"" />
</Action>";
            IEdmModel         model    = GetEdmModel(boundAction, "");
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings();

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.NotNull(paths);
            Assert.Equal(3, paths.Count());
            Assert.Contains("/Customers({ID})/NS.renew", paths.Select(p => p.GetPathItemName()));
        }
        public void GetPathsForInheritanceModelWithDerivedTypesConstraintWithAnnotationReturnsMore()
        {
            // Arrange
            IEdmModel         model    = GetInheritanceModel(@"
<Annotation Term=""Org.OData.Validation.V1.DerivedTypeConstraint"">
<Collection>
  <String>NS.Customer</String>
  <String>NS.NiceCustomer</String>
</Collection>
</Annotation>");
            ODataPathProvider provider = new ODataPathProvider();
            var settings = new OpenApiConvertSettings
            {
                RequireDerivedTypesConstraintForBoundOperations = true
            };

            // Act
            var paths = provider.GetPaths(model, settings);

            // Assert
            Assert.Equal(3, paths.Count());
        }