コード例 #1
0
        internal static DSPMetadata CreateRoadTripMetadata(Type geographyPropertyType, bool useComplexType = false, bool useOpenTypes = false, Action <DSPMetadata> modifyMetadata = null)
        {
            Assert.IsTrue(typeof(ISpatial).IsAssignableFrom(geographyPropertyType), "geographyPropertyType passed to CreateRoadTripMetadata is not a type derived from Geography.");

            string      modelName = string.Format("RoadTripModelWith{0}", geographyPropertyType.Name);
            DSPMetadata metadata  = new DSPMetadata(modelName, "AstoriaUnitTests.Tests");

            // Geography property followed by another geography property
            KeyValuePair <string, Type>[] tripLegProperties = new KeyValuePair <string, Type>[] {
                new KeyValuePair <string, Type>("GeographyProperty1", geographyPropertyType),
                new KeyValuePair <string, Type>("GeographyProperty2", geographyPropertyType),
            };
            AddEntityType(metadata, "TripLeg", tripLegProperties, useComplexType, useOpenTypes);

            // Geography property followed by another non-geography property
            KeyValuePair <string, Type>[] amusementParkProperties = new KeyValuePair <string, Type>[] {
                new KeyValuePair <string, Type>("GeographyProperty", geographyPropertyType),
                new KeyValuePair <string, Type>("Name", typeof(string)),
            };
            AddEntityType(metadata, "AmusementPark", amusementParkProperties, useComplexType, useOpenTypes);

            // Geography property at the end of the entry
            KeyValuePair <string, Type>[] restStopProperties = new KeyValuePair <string, Type>[] {
                new KeyValuePair <string, Type>("GeographyProperty", geographyPropertyType),
            };
            AddEntityType(metadata, "RestStop", restStopProperties, useComplexType, useOpenTypes);

            if (modifyMetadata != null)
            {
                modifyMetadata(metadata);
            }
            metadata.SetReadOnly();
            return(metadata);
        }
コード例 #2
0
        private static DSPMetadata GetModel(bool openType, bool namedStreams, Action <DSPMetadata> metadataModifier = null)
        {
            #region Model Definition
            // Navigation Collection Property: Client - Entity, Server - NonEntity
            DSPMetadata metadata = new DSPMetadata("ModelWithNonNullableProperties", "AstoriaUnitTests.Tests");

            // Define people type having non-nullable properties
            var peopleType = metadata.AddEntityType("PeopleType", null, null, false);
            var officeType = metadata.AddComplexType("OfficeType", null, null, false);
            metadata.AddPrimitiveProperty(officeType, "Building", typeof(string));
            metadata.AddPrimitiveProperty(officeType, "OfficeNumber", typeof(int));

            peopleType.IsOpenType = openType;
            metadata.AddKeyProperty(peopleType, "ID", typeof(int));
            if (!openType)
            {
                metadata.AddPrimitiveProperty(peopleType, "Name", typeof(string));
                metadata.AddPrimitiveProperty(peopleType, "Body", typeof(byte[]));
                metadata.AddPrimitiveProperty(peopleType, "Age", typeof(Nullable <int>));
                metadata.AddComplexProperty(peopleType, "Office", officeType);
            }

            var peopleSet = metadata.AddResourceSet("People", peopleType);

            if (metadataModifier != null)
            {
                metadataModifier(metadata);
            }

            metadata.SetReadOnly();
            #endregion Model Definition

            return(metadata);
        }
コード例 #3
0
        private static DSPResource CreateResource(DSPMetadata metadata, string entityTypeName, int idValue, KeyValuePair <string, object>[] propertyValues, bool useComplexType)
        {
            var entityType = metadata.GetResourceType(entityTypeName);

            DSPResource entity;

            if (useComplexType)
            {
                entity = new DSPResource(entityType);
            }
            else
            {
                entity = new DSPResource(entityType, propertyValues);
            }

            entity.SetValue("ID", idValue);

            DSPResource resourceForProperties;

            if (useComplexType)
            {
                string complexTypeName = GetComplexTypeName(entityTypeName);
                var    complexType     = metadata.GetResourceType(complexTypeName);
                resourceForProperties = new DSPResource(complexType, propertyValues);
                entity.SetValue("ComplexProperty", resourceForProperties);
            }
            else
            {
                resourceForProperties = entity;
            }
            return(entity);
        }
