Example #1
0
        public async Task ReferentialConstraintModelBuilderTest(string modelMode)
        {
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, modelMode);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);

            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var customer = edmModel.SchemaElements.OfType<IEdmEntityType>()
                .Single(et => et.Name == "ForeignKeyCustomer");
            Assert.Equal(3, customer.Properties().Count());

            var order = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "ForeignKeyOrder");
            Assert.Equal(4, order.Properties().Count());

            var customerIdProperty = order.DeclaredProperties.Single(p => p.Name == "CustomerId");

            var navProperty = order.DeclaredNavigationProperties().Single(p => p.Name == "Customer");
            Assert.Equal(EdmOnDeleteAction.Cascade, navProperty.OnDelete);
            Assert.Equal(1, navProperty.DependentProperties.Count());
            var dependentProperty = navProperty.DependentProperties.Single();

            Assert.Same(customerIdProperty, dependentProperty);
        }
Example #2
0
        public async Task ModelBuilderTest(string modelMode)
        {
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, modelMode);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var fileType = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "File");
            Assert.Equal(5, fileType.Properties().Count());

            var createdDateProperty = fileType.DeclaredProperties.Single(p => p.Name == "CreatedDate");
            Assert.Equal(EdmTypeKind.Primitive, createdDateProperty.Type.TypeKind());
            Assert.Equal("Edm.DateTimeOffset", createdDateProperty.Type.Definition.FullTypeName());
            Assert.False(createdDateProperty.Type.IsNullable);

            var deleteDateProperty = fileType.DeclaredProperties.Single(p => p.Name == "DeleteDate");
            Assert.Equal(EdmTypeKind.Primitive, deleteDateProperty.Type.TypeKind());
            Assert.Equal("Edm.DateTimeOffset", deleteDateProperty.Type.Definition.FullTypeName());
            Assert.True(deleteDateProperty.Type.IsNullable);

            var modifiedDates = fileType.DeclaredProperties.Single(p => p.Name == "ModifiedDates");
            Assert.Equal(EdmTypeKind.Collection, modifiedDates.Type.TypeKind());
            Assert.Equal("Collection(Edm.DateTimeOffset)", modifiedDates.Type.Definition.FullTypeName());
            Assert.False(modifiedDates.Type.IsNullable);
        }
        public async Task ModelBuilderTest()
        {
            string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            var stream = await response.Content.ReadAsStreamAsync();

            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);

            var employeeType = edmModel.SchemaElements.Single(e => e.Name == "Employee") as IEdmEntityType;
            employeeType.Properties().All(p => this.IsCamelCase(p.Name));

            var managerType = edmModel.SchemaElements.Single(e => e.Name == "Manager") as IEdmEntityType;
            Assert.Equal(7, managerType.Properties().Count());
            managerType.Properties().All(p => this.IsCamelCase(p.Name));

            var addressType = edmModel.SchemaElements.Single(e => e.Name == "Address") as IEdmComplexType;
            addressType.Properties().All(p => this.IsCamelCase(p.Name));
        }
