/// <inheritdoc/> protected override void SetBasicInfo(OpenApiOperation operation) { operation.Summary = "Invoke " + (EdmOperationImport.IsActionImport() ? "actionImport " : "functionImport ") + EdmOperationImport.Name; operation.Description = Context.Model.GetDescriptionAnnotation(EdmOperationImport); if (Context.Settings.EnableOperationId) { if (EdmOperationImport.IsActionImport()) { operation.OperationId = "ActionImport." + EdmOperationImport.Name; } else { if (Context.Model.IsOperationImportOverload(EdmOperationImport)) { operation.OperationId = "FunctionImport." + EdmOperationImport.Name + "-" + Path.LastSegment.GetPathHash(Context.Settings); } else { operation.OperationId = "FunctionImport." + EdmOperationImport.Name; } } } base.SetBasicInfo(operation); }
/// <inheritdoc/> protected override void SetBasicInfo(OpenApiOperation operation) { operation.Summary = "Invoke " + (EdmOperationImport.IsActionImport() ? "actionImport " : "functionImport ") + EdmOperationImport.Name; if (Context.Settings.EnableOperationId) { if (EdmOperationImport.IsActionImport()) { operation.OperationId = "ActionImport." + EdmOperationImport.Name; } else { ODataOperationImportSegment operationImportSegment = Path.LastSegment as ODataOperationImportSegment; string pathItemName = operationImportSegment.GetPathItemName(Context.Settings, new HashSet <string>()); if (Context.Model.IsOperationImportOverload(EdmOperationImport)) { string hash = pathItemName.GetHashSHA256(); operation.OperationId = "FunctionImport." + EdmOperationImport.Name + "-" + hash.Substring(0, 4); } else { operation.OperationId = "FunctionImport." + EdmOperationImport.Name; } } } base.SetBasicInfo(operation); }
/// <summary> /// Sets the expected function import for a top-level payload element. /// </summary> /// <param name="payloadElement">The payload element to set the expected function import for.</param> /// <param name="functionImport">The function import to set.</param> /// <returns>The <paramref name="payloadElement"/> after its expected function import was set.</returns> public static T ExpectedFunctionImport <T>( this T payloadElement, EdmOperationImport functionImport) where T : ODataPayloadElement { ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement"); ExpectedTypeODataPayloadElementAnnotation annotation = AddExpectedTypeAnnotation(payloadElement); annotation.ProductFunctionImport = functionImport; return(payloadElement); }
public void HeterogeneousCollectionReaderTest() { EdmModel model = new EdmModel(); var cityType = new EdmComplexType("TestModel", "CityType"); cityType.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(true)); model.AddElement(cityType); var addressType = new EdmComplexType("TestModel", "AddressType"); addressType.AddStructuralProperty("Street", EdmCoreModel.Instance.GetString(true)); model.AddElement(addressType); var testContainer = new EdmEntityContainer("TestModel", "TestContainer"); model.AddElement(testContainer); EdmFunction citiesFunction = new EdmFunction("TestModel", "Cities", EdmCoreModel.GetCollection(cityType.ToTypeReference())); model.AddElement(citiesFunction); EdmOperationImport citiesFunctionImport = testContainer.AddFunctionImport("Cities", citiesFunction); model.Fixup(); // Add some hand-crafted payloads IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new PayloadReaderTestDescriptor[] { // expected type without type names in the payload and heterogeneous items new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = new ComplexInstanceCollection( PayloadBuilder.ComplexValue().Property("Name", PayloadBuilder.PrimitiveValue("Vienna")), PayloadBuilder.ComplexValue().Property("Street", PayloadBuilder.PrimitiveValue("Am Euro Platz"))) .ExpectedFunctionImport(citiesFunctionImport) .CollectionName(null), PayloadEdmModel = model, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "Street", "TestModel.CityType"), }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.ExplicitFormatConfigurations, (testDescriptor, testConfiguration) => { testDescriptor.RunTest(testConfiguration); }); }
/// <summary> /// Builds a complex instance from the given payloadElements to represent a parameters payload. /// </summary> /// <param name="payloadElements">Each ODataPayloadElement represents the value for each parameter.</param> /// <param name="model">EdmModel instance.</param> /// <param name="functionImportName">Name of the function import to add to the model.</param> /// <returns></returns> private static ComplexInstance PayloadElementsToParameterPayload(ODataPayloadElement[] payloadElements, EdmModel model, string functionImportName) { EdmOperationImport operationImport = (EdmOperationImport)model.EntityContainer.FindOperationImports(functionImportName).FirstOrDefault(); EdmOperation operation = (EdmOperation)operationImport.Operation; var parameterPayload = new ComplexInstance(null, false); for (int idx = 0; idx < payloadElements.Length; idx++) { ODataPayloadElement p = payloadElements[idx]; string parameterName = "p" + idx; PropertyInstance parameter; IEdmTypeReference entityModelType = p.GetAnnotation <EntityModelTypeAnnotation>().EdmModelType; switch (p.ElementType) { case ODataPayloadElementType.PrimitiveValue: object clrValue = ((PrimitiveValue)p).ClrValue; PrimitiveValue primitiveValue = new PrimitiveValue(clrValue == null ? null : clrValue.GetType().FullName, clrValue); primitiveValue.CopyAnnotation <PrimitiveValue, EntityModelTypeAnnotation>(p); parameter = new PrimitiveProperty(parameterName, primitiveValue); operation.AddParameter(parameterName, MetadataUtils.GetPrimitiveTypeReference(primitiveValue.ClrValue.GetType())); break; case ODataPayloadElementType.ComplexInstance: parameter = new ComplexProperty(parameterName, (ComplexInstance)p); operation.AddParameter(parameterName, entityModelType); break; case ODataPayloadElementType.PrimitiveMultiValue: PrimitiveMultiValue primitiveMultiValue = (PrimitiveMultiValue)p; if (primitiveMultiValue.Annotations.OfType <JsonCollectionResultWrapperAnnotation>().SingleOrDefault() == null) { primitiveMultiValue.Annotations.Add(new JsonCollectionResultWrapperAnnotation(false)); } parameter = new PrimitiveMultiValueProperty(parameterName, primitiveMultiValue); operation.AddParameter(parameterName, entityModelType); break; case ODataPayloadElementType.ComplexMultiValue: ComplexMultiValue complexMultiValue = (ComplexMultiValue)p; if (complexMultiValue.Annotations.OfType <JsonCollectionResultWrapperAnnotation>().SingleOrDefault() == null) { complexMultiValue.Annotations.Add(new JsonCollectionResultWrapperAnnotation(false)); } parameter = new ComplexMultiValueProperty(parameterName, complexMultiValue); operation.AddParameter(parameterName, entityModelType); break; case ODataPayloadElementType.EntityInstance: parameter = new NavigationPropertyInstance(parameterName, (EntityInstance)p); operation.AddParameter(parameterName, entityModelType); break; case ODataPayloadElementType.EntitySetInstance: parameter = new NavigationPropertyInstance(parameterName, (EntitySetInstance)p); operation.AddParameter(parameterName, entityModelType); break; default: throw new NotSupportedException("PayloadElementsToParameterPayload() is called on unsupported ODataPayloadElement type: " + p.ElementType); } parameterPayload.Add(parameter); } parameterPayload.ExpectedFunctionImport(operationImport); return(parameterPayload); }
public void CollectionReaderTest() { IEdmModel model = Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEdmEntityContainer container = model.FindEntityContainer("DefaultContainer"); EdmOperationImport primitiveCollectionResultOperation = container.FindOperationImports("PrimitiveCollectionResultOperation").Single() as EdmOperationImport; var primitiveCollection = PayloadBuilder.PrimitiveCollection("PrimitiveCollectionResultOperation"); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(1)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(2)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(3)); IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive collection - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "null collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("null") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "PrimitiveValue") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive value for collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("42") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "PrimitiveValue") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Array value for collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("[]") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "StartArray") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Extra property before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"extra\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_InvalidTopLevelPropertyName", "extra", "value") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Extra property after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"extra\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom instance annotation before collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"@my.extra\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom instance annotation after collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"@my.extra\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "OData instance annotations before collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + "\":3," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataNextLinkAnnotationName + "\":\"http://next-link\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "OData instance annotations after collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataNextLinkAnnotationName + "\":\"http://next-link\"," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + "\":3}") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation before collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"[email protected]\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'value' after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"[email protected]\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "value") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'extra' before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"[email protected]\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_TopLevelPropertyAnnotationWithoutProperty", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'extra' after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"[email protected]\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid collection property name - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"invalid\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_InvalidTopLevelPropertyName", "invalid", JsonLightConstants.ODataValuePropertyName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Missing collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\" }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_ExpectedCollectionPropertyNotFound", JsonLightConstants.ODataValuePropertyName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid collection property value - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":{} }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionContentStart", "StartObject") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataEditLinkAnnotationName + "\":null, " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_UnexpectedAnnotationProperties", JsonLightConstants.ODataEditLinkAnnotationName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[], " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataEditLinkAnnotationName + "\":null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", JsonLightConstants.ODataEditLinkAnnotationName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[], " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataEditLinkAnnotationName + "\":null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", JsonLightConstants.ODataEditLinkAnnotationName) }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations, (testDescriptor, testConfiguration) => { // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
public void CollectionWithODataTypeReaderTest() { IEdmModel model = Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEdmEntityContainer container = model.FindEntityContainer("DefaultContainer"); EdmOperationImport primitiveCollectionResultOperation = container.FindOperationImports("PrimitiveCollectionResultOperation").Single() as EdmOperationImport; EdmOperationImport complexCollectionResultOperation = container.FindOperationImports("ComplexCollectionResultOperation").Single() as EdmOperationImport; var primitiveCollection = PayloadBuilder.PrimitiveCollection("PrimitiveCollectionResultOperation"); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(1)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(2)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(3)); var complexCollection = PayloadBuilder.ComplexCollection("ComplexCollectionResultOperation"); var complexValue1 = PayloadBuilder.ComplexValue("TestModel.Address") .PrimitiveProperty("Street", "Am Euro Platz") .AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null }); complexCollection.Add(complexValue1); // NOTE: tests to cover consistency between the expected function import and the function import // in the payload exist in the ContextUriValidationJsonLightTests. IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Non-collection type specified in odata.type - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"TestModel.Address\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_InvalidCollectionTypeName", "TestModel.Address"), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type consistent - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Context URI (primitive collection) and odata.type consistent - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Single)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncompatibleType", "Edm.Single", "Edm.Int32") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent (2) - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(complexCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Edm.Int32", "Complex", "Primitive") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected complex item type and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.OfficeType)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}") .ExpectedFunctionImport(complexCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.OfficeType", "Complex", "Entity") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent (2) - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.Address)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.Address", "Primitive", "Complex") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Complex item type in context URI and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.OfficeType)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}"), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.OfficeType", "Complex", "Entity") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive item type in context URI and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.Address)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}"), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.Address", "Primitive", "Complex") }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations, (testDescriptor, testConfiguration) => { // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
public void ParameterReaderJsonLightTest() { EdmModel model = new EdmModel(); model.Fixup(); EdmEntityContainer container = model.EntityContainer as EdmEntityContainer; EdmFunction function = new EdmFunction(container.Namespace, "f1", EdmCoreModel.Instance.GetInt32(true)); function.AddParameter("p1", EdmCoreModel.Instance.GetInt32(false) as EdmTypeReference); function.AddParameter("p2", EdmCoreModel.Instance.GetString(false) as EdmTypeReference); model.AddElement(function); EdmOperationImport f1 = container.FunctionImport(function); ComplexInstance f1Params = PayloadBuilder.ComplexValue().PrimitiveProperty("p1", 42).PrimitiveProperty("p2", "Vienna") .ExpectedFunctionImport(f1); var testCases = new[] { new { DebugDescription = "Custom property annotation for a valid parameter property (before property) - should work.", Json = "{\"" + JsonLightUtils.GetPropertyAnnotationName("p1", "my.custom") + "\":42, \"p1\":42, \"p2\":\"Vienna\"}", ExpectedException = (ExpectedException)null, }, new { DebugDescription = "Custom property annotation for a valid parameter property (after property) - should fail.", Json = "{\"p1\":42, \"" + JsonLightUtils.GetPropertyAnnotationName("p1", "my.custom") + "\":42, \"p2\":\"Vienna\"}", ExpectedException = ODataExpectedExceptions.ODataException("DuplicatePropertyNamesChecker_PropertyAnnotationAfterTheProperty", "my.custom", "p1"), }, new { DebugDescription = "OData property annotation for a valid parameter property (before property) - should work.", Json = "{\"" + JsonLightUtils.GetPropertyAnnotationName("p1", JsonLightConstants.ODataTypeAnnotationName) + "\":42, \"p1\":42, \"p2\":\"Vienna\"}", ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightParameterDeserializer_PropertyAnnotationForParameters"), }, new { DebugDescription = "OData property annotation for a valid parameter property (after property) - should fail.", Json = "{\"p1\":42, \"" + JsonLightUtils.GetPropertyAnnotationName("p1", JsonLightConstants.ODataTypeAnnotationName) + "\":42, \"p2\":\"Vienna\"}", ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightParameterDeserializer_PropertyAnnotationForParameters"), }, new { DebugDescription = "Custom property annotation for an invalid parameter property - should fail.", Json = "{\"" + JsonLightUtils.GetPropertyAnnotationName("p0", "my.custom") + "\":42, \"p1\":42, \"p2\":\"Vienna\"}", ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightParameterDeserializer_PropertyAnnotationWithoutPropertyForParameters", "p0"), }, new { DebugDescription = "Custom instance annotation - should work.", Json = "{\"@my.custom\":42, \"p1\":42, \"p2\":\"Vienna\"}", ExpectedException = (ExpectedException)null, }, new { DebugDescription = "OData instance annotation - should fail.", Json = "{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + "\":\"Edm.Int32\", \"p1\":42, \"p2\":\"Vienna\"}", ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_UnexpectedAnnotationProperties", JsonLightConstants.ODataTypeAnnotationName), }, }; var testDescriptors = testCases.Select(testCase => new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = testCase.DebugDescription, PayloadElement = f1Params.DeepCopy().JsonRepresentation(testCase.Json), PayloadEdmModel = model, PayloadKind = ODataPayloadKind.Parameter, ExpectedException = testCase.ExpectedException, }); this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations.Where(c => c.IsRequest), (testDescriptor, testConfiguration) => { testDescriptor.ExpectedResultNormalizers.Add(tc => ParameterReaderTests.FixupExpectedCollectionParameterPayloadElement); // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
private void FillStockContentsForEntityContainer(IEdmEntityContainer edmContainer, IEdmModel edmModel, EdmModel stockModel) { var stockContainer = (EdmEntityContainer)stockModel.FindEntityContainer(edmContainer.FullName()); this.SetImmediateAnnotations(edmContainer, stockContainer, edmModel, stockModel); foreach (var edmNavigationSource in edmContainer.Elements.OfType <IEdmNavigationSource>()) { var stockEntityType = (EdmEntityType)stockModel.FindType(GetFullName(edmNavigationSource.EntityType())); if (edmNavigationSource is IEdmSingleton) { stockContainer.AddSingleton(edmNavigationSource.Name, stockEntityType); } else { stockContainer.AddEntitySet(edmNavigationSource.Name, stockEntityType); } } foreach (var stockNavigationSource in stockContainer.Elements.OfType <EdmNavigationSource>()) { var stockEntityType = (EdmEntityType)stockModel.FindType(GetFullName(stockNavigationSource.EntityType())); IEdmNavigationSource edmNavigationSource = edmContainer.FindEntitySet(stockNavigationSource.Name); if (edmNavigationSource == null) { edmNavigationSource = edmContainer.FindSingleton(stockNavigationSource.Name); } var stockDerivedNavigations = GetAllNavigationFromDerivedTypesAndSelf(stockEntityType, stockModel); foreach (var stockNavigationProperty in stockDerivedNavigations) { var edmNavigationProperty = edmNavigationSource.NavigationPropertyBindings.Select(n => n.NavigationProperty).SingleOrDefault(n => n.Name == stockNavigationProperty.Name); if (edmNavigationProperty != null) { var targetEdmEntitySet = edmNavigationSource.FindNavigationTarget(edmNavigationProperty); if (null != targetEdmEntitySet) { var targetEntitySetFromContainer = stockContainer.Elements.OfType <EdmEntitySet>().SingleOrDefault ( n => GetBaseTypesAndSelf(((IEdmNavigationProperty)stockNavigationProperty).ToEntityType()).Select(m => GetFullName(m)).Contains(n.EntityType().FullName()) && n.Name == targetEdmEntitySet.Name ); if (null == targetEntitySetFromContainer) { targetEntitySetFromContainer = stockContainer.Elements.OfType <EdmEntitySet>().SingleOrDefault ( n => GetAllDerivedTypesAndSelf(((IEdmNavigationProperty)stockNavigationProperty).ToEntityType(), stockModel).Select(m => GetFullName(m)).Contains(n.EntityType().FullName()) && n.Name == targetEdmEntitySet.Name ); } stockNavigationSource.AddNavigationTarget(stockNavigationProperty, targetEntitySetFromContainer); } } } } foreach (var edmOperationImport in edmContainer.OperationImports()) { EdmOperationImport stockEdmOperationImport = null; var edmActionImport = edmOperationImport as IEdmActionImport; if (edmActionImport != null) { var newEdmAction = stockModel.FindDeclaredOperations(edmActionImport.Action.FullName()).OfType <IEdmAction>().FirstOrDefault() as EdmAction; ExceptionUtilities.CheckObjectNotNull(newEdmAction, "cannot find action"); stockEdmOperationImport = stockContainer.AddActionImport(edmOperationImport.Name, newEdmAction, edmActionImport.EntitySet); } else { IEdmFunctionImport edmFunctionImport = edmOperationImport as IEdmFunctionImport; ExceptionUtilities.CheckArgumentNotNull(edmFunctionImport, "edmFunctionImport"); var newEdmFunction = edmModel.FindDeclaredOperations(edmFunctionImport.Function.FullName()).OfType <IEdmFunction>().FirstOrDefault(); ExceptionUtilities.CheckObjectNotNull(newEdmFunction, "Expected to find an function: " + edmFunctionImport.Function.FullName()); stockEdmOperationImport = stockContainer.AddFunctionImport(edmFunctionImport.Name, newEdmFunction, edmFunctionImport.EntitySet, edmFunctionImport.IncludeInServiceDocument); } this.SetImmediateAnnotations(edmOperationImport, stockEdmOperationImport, edmModel, stockModel); } }