コード例 #4
0
        internal static void AddEntityType(DSPMetadata metadata, string entityTypeName, KeyValuePair <string, Type>[] properties, bool useComplexType, bool useOpenTypes)
        {
            var entityType = metadata.AddEntityType(entityTypeName, null, null, false);

            metadata.AddKeyProperty(entityType, "ID", typeof(int));
            entityType.IsOpenType = useOpenTypes;

            if (!useOpenTypes)
            {
                Microsoft.OData.Service.Providers.ResourceType resourceTypeForProps;
                if (useComplexType)
                {
                    string complexTypeName = GetComplexTypeName(entityTypeName);
                    resourceTypeForProps = metadata.AddComplexType(complexTypeName, null, null, false);
                    metadata.AddComplexProperty(entityType, "ComplexProperty", resourceTypeForProps);
                }
                else
                {
                    resourceTypeForProps = entityType;
                }

                foreach (KeyValuePair <string, Type> property in properties)
                {
                    metadata.AddPrimitiveProperty(resourceTypeForProps, property.Key, property.Value);
                }
            }

            string resourceSetName = GetResourceSetName(entityTypeName);

            metadata.AddResourceSet(resourceSetName, entityType);
        }
コード例 #5
0
        private DSPServiceDefinition CreateCollectionReadService(Dictionary <Type, object> data)
        {
            DSPMetadata metadata   = new DSPMetadata("SpatialServerIntegration", "AstoriaUnitTests.Tests");
            var         entityType = metadata.AddEntityType("EntityType", null, null, false);

            metadata.AddResourceSet("Entities", entityType);
            metadata.AddKeyProperty(entityType, "ID", typeof(int));
            foreach (Type t in data.Keys)
            {
                metadata.AddCollectionProperty(entityType, "Collection" + t.Name, t);
            }

            DSPContext dataSource = new DSPContext();
            var        entities   = dataSource.GetResourceSetEntities("Entities");
            var        resource   = new DSPResource(entityType);

            resource.SetValue("ID", 0);

            foreach (KeyValuePair <Type, object> d in data)
            {
                resource.SetValue("Collection" + d.Key.Name, d.Value);
            }

            entities.Add(resource);

            return(new DSPServiceDefinition()
            {
                Metadata = metadata,
                DataSource = dataSource
            });
        }
コード例 #6
0
        public DSPQueryableContext CreateContext(DSPMetadata metadata, Dictionary <string, Type> providerTypes, string connectionString)
        {
            Func <string, IQueryable> queryProviders = x => GetQueryableCollection(connectionString, providerTypes, x);
            var dspContext = new DSPQueryableContext(metadata, queryProviders);

            return(dspContext);
        }
コード例 #7
0
        protected override DSPMetadata CreateDSPMetadata()
        {
            DSPMetadata metadata = new DSPMetadata("DemoService", "DataServiceProviderDemo");

            ResourceType product = metadata.AddEntityType("Product");

            metadata.AddKeyProperty(product, "ID", typeof(int));
            metadata.AddPrimitiveProperty(product, "Name", typeof(string));
            metadata.AddPrimitiveProperty(product, "Description", typeof(string));
            metadata.AddPrimitiveProperty(product, "ReleaseDate", typeof(DateTime));
            metadata.AddPrimitiveProperty(product, "DiscontinueDate", typeof(DateTime?));
            metadata.AddPrimitiveProperty(product, "Rating", typeof(int));

            ResourceSet products = metadata.AddResourceSet("Products", product);

            ResourceType category = metadata.AddEntityType("Category");

            metadata.AddKeyProperty(category, "ID", typeof(int));
            metadata.AddPrimitiveProperty(category, "Name", typeof(string));

            ResourceSet categories = metadata.AddResourceSet("Categories", category);

            // Add reference properties between category and product
            metadata.AddResourceReferenceProperty(product, "Category", categories);
            metadata.AddResourceSetReferenceProperty(category, "Products", products);

            return(metadata);
        }