Example #4
0
        public async Task VerifyMetaDataIsGeneratedCorrectly()
        {
            var response = await Client.GetAsync(BaseAddress + "/$metadata");

            var stream = await response.Content.ReadAsStreamAsync();

            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader   = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            Assert.Equal(4, edmModel.GetEdmVersion().Major);

            var container = edmModel.EntityContainer;

            Assert.Equal("Container", container.Name);
            Assert.Equal(3, container.Elements.Count());

            var address = edmModel.SchemaElements.OfType <IEdmComplexType>().First();

            Assert.Equal("Address", address.Name);
            Assert.Equal(5, address.Properties().Count());

            var product = edmModel.SchemaElements.Where(e => e.Name == "Product").First() as IEdmEntityType;

            Assert.Equal(1, product.Key().Count());
            Assert.Equal("ID", product.Key().First().Name);
            Assert.Equal(5, product.Properties().Count());

            var supplier = edmModel.SchemaElements.Where(e => e.Name == "Supplier").First() as IEdmEntityType;

            Assert.Equal(1, supplier.Key().Count());
            Assert.Equal("ID", supplier.Key().First().Name);
            Assert.Equal(6, supplier.Properties().Count());

            var addressesProperty = supplier.Properties().First(p => p.Name == "Addresses").Type.AsCollection();

            Assert.Equal(typeof(Address).FullName, addressesProperty.CollectionDefinition().ElementType.FullName());

            // [ODATA-CSDL]
            // In 6.2.1
            // a) If not value is specified for a property whose Type attribute does not specify a collection,
            //    the Nuallable attribute defaults to true
            // b) A property whose Type attribute specifies a collection MUST NOT specify a value for the
            //    Nullable attribute as the collection always exists, it may just be empty.
            Assert.Equal(true, addressesProperty.IsNullable);

            var tagsProperty = supplier.Properties().First(p => p.Name == "Tags").Type.AsCollection();

            Assert.Equal("Edm.String", tagsProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(true, tagsProperty.IsNullable);
        }
Example #5
0
        public void VerifyMetaDataIsGeneratedCorrectly()
        {
            var response = this.Client.GetAsync(this.BaseAddress + "/$metadata").Result;
            var stream   = response.Content.ReadAsStreamAsync().Result;
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader   = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            Assert.Equal(3, edmModel.GetEdmVersion().Major);

            Assert.Equal(3, edmModel.GetMaxDataServiceVersion().Major);

            Assert.Equal(1, edmModel.EntityContainers().Count());

            var container = edmModel.EntityContainers().First();

            Assert.Equal("Container", container.Name);
            Assert.Equal(3, container.Elements.Count());

            var address = edmModel.SchemaElements.OfType <IEdmComplexType>().First();

            Assert.Equal("Address", address.Name);
            Assert.Equal(5, address.Properties().Count());

            var product = edmModel.SchemaElements.Where(e => e.Name == "Product").First() as IEdmEntityType;

            Assert.Equal(1, product.Key().Count());
            Assert.Equal("ID", product.Key().First().Name);
            Assert.Equal(5, product.Properties().Count());

            var supplier = edmModel.SchemaElements.Where(e => e.Name == "Supplier").First() as IEdmEntityType;

            Assert.Equal(1, supplier.Key().Count());
            Assert.Equal("ID", supplier.Key().First().Name);
            Assert.Equal(6, supplier.Properties().Count());

            var addressesProperty = supplier.Properties().First(p => p.Name == "Addresses").Type.AsCollection();

            Assert.Equal(typeof(Address).FullName, addressesProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(false, addressesProperty.IsNullable);

            var tagsProperty = supplier.Properties().First(p => p.Name == "Tags").Type.AsCollection();

            Assert.Equal("Edm.String", tagsProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(false, tagsProperty.IsNullable);
        }
        public void ModelBuilderTest()
        {
            const string expectMetadata =
                "        <EntitySet Name=\"ETagUntypedCustomers\" EntityType=\"NS.Customer\">\r\n" +
                "          <Annotation Term=\"Org.OData.Core.V1.OptimisticConcurrency\">\r\n" +
                "            <Collection>\r\n" +
                "              <PropertyPath>Name</PropertyPath>\r\n" +
                "            </Collection>\r\n" +
                "          </Annotation>\r\n" +
                "        </EntitySet>";

            string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress);

            HttpResponseMessage response = this.Client.GetAsync(requestUri).Result;

            var content = response.Content.ReadAsStringAsync().Result;
            Assert.Contains(expectMetadata, content);

            var stream = response.Content.ReadAsStreamAsync().Result;
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();
            Assert.NotNull(edmModel);

            var etagCustomers = edmModel.FindDeclaredEntitySet("ETagUntypedCustomers");
            Assert.NotNull(etagCustomers);

            var annotations = edmModel.FindDeclaredVocabularyAnnotations(etagCustomers);
            IEdmVocabularyAnnotation annotation = Assert.Single(annotations);
            Assert.NotNull(annotation);

            Assert.Same(CoreVocabularyModel.ConcurrencyTerm, annotation.Term);
            Assert.Same(etagCustomers, annotation.Target);

            IEdmValueAnnotation valueAnnotation = annotation as IEdmValueAnnotation;
            Assert.NotNull(valueAnnotation);
            Assert.NotNull(valueAnnotation.Value);

            IEdmCollectionExpression collection = valueAnnotation.Value as IEdmCollectionExpression;
            Assert.NotNull(collection);
            Assert.Equal(new[] { "Name" }, collection.Elements.Select(e => ((IEdmPathExpression) e).Path.Single()));
        }
Example #7
0
        public async Task SpatialModelMetadataTest()
        {
            string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);

            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var customer = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "SpatialCustomer");
            Assert.Equal(5, customer.Properties().Count());

            var locationProperty = customer.DeclaredProperties.Single(p => p.Name == "Location");
            Assert.Equal("Edm.GeographyPoint", locationProperty.Type.FullName());

            var regionProperty = customer.DeclaredProperties.Single(p => p.Name == "Region");
            Assert.Equal("Edm.GeographyLineString", regionProperty.Type.FullName());

            var homePointProperty = customer.DeclaredProperties.Single(p => p.Name == "HomePoint");
            Assert.Equal("Edm.GeometryPoint", homePointProperty.Type.FullName());
        }
        public async Task ModelBuilderTest(string modelMode)
        {
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, modelMode);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var customerType = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "DCustomer");
            Assert.Equal(17, customerType.Properties().Count());

            // Non-Nullable
            AssertHasProperty(customerType, propertyName: "DateTime", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.DateTimeOffset", isNullable: false);
            AssertHasProperty(customerType, propertyName: "Offset", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.DateTimeOffset", isNullable: false);
            AssertHasProperty(customerType, propertyName: "Date", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.Date", isNullable: false);
            AssertHasProperty(customerType, propertyName: "TimeOfDay", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.TimeOfDay", isNullable: false);

            // Nullable
            AssertHasProperty(customerType, propertyName: "NullableDateTime", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.DateTimeOffset", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableOffset", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.DateTimeOffset", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableDate", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.Date", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableTimeOfDay", expectKind: EdmTypeKind.Primitive, expectTypeName: "Edm.TimeOfDay", isNullable: true);

            // Collection
            AssertHasProperty(customerType, propertyName: "DateTimes", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.DateTimeOffset)", isNullable: false);
            AssertHasProperty(customerType, propertyName: "Offsets", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.DateTimeOffset)", isNullable: false);
            AssertHasProperty(customerType, propertyName: "Dates", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.Date)", isNullable: false);
            AssertHasProperty(customerType, propertyName: "TimeOfDays", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.TimeOfDay)", isNullable: false);

            // nullable collection
            AssertHasProperty(customerType, propertyName: "NullableDateTimes", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.DateTimeOffset)", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableOffsets", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.DateTimeOffset)", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableDates", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.Date)", isNullable: true);
            AssertHasProperty(customerType, propertyName: "NullableTimeOfDays", expectKind: EdmTypeKind.Collection, expectTypeName: "Collection(Edm.TimeOfDay)", isNullable: true);
        }
        public async Task VerifyMetaDataIsGeneratedCorrectly()
        {
            var response = await Client.GetAsync(this.BaseAddress + "/$metadata");
            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            Assert.Equal(4, edmModel.GetEdmVersion().Major);

            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);
            Assert.Equal(3, container.Elements.Count());

            var address = edmModel.SchemaElements.OfType<IEdmComplexType>().First();
            Assert.Equal("Address", address.Name);
            Assert.Equal(5, address.Properties().Count());

            var product = edmModel.SchemaElements.Where(e => e.Name == "Product").First() as IEdmEntityType;
            Assert.Equal(1, product.Key().Count());
            Assert.Equal("ID", product.Key().First().Name);
            Assert.Equal(5, product.Properties().Count());

            var supplier = edmModel.SchemaElements.Where(e => e.Name == "Supplier").First() as IEdmEntityType;
            Assert.Equal(1, supplier.Key().Count());
            Assert.Equal("ID", supplier.Key().First().Name);
            Assert.Equal(6, supplier.Properties().Count());

            var addressesProperty = supplier.Properties().First(p => p.Name == "Addresses").Type.AsCollection();
            Assert.Equal(typeof(Address).FullName, addressesProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(false, addressesProperty.IsNullable);

            var tagsProperty = supplier.Properties().First(p => p.Name == "Tags").Type.AsCollection();
            Assert.Equal("Edm.String", tagsProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(true, tagsProperty.IsNullable);
        }
        public async Task ServiceDocumentTest(string format)
        {
            // Act
            var requestUri = string.Format("{0}/odata?$format={1}", BaseAddress, format);
            var response = await Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();

            //Assert
            var oDataMessageReaderSettings = new ODataMessageReaderSettings();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message, oDataMessageReaderSettings, UnboundFunctionEdmModel.GetEdmModel());
            var oDataWorkSpace = reader.ReadServiceDocument();

            var function1 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetAllConventionCustomers");
            Assert.Equal(1, function1.Count());
            var function2 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetConventionOrderByCustomerIdAndOrderName");
            // ODL spec says:
            // The edm:FunctionImport for a parameterless function MAY include the IncludeInServiceDocument attribute
            // whose Boolean value indicates whether the function import is advertised in the service document.
            // So the below 2 FunctionImports are not displayed in ServiceDocument.
            Assert.Equal(0, function2.Count());
            var function3 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetConventionCustomerById");
            Assert.Equal(0, function3.Count());
        }
        public async Task MetaDataTest()
        {
            // Act
            var requestUri = string.Format("{0}/odata/$metadata", BaseAddress);
            var response = await Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();

            // Assert
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            #region functions
            // Function GetAllConventionCustomers
            var typeOfConventionCustomer = typeof(ConventionCustomer);
            var function1 = edmModel.FindDeclaredOperations(typeOfConventionCustomer.Namespace + ".GetAllConventionCustomers").FirstOrDefault();
            Assert.Equal(string.Format("Collection({0})", typeOfConventionCustomer.FullName), function1.ReturnType.Definition.FullTypeName());
            Assert.Equal(0, function1.Parameters.Count());

            // Function GetConventionCustomerById
            var function2 = edmModel.FindDeclaredOperations(typeof(ConventionCustomer).Namespace + ".GetConventionCustomerById").FirstOrDefault();
            Assert.Equal(typeOfConventionCustomer.FullName, function2.ReturnType.Definition.FullTypeName());
            Assert.Equal(1, function2.Parameters.Count());

            // Function GetConventionOrderByCustomerIdAndOrderName
            var typeOfConventionOrder = typeof(ConventionOrder);
            var function3 = edmModel.FindDeclaredOperations(typeOfConventionOrder.Namespace + ".GetConventionOrderByCustomerIdAndOrderName").FirstOrDefault();
            Assert.Equal(typeOfConventionOrder.FullName, function3.ReturnType.Definition.FullTypeName());
            Assert.Equal(2, function3.Parameters.Count());
            #endregion

            #region function imports

            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);

            var functionImport1 = container.FindOperationImports("GetAllConventionCustomers");
            Assert.Equal(2, functionImport1.Count());

            var functionImport2 = container.FindOperationImports("GetConventionCustomerById");
            Assert.Equal(1, functionImport2.Count());

            var functionImport3 = container.FindOperationImports("GetConventionOrderByCustomerIdAndOrderName");
            Assert.Equal(1, functionImport3.Count());

            #endregion

            #region actions

            var action1 = edmModel.FindDeclaredOperations(typeOfConventionCustomer.Namespace + ".ResetDataSource").FirstOrDefault();
            Assert.Null(action1.ReturnType);
            Assert.Equal(0, function1.Parameters.Count());

            var action2 = edmModel.FindDeclaredOperations(typeOfConventionCustomer.Namespace + ".UpdateAddress").FirstOrDefault();
            Assert.Equal(string.Format("Collection({0})", typeOfConventionCustomer.FullName), action2.ReturnType.Definition.FullTypeName());
            Assert.Equal(2, action2.Parameters.Count());

            #endregion

            #region action imports

            var actionImport1 = container.FindOperationImports("ResetDataSource");
            Assert.Equal(1, actionImport1.Count());

            var actionImport2 = container.FindOperationImports("UpdateAddress");
            Assert.Equal(1, actionImport2.Count());

            #endregion
        }