コード例 #8
0
        private static DSPContext GetDefaultData(DSPMetadata metadata)
        {
            var peopleType = metadata.GetResourceType("PeopleType");
            var officeType = metadata.GetResourceType("OfficeType");

            #region Default Data for the Model
            var context = new DSPContext();

            DSPResource people1 = new DSPResource(peopleType);
            people1.SetValue("ID", 1);
            people1.SetValue("Name", "Foo");
            people1.SetValue("Body", Encoding.UTF8.GetBytes("a byte array"));
            people1.SetValue("Age", 23);

            var office = new DSPResource(officeType);
            office.SetValue("Building", "Building 18");
            office.SetValue("OfficeNumber", 100);
            people1.SetValue("Office", office);

            var people = context.GetResourceSetEntities("People");
            people.Add(people1);

            #endregion Default Data for the Model

            return(context);
        }
コード例 #9
0
        protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context)
        {
            foreach (var collectionName in GetCollectionNames(context))
            {
                var collection = context.Database.GetCollection(collectionName);
                var document   = collection.FindOne();
                if (document != null)
                {
                    var collectionType = metadata.AddEntityType(collectionName);

                    foreach (var element in document.Elements)
                    {
                        var elementType = GetElementType(context, element);
                        if (element.Name == "_id")
                        {
                            metadata.AddKeyProperty(collectionType, "ID", elementType);
                        }
                        else if (elementType == typeof(BsonDocument))
                        {
                            string referencedCollectionName = GetDocumentCollection(context, element.Value.AsBsonDocument).Name;
                            resourceReferences.Add(new Tuple <ResourceType, string, string>(collectionType, element.Name, referencedCollectionName));
                        }
                        else if (elementType == typeof(BsonArray))
                        {
                            var bsonArray = element.Value.AsBsonArray;
                            if (bsonArray != null && bsonArray.Count > 0)
                            {
                                string referencedCollectionName = GetDocumentCollection(context, bsonArray[0].AsBsonDocument).Name;
                                resourceSetReferences.Add(new Tuple <ResourceType, string, string>(collectionType, element.Name, referencedCollectionName));
                            }
                        }
                        else
                        {
                            metadata.AddPrimitiveProperty(collectionType, element.Name, elementType);
                        }
                    }
                    metadata.AddResourceSet(collectionName, collectionType);
                }
            }

            foreach (var reference in resourceReferences)
            {
                var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault();
                if (referencedResourceSet != null)
                {
                    metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet);
                }
            }

            foreach (var reference in resourceSetReferences)
            {
                var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault();
                if (referencedResourceSet != null)
                {
                    metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet);
                }
            }
        }
コード例 #10
0
 public static void ClassInitialize(TestContext context)
 {
     Metadata             = new DSPMetadata(ServiceName, ServiceNamespace);
     CustomerResourceType = Metadata.AddEntityType("CustomerEntity", null, null, false);
     Metadata.AddKeyProperty(CustomerResourceType, "ID", typeof(int));
     Metadata.AddPrimitiveProperty(CustomerResourceType, "Name", typeof(string), false);
     Metadata.AddResourceSet("CustomerEntities", CustomerResourceType);
     Metadata.SetReadOnly();
 }
コード例 #11
0
        public DSPMetadata CreateMetadata()
        {
            var metadata = new DSPMetadata("MongoContext", "Northwind");

            using (MongoContext context = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString))
            {
                PopulateMetadata(metadata, context);
            }

            return(metadata);
        }
コード例 #12
0
        public DSPInMemoryContext CreateContext(DSPMetadata metadata, string connectionString)
        {
            var dspContext = new DSPInMemoryContext();

            using (MongoContext mongoContext = new MongoContext(connectionString))
            {
                PopulateData(dspContext, mongoContext, metadata);
            }

            return(dspContext);
        }