Example #12
0
        public async Task ModelBuilderTest(string modelMode)
        {
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, modelMode);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();

            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var accountType = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "Account");
            Assert.Equal(4, accountType.Properties().Count());
            var payinPIs = accountType.NavigationProperties().Single(np => np.Name == "PayinPIs");
            Assert.True(payinPIs.ContainsTarget, "The navigation property 'PayinPIs' should be a containment navigation property.");
            Assert.Equal(string.Format("Collection({0})", typeof(PaymentInstrument).FullName), payinPIs.Type.Definition.FullTypeName());
            var payoutPI = accountType.DeclaredNavigationProperties().Single(np => np.Name == "PayoutPI");
            Assert.True(payoutPI.ContainsTarget, "PreminumAccountType.GiftCard");
            Assert.Equal(EdmMultiplicity.ZeroOrOne, payoutPI.TargetMultiplicity());

            var paymentInstrumentType = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "PaymentInstrument");
            Assert.Equal(3, paymentInstrumentType.Properties().Count());
            var statement = paymentInstrumentType.NavigationProperties().Single(np => np.Name == "Statement");
            Assert.True(statement.ContainsTarget, "PaymentInstrumentType.ContainsTarget");
            Assert.Equal(EdmMultiplicity.ZeroOrOne, statement.TargetMultiplicity());

            var premiumAccountType = edmModel.SchemaElements.OfType<IEdmEntityType>().Single(et => et.Name == "PremiumAccount");
            Assert.Equal(1, premiumAccountType.DeclaredProperties.Count());
            var giftCard = premiumAccountType.DeclaredProperties.Single() as IEdmNavigationProperty;
            Assert.True(giftCard.ContainsTarget, "PreminumAccountType.GiftCard");
            Assert.Equal(EdmMultiplicity.One, giftCard.TargetMultiplicity());

            var edmNamespace = typeof(PaymentInstrument).Namespace;
            var actionClear = edmModel.FindOperations(edmNamespace + ".Clear").Single() as IEdmAction;
            var nameContains = actionClear.Parameters.Single(p => p.Name == "nameContains");
            Assert.Equal("Edm.String", nameContains.Type.Definition.ToString());
            Assert.Equal("Edm.Int32", actionClear.ReturnType.Definition.ToString());

            var functionGetCount = edmModel.FindDeclaredOperations(edmNamespace + ".GetCount").Single() as IEdmFunction;
            nameContains = functionGetCount.Parameters.Single(p => p.Name == "nameContains");
            Assert.Equal("Edm.String", nameContains.Type.Definition.ToString());
            Assert.Equal("Edm.Int32", functionGetCount.ReturnType.Definition.ToString());

            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);
        }