コード例 #13
0
        /// <summary>
        /// Create a service for a specific spatial property type.
        /// </summary>
        /// <remarks>
        /// DEVNOTE(pqian):
        /// The service will populate with properties named after the property type, with a sequence number
        /// indicating which test sample it holds. For example, if the method is called with 3 sample data,
        /// and the target type is GeographyPoint, then the service will look like
        /// EntityType:
        /// ID
        /// GeographyPoint1
        /// GeographyPoint2
        /// GeographyPoint3
        /// </remarks>
        /// <typeparam name="T">The target type</typeparam>
        /// <param name="data">Sample Data</param>
        /// <param name="overrideType">Use this type instead of typeof(T)</param>
        /// <param name="openProperty">Use Open Type</param>
        /// <param name="writable">Writable service</param>
        /// <returns>The constructed service definition</returns>
        private DSPServiceDefinition CreateSpatialPropertyService <T>(T[] data, Type overrideType = null, bool openProperty = false, bool writable = false)
        {
            Type propertyType = overrideType ?? typeof(T);

            DSPMetadata metadata   = new DSPMetadata("SpatialServerIntegration", "AstoriaUnitTests.Tests");
            var         entityType = metadata.AddEntityType("EntityType", null, null, false);

            metadata.AddResourceSet("Entities", entityType);
            metadata.AddKeyProperty(entityType, "ID", typeof(int));

            if (!openProperty)
            {
                for (int i = 0; i < data.Length; ++i)
                {
                    metadata.AddPrimitiveProperty(entityType, propertyType.Name + i, propertyType);
                }
            }

            entityType.IsOpenType = openProperty;

            var definition = new DSPServiceDefinition()
            {
                Metadata = metadata
            };

            if (writable)
            {
                definition.CreateDataSource = (m) => new DSPContext();
                definition.Writable         = true;
            }
            else
            {
                DSPContext dataSource = new DSPContext();
                var        entities   = dataSource.GetResourceSetEntities("Entities");
                var        resource   = new DSPResource(entityType);
                resource.SetValue("ID", 0);

                for (int i = 0; i < data.Length; ++i)
                {
                    if (!openProperty)
                    {
                        metadata.AddPrimitiveProperty(entityType, propertyType.Name + i, propertyType);
                    }

                    resource.SetValue(propertyType.Name + i, data[i]);
                }

                entities.Add(resource);
                definition.DataSource = dataSource;
            }

            return(definition);
        }
コード例 #14
0
        protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context)
        {
            var itemsType = new ResourceType(typeof(Dictionary <string, object>),
                                             ResourceTypeKind.ComplexType, null, "Northwind", "Items", false);

            foreach (var collectionName in GetCollectionNames(context))
            {
                var collectionType = metadata.AddEntityType(collectionName);
                metadata.AddKeyProperty(collectionType, "Id", typeof(string));
                metadata.AddComplexProperty(collectionType, "Items", itemsType);
                metadata.AddResourceSet(collectionName, collectionType);
            }
        }
コード例 #15
0
        internal static DSPUnitTestServiceDefinition CreateRoadTripServiceDefinition(DSPMetadata roadTripMetadata, GeographyPropertyValues defaultValues, DSPDataProviderKind providerKind, bool useComplexType = false, Action <string, List <KeyValuePair <string, object> > > modifyPropertyValues = null)
        {
            Assert.IsFalse(useComplexType, "Complex type support is not yet added to the property population in DSPUnitTestServiceDefinition.");

            DSPContext defaultData = PopulateRoadTripData(roadTripMetadata, defaultValues, useComplexType, modifyPropertyValues);

            var service = new DSPUnitTestServiceDefinition(roadTripMetadata, providerKind, defaultData);

            service.HostInterfaceType = typeof(IDataServiceHost2);
            service.DataServiceBehavior.AcceptSpatialLiteralsInQuery = true;
            service.Writable = true;
            service.DataServiceBehavior.MaxProtocolVersion = ODataProtocolVersion.V4;

            return(service);
        }
コード例 #16
0
        public void AllowRedefiningConcurrencyTokenOnDerivedType()
        {
            var metadataProvider = new DSPMetadata("DefaultContainer", "Default");

            var entityType = metadataProvider.AddEntityType("EntityType", null, null, false /*isAbstract*/);

            metadataProvider.AddKeyProperty(entityType, "ID", typeof(int));
            metadataProvider.AddPrimitiveProperty(entityType, "LastUpdatedAuthor", typeof(string), true /*eTag*/);

            var derivedType = metadataProvider.AddEntityType("DerivedType", null, entityType, false /*isAbstract*/);

            metadataProvider.AddPrimitiveProperty(derivedType, "LastModifiedAuthor", typeof(string), true /*eTag*/);

            metadataProvider.AddResourceSet("Customers", entityType);

            var wrapper = new DataServiceMetadataProviderWrapper(metadataProvider);

            DSPResource baseTypeInstance = new DSPResource(entityType);

            baseTypeInstance.SetValue("ID", 1);
            baseTypeInstance.SetValue("LastUpdatedAuthor", "Phani");

            DSPResource derivedTypeInstance = new DSPResource(derivedType);

            derivedTypeInstance.SetValue("ID", 1);
            derivedTypeInstance.SetValue("LastModifiedAuthor", "Raj");

            DSPContext dataContext = new DSPContext();
            var        entities    = dataContext.GetResourceSetEntities("Customers");

            entities.AddRange(new object[] { baseTypeInstance, derivedTypeInstance });

            var service = new DSPUnitTestServiceDefinition(metadataProvider, DSPDataProviderKind.Reflection, dataContext);

            using (TestWebRequest request = service.CreateForInProcess())
            {
                try
                {
                    request.StartService();
                    request.RequestUriString = "/$metadata";
                    request.SendRequestAndCheckResponse();
                }
                finally
                {
                    request.StopService();
                }
            }
        }