Example #13
0
        public async Task ModelBuilderTest(string modelMode)
        {
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, modelMode);

            HttpResponseMessage response = await this.Client.GetAsync(requestUri);
            var stream = await response.Content.ReadAsStreamAsync();

            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);

            var favoriteSports = edmModel.SchemaElements.OfType<IEdmComplexType>().First();
            Assert.Equal("FavoriteSports", favoriteSports.Name);
            Assert.Equal(2, favoriteSports.Properties().Count());

            //ComplexType Enum Property
            var likeMost = favoriteSports.Properties().SingleOrDefault(p => p.Name == "LikeMost");
            Assert.True(likeMost.Type.IsEnum());

            //ComplexType Enum Property
            var like = favoriteSports.Properties().SingleOrDefault(p => p.Name == "Like");
            Assert.True(like.Type.IsCollection());

            var employee = edmModel.SchemaElements.SingleOrDefault(e => e.Name == "Employee") as IEdmEntityType;
            Assert.Equal(1, employee.Key().Count());
            Assert.Equal("ID", employee.Key().First().Name);
            Assert.Equal(6, employee.Properties().Count());

            //Entity Enum Collection Property
            var skillSet = employee.Properties().SingleOrDefault(p => p.Name == "SkillSet");
            Assert.True(skillSet.Type.IsCollection());

            //Entity Enum Property
            var gender = employee.Properties().SingleOrDefault(p => p.Name == "Gender");
            Assert.True(gender.Type.IsEnum());
            var edmEnumType = gender.Type.Definition as IEdmEnumType;
            Assert.False(edmEnumType.IsFlags);

            var accessLevel = employee.Properties().SingleOrDefault(p => p.Name == "AccessLevel") as IEdmStructuralProperty;
            edmEnumType = accessLevel.Type.Definition as IEdmEnumType;
            Assert.Equal(3, edmEnumType.Members.Count());
            Assert.True(edmEnumType.IsFlags);

            //Action AddSkill
            var iEdmOperation = edmModel.FindOperations(typeof(Employee).Namespace + ".AddSkill").FirstOrDefault();
            var iEdmOperationParameter = iEdmOperation.Parameters.SingleOrDefault(p => p.Name == "skill");
            var definition = iEdmOperationParameter.Type.Definition;
            Assert.Equal(EdmTypeKind.Enum, definition.TypeKind);

            var iEdmCollectionTpeReference = iEdmOperation.ReturnType as IEdmCollectionTypeReference;
            var iEdmTypeReference = iEdmCollectionTpeReference.ElementType();
            Assert.Equal(EdmTypeKind.Enum, iEdmTypeReference.Definition.TypeKind);

            // Action SetAccessLevel
            var iEdmOperationOfSetAccessLevel = edmModel.FindOperations(typeof(Employee).Namespace + ".SetAccessLevel").FirstOrDefault();
            var iEdmOperationParameterOfAccessLevel = iEdmOperationOfSetAccessLevel.Parameters.SingleOrDefault(p => p.Name == "accessLevel");
            var definitionOfAccessLevel = iEdmOperationParameterOfAccessLevel.Type.Definition;
            Assert.Equal(EdmTypeKind.Enum, definitionOfAccessLevel.TypeKind);

            var iEdmTpeReferenceOfAccessLevel = iEdmOperationOfSetAccessLevel.ReturnType;
            Assert.Equal(EdmTypeKind.Enum, iEdmTpeReferenceOfAccessLevel.Definition.TypeKind);

            // Function GetAccessLevel
            var iEdmOperationOfGetAccessLevel = edmModel.FindDeclaredOperations(typeof(Employee).Namespace + ".GetAccessLevel").FirstOrDefault();
            var iEdmTypeReferenceOfGetAccessLevel = iEdmOperationOfGetAccessLevel.ReturnType;
            Assert.Equal(EdmTypeKind.Enum, iEdmTypeReferenceOfGetAccessLevel.Definition.TypeKind);

            // Function HasAccessLevel
            var iEdmOperationOfHasAccessLevel = edmModel.FindDeclaredOperations(typeof(Employee).Namespace + ".HasAccessLevel").FirstOrDefault();
            var iEdmOperationParameterOfHasAccessLevel = iEdmOperationOfHasAccessLevel.Parameters.SingleOrDefault(p => p.Name == "AccessLevel");
            Assert.Equal(EdmTypeKind.Enum, iEdmOperationParameterOfHasAccessLevel.Type.Definition.TypeKind);
        }