コード例 #17
0
        internal static DSPResource CreateRestStopResource(DSPMetadata roadTripMetadata, int id, ITestGeography location, bool useComplexType, Action <string, List <KeyValuePair <string, object> > > modifyPropertyValues)
        {
            List <KeyValuePair <string, object> > restStopPropertyValues = new List <KeyValuePair <string, object> >()
            {
                new KeyValuePair <string, object>("GeographyProperty", location.AsGeography()),
            };

            if (modifyPropertyValues != null)
            {
                modifyPropertyValues("RestStop", restStopPropertyValues);
            }

            DSPResource restStopResource = CreateResource(roadTripMetadata, "RestStop", id, restStopPropertyValues.ToArray(), useComplexType);

            return(restStopResource);
        }
コード例 #18
0
        internal static DSPResource CreateTripLegResource(DSPMetadata roadTripMetadata, int id, ITestGeography geography1, ITestGeography geography2, bool useComplexType, Action <string, List <KeyValuePair <string, object> > > modifyPropertyValues)
        {
            List <KeyValuePair <string, object> > tripLegPropertyValues = new List <KeyValuePair <string, object> >()
            {
                new KeyValuePair <string, object>("GeographyProperty1", geography1.AsGeography()),
                new KeyValuePair <string, object>("GeographyProperty2", geography2.AsGeography()),
            };

            if (modifyPropertyValues != null)
            {
                modifyPropertyValues("TripLeg", tripLegPropertyValues);
            }
            DSPResource tripLegResource = CreateResource(roadTripMetadata, "TripLeg", id, tripLegPropertyValues.ToArray(), useComplexType);

            return(tripLegResource);
        }
コード例 #19
0
            public DataServiceMetadataProviderWrapper(DSPMetadata metadataProvider)
            {
                DataServiceConfiguration config = (DataServiceConfiguration)Activator.CreateInstance(
                    typeof(DataServiceConfiguration),
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null,
                    new object[] { metadataProvider },
                    null);

                config.SetEntitySetAccessRule("*", EntitySetRights.All);
                config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

                Type   staticConfigurationType = typeof(ResourceType).Assembly.GetType("Microsoft.OData.Service.DataServiceStaticConfiguration");
                object staticConfig            = (object)Activator.CreateInstance(
                    staticConfigurationType,
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null,
                    new object[] { typeof(DummyServiceType), metadataProvider },
                    null);

                Type   cacheItemType = typeof(ResourceType).Assembly.GetType("Microsoft.OData.Service.Caching.DataServiceCacheItem");
                object cacheItem     = Activator.CreateInstance(
                    cacheItemType,
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null,
                    new object[] { config, staticConfig },
                    null);

                Type dspProviderBehaviorType = typeof(ResourceType).Assembly.GetType("Microsoft.OData.Service.Providers.DataServiceProviderBehavior");
                IDataServiceProviderBehavior providerBehavior = (IDataServiceProviderBehavior)Activator.CreateInstance(
                    dspProviderBehaviorType,
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null,
                    new object[] { new ProviderBehavior(ProviderQueryBehaviorKind.CustomProviderQueryBehavior) },
                    null);

                Type type = typeof(ResourceType).Assembly.GetType("Microsoft.OData.Service.Providers.DataServiceProviderWrapper");

                instance = Activator.CreateInstance(
                    type,
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null,
                    new object[] { cacheItem, metadataProvider, new DSPResourceQueryProvider(metadataProvider, false), /*dataService*/ null, false },
                    null);

                type.GetField("providerBehavior", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(instance, providerBehavior);
            }
コード例 #20
0
        internal static DSPResource CreateAmusementParkResource(DSPMetadata roadTripMetadata, int id, ITestGeography location, string name, bool useComplexType, Action <string, List <KeyValuePair <string, object> > > modifyPropertyValues)
        {
            List <KeyValuePair <string, object> > amusementParkPropertyValues = new List <KeyValuePair <string, object> >()
            {
                new KeyValuePair <string, object>("GeographyProperty", location.AsGeography()),
                new KeyValuePair <string, object>("Name", name),
            };

            if (modifyPropertyValues != null)
            {
                modifyPropertyValues("AmusementPark", amusementParkPropertyValues);
            }

            DSPResource amusementParkResource = CreateResource(roadTripMetadata, "AmusementPark", id, amusementParkPropertyValues.ToArray(), useComplexType);

            return(amusementParkResource);
        }
コード例 #21
0
        internal static DSPContext PopulateRoadTripData(DSPMetadata roadTripMetadata, GeographyPropertyValues defaultValues, bool useComplexType, Action <string, List <KeyValuePair <string, object> > > modifyPropertyValues = null)
        {
            var context = new DSPContext();

            DSPResource tripLegResource = CreateTripLegResource(roadTripMetadata, DefaultId, defaultValues.TripLegGeography1, defaultValues.TripLegGeography2, useComplexType, modifyPropertyValues);

            PopulateResourceSet(context, tripLegResource);

            DSPResource amusementParkResource = CreateAmusementParkResource(roadTripMetadata, DefaultId, defaultValues.AmusementParkGeography, "Disneyland", useComplexType, modifyPropertyValues);

            PopulateResourceSet(context, amusementParkResource);

            DSPResource restStopResource = CreateRestStopResource(roadTripMetadata, DefaultId, defaultValues.RestStopGeography, useComplexType, modifyPropertyValues);

            PopulateResourceSet(context, restStopResource);

            return(context);
        }
コード例 #22
0
        /// <summary>
        /// Creates a datasource from the given metadata.
        /// </summary>
        /// <param name="metadata">The metadata against which the datasource is created.</param>
        /// <returns>DSPContext representing the data source.</returns>
        private static DSPContext CreateDataSource(DSPMetadata metadata)
        {
            DSPContext   context      = new DSPContext();
            ResourceType customerType = metadata.GetResourceType("CustomerEntity");
            DSPResource  entity1      = new DSPResource(customerType);

            entity1.SetValue("ID", 1);
            entity1.SetValue("Name", "Vineet");

            DSPResource entity2 = new DSPResource(customerType);

            entity2.SetValue("ID", 2);
            entity2.SetValue("Name", "Jimmy");

            context.GetResourceSetEntities("CustomerEntities").Add(entity1);
            context.GetResourceSetEntities("CustomerEntities").Add(entity2);
            return(context);
        }
コード例 #23
0
        public void EdmValidNamesNotAllowedInUri()
        {
            DSPMetadata metadata   = new DSPMetadata("Test", "TestNS");
            var         entityType = metadata.AddEntityType("MyType", null, null, false);

            metadata.AddKeyProperty(entityType, "ID", typeof(int));
            metadata.AddPrimitiveProperty(entityType, "Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ", typeof(string));
            var resourceSet = metadata.AddResourceSet("EntitySet", entityType);

            metadata.SetReadOnly();

            DSPServiceDefinition service = new DSPServiceDefinition()
            {
                Metadata = metadata,
                Writable = true
            };

            DSPContext data = new DSPContext();

            service.CreateDataSource = (m) => { return(data); };

            using (TestWebRequest request = service.CreateForInProcessWcf())
            {
                request.StartService();
                DataServiceContext context = new DataServiceContext(request.ServiceRoot);

                string value = "value of Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ";

                context.AddObject("EntitySet", new MyType()
                {
                    ID = 1,
                    Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ = value,
                });

                try
                {
                    context.SaveChanges();
                }
                catch (DataServiceRequestException exception)
                {
                    Assert.AreEqual(exception.Message, "An error occurred while processing this request.");
                }
            }
        }
コード例 #24
0
        public void ServiceOperationsMustBeReadOnlyTest()
        {
            var serviceOperationEntryPoints = new Action <DataServiceMetadataProviderWrapper, string>[] {
                (wrapper, name) => wrapper.TryResolveServiceOperation(name),
            };

            AstoriaTestNS.TestUtil.RunCombinations(
                serviceOperationEntryPoints,
                (serviceOperationEntryPoint) =>
            {
                var metadataProvider = new DSPMetadata("Test", "TestNS");
                var serviceOperation = metadataProvider.AddServiceOperation("ServiceOperation", ServiceOperationResultKind.DirectValue, ResourceType.GetPrimitiveResourceType(typeof(string)), null, "GET", new ServiceOperationParameter[0]);
                var wrapper          = new DataServiceMetadataProviderWrapper(metadataProvider);
                ExceptionUtils.ExpectedException <DataServiceException>(
                    () => serviceOperationEntryPoint(wrapper, serviceOperation.Name),
                    "The service operation '" + serviceOperation.Name + "' returned by the provider is not read-only. Please make sure that all the service operations are set to read-only.",
                    "Accessing writable service operation should fail.");
            });
        }
コード例 #25
0
        public void SpatialAsKeys()
        {
            var types = testData.Select(kvp => SpatialTestUtil.GeographyTypeFor(kvp.Key))
                        .Union(testData.Select(kvp => SpatialTestUtil.GeometryTypeFor(kvp.Key)))
                        .Union(new Type[] { typeof(Geography), typeof(Geometry) })
                        .ToArray();

            TestUtil.RunCombinations(types, (t) =>
            {
                DSPMetadata metadata = new DSPMetadata("SpatialServerIntegration", "AstoriaUnitTests.Tests");
                var entityType       = metadata.AddEntityType("EntityType", null, null, false);
                metadata.AddResourceSet("Entities", entityType);
                Exception ex = TestUtil.RunCatching <InvalidOperationException>(
                    () => metadata.AddKeyProperty(entityType, "ID", t));

                Assert.IsNotNull(ex);
                Assert.AreEqual(DataServicesResourceUtil.GetString("ResourceType_SpatialKeyOrETag", "ID", "EntityType"), ex.Message);
            });
        }
コード例 #26
0
        private DSPServiceDefinition CreateCollectionWriteService(List <Type> types)
        {
            DSPMetadata metadata   = new DSPMetadata("SpatialServerIntegration", "AstoriaUnitTests.Tests");
            var         entityType = metadata.AddEntityType("EntityType", null, null, false);

            metadata.AddResourceSet("Entities", entityType);
            metadata.AddKeyProperty(entityType, "ID", typeof(int));
            foreach (Type t in types)
            {
                metadata.AddCollectionProperty(entityType, "Collection" + t.Name, t);
            }

            return(new DSPServiceDefinition()
            {
                Metadata = metadata,
                Writable = true,
                CreateDataSource = (m) => new DSPContext()
            });
        }
コード例 #27
0
ファイル: SpatialTests.cs プロジェクト: marismore/odata.net
        private static void TestSpatialMetadata(DSPDataProviderKind providerKind)
        {
            DSPMetadata metadata = new DSPMetadata("SpatialMetadata", "AstoriaUnitTests.Tests");

            // Entity with all types of geography properties
            KeyValuePair <string, Type>[] geographyProperties = new KeyValuePair <string, Type>[] {
                new KeyValuePair <string, Type>("GeographyProperty", typeof(Geography)),
                new KeyValuePair <string, Type>("PointProperty", typeof(GeographyPoint)),
                new KeyValuePair <string, Type>("LineStringProperty", typeof(GeographyLineString)),
            };
            string entityTypeName = "AllGeographyTypes";

            SpatialTestUtil.AddEntityType(metadata, entityTypeName, geographyProperties, useComplexType: false, useOpenTypes: false);
            metadata.SetReadOnly();

            var service = new DSPUnitTestServiceDefinition(metadata, providerKind, new DSPContext());

            using (TestWebRequest request = service.CreateForInProcess())
            {
                request.StartService();

                request.HttpMethod = "GET";
                XDocument response = UnitTestsUtil.GetResponseAsAtomXLinq(request, "/$metadata");

                XElement   schemaElement = response.Root.Element(UnitTestsUtil.EdmxNamespace + "DataServices").Elements().Single(e => e.Name.LocalName == "Schema");
                XNamespace edmNs         = schemaElement.Name.Namespace;
                XElement   entityElement = schemaElement.Elements(edmNs + "EntityType").Single(e => (string)e.Attribute("Name") == entityTypeName);

                foreach (KeyValuePair <string, Type> property in geographyProperties)
                {
                    XElement propertyElement = entityElement.Elements(edmNs + "Property").Single(e => (string)e.Attribute("Name") == property.Key);

                    // EF provider currently represents all types as Edm.Geography in metadata (property is DbGeography on the entity), otherwise it should reflect the actual type
                    string expectedEdmTypeName = providerKind == DSPDataProviderKind.EF ? "Edm.Geography" : GetExpectedEdmTypeName(property.Value);

                    Assert.AreEqual(expectedEdmTypeName, propertyElement.Attribute("Type").Value, "Wrong property type for property {0},", property.Key);

                    XAttribute attribute = propertyElement.Attributes().Where(a => a.Name == "SRID").Single();
                    Assert.AreEqual("Variable", attribute.Value);
                }
            }
        }
コード例 #28
0
        public void TypesMustBeReadOnlyTest()
        {
            var typesToTest = new Func <DSPMetadata, ResourceType>[] {
                (metadata) => metadata.AddEntityType("EntityType", null, null, false),
                (metadata) => metadata.AddComplexType("ComplexType", null, null, false)
            };

            AstoriaTestNS.TestUtil.RunCombinations(
                typesToTest,
                (typeCreate) =>
            {
                var metadataProvider = new DSPMetadata("Test", "TestNS");
                var type             = typeCreate(metadataProvider);
                var wrapper          = new DataServiceMetadataProviderWrapper(metadataProvider);
                ExceptionUtils.ExpectedException <DataServiceException>(
                    () => wrapper.TryResolveResourceType(type.FullName),
                    "The resource type '" + type.FullName + "' returned by the provider is not read-only. Please make sure that all the types are set to read-only.",
                    "Resolving resource type to writable type should fail.");
            });
        }
コード例 #29
0
        public void EdmValidNamesNotAllowedInUri()
        {
            DSPMetadata metadata   = new DSPMetadata("Test", "TestNS");
            var         entityType = metadata.AddEntityType("MyType", null, null, false);

            metadata.AddKeyProperty(entityType, "ID", typeof(int));
            metadata.AddPrimitiveProperty(entityType, "Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ", typeof(string));
            var resourceSet = metadata.AddResourceSet("EntitySet", entityType);

            metadata.SetReadOnly();

            DSPServiceDefinition service = new DSPServiceDefinition()
            {
                Metadata = metadata,
                Writable = true
            };

            DSPContext data = new DSPContext();

            service.CreateDataSource = (m) => { return(data); };

            using (TestWebRequest request = service.CreateForInProcessWcf())
            {
                request.StartService();
                DataServiceContext context = new DataServiceContext(request.ServiceRoot);
                context.EnableAtom = true;
                context.Format.UseAtom();

                string value = "value of Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ";

                context.AddObject("EntitySet", new MyType()
                {
                    ID = 1,
                    Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ = value,
                });
                context.SaveChanges();
                var result = context.Execute <MyType>(new Uri("EntitySet?$orderby=Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ", UriKind.Relative)).First();
                Assert.AreEqual(value, result.Pròjè_x00A2_tÎð瑞갂థ్క_x0020_Iiلإَّ, "The roundtrip value not as expected");
            }
        }
コード例 #30
0
        public DSPContext CreateContext(DSPMetadata metadata)
        {
            if (cachedContext == null)
            {
                lock (this)
                {
                    var dspContext = new DSPContext();
                    using (MongoContext mongoContext = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString))
                    {
                        foreach (var resourceSet in metadata.ResourceSets)
                        {
                            var entities = dspContext.GetResourceSetEntities(resourceSet.Name);
                            foreach (var bsonDocument in mongoContext.Database.GetCollection(resourceSet.Name).FindAll())
                            {
                                var resource = CreateDSPResource(resourceSet.ResourceType, bsonDocument);
                                entities.Add(resource);
                            }
                        }
                    }

                    foreach (var reference in resourceReferences)
                    {
                        resourceMap[reference.Item1].SetValue(reference.Item2, resourceMap[reference.Item3]);
                    }

                    foreach (var reference in resourceSetReferences)
                    {
                        var referencedCollection = new List <DSPResource>();
                        resourceMap[reference.Item1].SetValue(reference.Item2, referencedCollection);
                        foreach (var objectId in reference.Item3)
                        {
                            referencedCollection.Add(resourceMap[objectId]);
                        }
                    }

                    cachedContext = dspContext;
                }
            }
            return(cachedContext);
        }