Example #14
0
        public void ModelBuilderTest()
        {
            const string expectMetadata =
                "        <EntitySet Name=\"ETagsCustomers\" EntityType=\"WebStack.QA.Test.OData.ETags.ETagsCustomer\">\r\n" +
                "          <Annotation Term=\"Org.OData.Core.V1.OptimisticConcurrency\">\r\n" +
                "            <Collection>\r\n" +
                "              <PropertyPath>Id</PropertyPath>\r\n" +
                "              <PropertyPath>Name</PropertyPath>\r\n" +
                "              <PropertyPath>BoolProperty</PropertyPath>\r\n" +
                "              <PropertyPath>ByteProperty</PropertyPath>\r\n" +
                "              <PropertyPath>CharProperty</PropertyPath>\r\n" +
                "              <PropertyPath>DecimalProperty</PropertyPath>\r\n" +
                "              <PropertyPath>DoubleProperty</PropertyPath>\r\n" +
                "              <PropertyPath>ShortProperty</PropertyPath>\r\n" +
                "              <PropertyPath>LongProperty</PropertyPath>\r\n" +
                "              <PropertyPath>SbyteProperty</PropertyPath>\r\n" +
                "              <PropertyPath>FloatProperty</PropertyPath>\r\n" +
                "              <PropertyPath>UshortProperty</PropertyPath>\r\n" +
                "              <PropertyPath>UintProperty</PropertyPath>\r\n" +
                "              <PropertyPath>UlongProperty</PropertyPath>\r\n" +
                "              <PropertyPath>GuidProperty</PropertyPath>\r\n" +
                "              <PropertyPath>DateTimeOffsetProperty</PropertyPath>\r\n" +
                "              <PropertyPath>StringWithConcurrencyCheckAttributeProperty</PropertyPath>\r\n" +
                "            </Collection>\r\n" +
                "          </Annotation>\r\n" +
                "        </EntitySet>";

            string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress);

            HttpResponseMessage response = this.Client.GetAsync(requestUri).Result;

            var content = response.Content.ReadAsStringAsync().Result;
            Assert.Contains(expectMetadata, content);

            var stream = response.Content.ReadAsStreamAsync().Result;
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();
            Assert.NotNull(edmModel);

            var etagCustomers = edmModel.FindDeclaredEntitySet("ETagsCustomers");
            Assert.NotNull(etagCustomers);

            var annotations = edmModel.FindDeclaredVocabularyAnnotations(etagCustomers);
            IEdmVocabularyAnnotation annotation = Assert.Single(annotations);
            Assert.NotNull(annotation);

            Assert.Same(CoreVocabularyModel.ConcurrencyTerm, annotation.Term);
            Assert.Same(etagCustomers, annotation.Target);

            IEdmValueAnnotation valueAnnotation = annotation as IEdmValueAnnotation;
            Assert.NotNull(valueAnnotation);
            Assert.NotNull(valueAnnotation.Value);

            IEdmCollectionExpression collection = valueAnnotation.Value as IEdmCollectionExpression;
            Assert.NotNull(collection);
            Assert.Equal(new[]
            {
                "Id", "Name", "BoolProperty", "ByteProperty", "CharProperty", "DecimalProperty",
                "DoubleProperty", "ShortProperty", "LongProperty", "SbyteProperty",
                "FloatProperty", "UshortProperty", "UintProperty", "UlongProperty",
                "GuidProperty", "DateTimeOffsetProperty",
                "StringWithConcurrencyCheckAttributeProperty"
            },
                collection.Elements.Select(e => ((IEdmPathExpression) e).Path.Single()));
        }
        public async Task VerifyMetaDataIsGeneratedCorrectly()
        {
            var response = await Client.GetAsync(BaseAddress + "/$metadata");

            var stream = await response.Content.ReadAsStreamAsync();
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            Assert.Equal(4, edmModel.GetEdmVersion().Major);
           
            var container = edmModel.EntityContainer;
            Assert.Equal("Container", container.Name);
            Assert.Equal(3, container.Elements.Count());

            var address = edmModel.SchemaElements.OfType<IEdmComplexType>().First();
            Assert.Equal("Address", address.Name);
            Assert.Equal(5, address.Properties().Count());

            var product = edmModel.SchemaElements.Where(e => e.Name == "Product").First() as IEdmEntityType;
            Assert.Equal(1, product.Key().Count());
            Assert.Equal("ID", product.Key().First().Name);
            Assert.Equal(5, product.Properties().Count());

            var supplier = edmModel.SchemaElements.Where(e => e.Name == "Supplier").First() as IEdmEntityType;
            Assert.Equal(1, supplier.Key().Count());
            Assert.Equal("ID", supplier.Key().First().Name);
            Assert.Equal(6, supplier.Properties().Count());

            var addressesProperty = supplier.Properties().First(p => p.Name == "Addresses").Type.AsCollection();
            Assert.Equal(typeof(Address).FullName, addressesProperty.CollectionDefinition().ElementType.FullName());
            
            // [ODATA-CSDL] 
            // In 6.2.1 
            // a) If not value is specified for a property whose Type attribute does not specify a collection,
            //    the Nuallable attribute defaults to true
            // b) A property whose Type attribute specifies a collection MUST NOT specify a value for the 
            //    Nullable attribute as the collection always exists, it may just be empty.
            Assert.Equal(true, addressesProperty.IsNullable);

            var tagsProperty = supplier.Properties().First(p => p.Name == "Tags").Type.AsCollection();
            Assert.Equal("Edm.String", tagsProperty.CollectionDefinition().ElementType.FullName());
            Assert.Equal(true, tagsProperty.IsNullable);
        }
        public async Task ModelBuilderTest(string routing)
        {
            // Arrange
            string requestUri = string.Format("{0}/{1}/$metadata", this.BaseAddress, routing);
            var typeOfEmployee = typeof(Employee);

            // Act
            HttpResponseMessage response = await Client.GetAsync(requestUri);
            var stream = response.Content.ReadAsStreamAsync().Result;
            IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers);
            var reader = new ODataMessageReader(message);
            var edmModel = reader.ReadMetadataDocument();

            // Assert

            #region functions
            // Function GetCount
            var iEdmOperationsOfGetCount = edmModel.FindDeclaredOperations("Default.GetCount");
            Assert.Equal(3, iEdmOperationsOfGetCount.Count());

            //     (Collection(Employee)).GetCount(String Name)
            var getCount = iEdmOperationsOfGetCount.Where(f => f.Parameters.Count() == 2);
            Assert.Equal(1, getCount.Count());

            //     (Collection(Manager)).GetCount()
            foreach (var t in iEdmOperationsOfGetCount)
            {
                var t1 = t.Parameters.First().Type.Definition.ToString();
                var t2 = t.Parameters.First().Type;
            }
            getCount = iEdmOperationsOfGetCount.Where(f => f.Parameters.Count() == 1
                && f.Parameters.First().Type.Definition.ToString()
                .Equals(string.Format("Collection([{0} Nullable=True])", Manager)));
            Assert.Equal(1, getCount.Count());

            //     (Collection(Employee)).GetCount()
            getCount = iEdmOperationsOfGetCount.Where(f => f.Parameters.Count() == 1
                && f.Parameters.First().Type.Definition.ToString()
                .Equals(string.Format("Collection([{0} Nullable=True])", Employee)));
            Assert.Equal(1, getCount.Count());

            // Function GetEmailsCount()
            var iEdmOperationsOfGetEmailsCount = edmModel.FindDeclaredOperations("Default.GetEmailsCount");
            Assert.Equal(2, iEdmOperationsOfGetEmailsCount.Count());

            //     Empllyee.GetEmailCount()
            var getEmailsCount = iEdmOperationsOfGetEmailsCount.Where(f => f.Parameters.Count() == 1
                && f.Parameters.First().Type.Definition.ToString().Equals(Employee));
            Assert.Equal(1, getEmailsCount.Count());

            //     Manager.GetEmailCount()
            getEmailsCount = iEdmOperationsOfGetEmailsCount.Where(f => f.Parameters.Count() == 1
                && f.Parameters.First().Type.Definition.ToString().Equals(Manager));
            Assert.Equal(1, getEmailsCount.Count());

            // primitive & collection of primitive
            AssertPrimitiveOperation(edmModel, "Default.PrimitiveFunction");

            // Enum & collection of Enum
            AssertEnumOperation(edmModel, "Default.EnumFunction");

            // Complex & collection of Complex
            AssertComplexOperation(edmModel, "Default.ComplexFunction");

            // Entity & collection of Entity
            AssertEntityOperation(edmModel, "Default.EntityFunction");

            #endregion

            #region actions

            // Action IncreaseSalary
            var iEdmOperationOfIncreaseSalary = edmModel.FindDeclaredOperations("Default.IncreaseSalary");
            Assert.Equal(4, iEdmOperationOfIncreaseSalary.Count());

            //    (Collection(Employee)).IncreaseSalary(String Name)
            var increaseSalary = iEdmOperationOfIncreaseSalary.Where(a => a.Parameters.Count() == 2
                && a.Parameters.First().Type.Definition.ToString().Equals(CollectionOfEmployee));
            Assert.NotNull(increaseSalary);

            //    (Collection(Manager)).IncreaseSalary()
            increaseSalary = iEdmOperationOfIncreaseSalary.Where(a => a.Parameters.Count() == 1
                && a.Parameters.First().Type.Definition.ToString().Equals(CollectionOfManager));
            Assert.NotNull(increaseSalary);


            //    Employee.IncreaseSalary()
            increaseSalary = iEdmOperationOfIncreaseSalary.Where(a => a.Parameters.Count() == 1
                && a.Parameters.First().Type.Definition.ToString().Equals(Employee));
            Assert.NotNull(increaseSalary);

            //    Manager.IncreaseSalary()
            increaseSalary = iEdmOperationOfIncreaseSalary.Where(a => a.Parameters.Count() == 1
                && a.Parameters.First().Type.Definition.ToString().Equals(Manager));
            Assert.NotNull(increaseSalary);

            // primitive & collection of primitive
            AssertPrimitiveOperation(edmModel, "Default.PrimitiveAction");

            // Enum & collection of Enum
            AssertEnumOperation(edmModel, "Default.EnumAction");

            // Complex & collection of Complex
            AssertComplexOperation(edmModel, "Default.ComplexAction");

            // Entity & collection of Entity
            AssertEntityOperation(edmModel, "Default.EntityAction");
            #endregion

            // ActionImport: ResetDataSource
            Assert.Equal(1, edmModel.EntityContainer.OperationImports().Count());

        }