public void TestDomainService_UpdateMemberToDefaultValue() { TestDomainServices.EF.Catalog service = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.EF.Catalog>(DomainOperationType.Submit); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(service.GetType()); // in the below, non RTO is simulated by leaving ReorderPoint as its default value in the // original instance AdventureWorksModel.Product currProduct = new AdventureWorksModel.Product { ProductID = 1, ReorderPoint = 0, Weight = 0 }; AdventureWorksModel.Product origProduct = new AdventureWorksModel.Product { ProductID = 1, Weight = 50.0M }; // verify expected test state - this test relies on the below attribute values PropertyDescriptor pd = TypeDescriptor.GetProperties(typeof(AdventureWorksModel.Product))["ReorderPoint"]; Assert.IsNull(pd.Attributes[typeof(RoundtripOriginalAttribute)]); pd = TypeDescriptor.GetProperties(typeof(AdventureWorksModel.Product))["Weight"]; Assert.IsNotNull(pd.Attributes[typeof(RoundtripOriginalAttribute)]); pd = TypeDescriptor.GetProperties(typeof(AdventureWorksModel.Product))["SafetyStockLevel"]; Assert.IsNotNull(pd.Attributes[typeof(ExcludeAttribute)]); ObjectContextExtensions.AttachAsModified(service.ObjectContext.Products, currProduct, origProduct); // verify the expected property modifications ObjectStateEntry stateEntry = service.ObjectContext.ObjectStateManager.GetObjectStateEntry(currProduct); string[] modifiedProperties = stateEntry.GetModifiedProperties().ToArray(); Assert.IsTrue(modifiedProperties.Contains("ReorderPoint")); // no RTO so this should be modified Assert.IsTrue(modifiedProperties.Contains("Weight")); // RTO so this is picked up by normal value comparison Assert.IsFalse(modifiedProperties.Contains("SafetyStockLevel")); // excluded member, so shouldn't be marked modified Assert.IsFalse(modifiedProperties.Contains("ProductID")); // key members shouldn't be marked modified }
public void ServerValidation_Query() { TestDomainServices.TestProvider_Scenarios service = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.TestProvider_Scenarios>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(service.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.Single(p => p.Name == "QueryWithParamValidation"); QueryDescription qd = new QueryDescription(method, new object[] { -1, "ABC" }); int totalCount; IEnumerable <ValidationResult> validationErrors; service.Query(qd, out validationErrors, out totalCount); Assert.IsNotNull(validationErrors); Assert.AreEqual(2, validationErrors.Count()); ValidationResult error = validationErrors.ElementAt(0); Assert.AreEqual("The field a must be between 0 and 10.", error.ErrorMessage); Assert.AreEqual("a", error.MemberNames.Single()); error = validationErrors.ElementAt(1); Assert.AreEqual("The field b must be a string with a maximum length of 2.", error.ErrorMessage); Assert.AreEqual("b", error.MemberNames.Single()); }
public async Task DomainService_CallSubmitDirectly() { DomainServiceDescription description = DomainServiceDescription.GetDescription(typeof(DomainMethod_ValidProvider_MultipleMethods)); List <ChangeSetEntry> changeSetEntries = new List <ChangeSetEntry>(); ChangeSetEntry processCityOperation = new ChangeSetEntry(); processCityOperation.Entity = new City { Name = "Redmond", CountyName = "King", StateName = "WA" }; processCityOperation.DomainOperationEntry = description.GetCustomMethod(typeof(City), "ProcessCity"); processCityOperation.Operation = DomainOperation.Update; processCityOperation.EntityActions = new EntityActionCollection { { "ProcessCity", new object[] { new byte[] { byte.MaxValue, byte.MinValue, 123 } } } }; changeSetEntries.Add(processCityOperation); ChangeSet changeset = new ChangeSet(changeSetEntries); DomainMethod_ValidProvider_MultipleMethods myTestProvider = ServerTestHelper.CreateInitializedDomainService <DomainMethod_ValidProvider_MultipleMethods>(DomainOperationType.Submit); await myTestProvider.SubmitAsync(changeset, CancellationToken.None); // check that the domain services have invoked the domain method correctly by checking the internal variables set Assert.AreEqual <string>("ProcessCity_", myTestProvider.Invoked); Assert.AreEqual <int>(3, myTestProvider.InputData.Length); Assert.AreEqual <byte>(123, myTestProvider.InputData[2]); }
public async Task InvokeOperation_ServerValidationException() { TestProvider_Scenarios provider = ServerTestHelper.CreateInitializedDomainService <TestProvider_Scenarios>(DomainOperationType.Invoke); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(typeof(TestProvider_Scenarios)); DomainOperationEntry throwValidationExceptionMethod = serviceDescription.GetInvokeOperation("ThrowValidationException"); Assert.IsNotNull(throwValidationExceptionMethod); var invokeResult = await provider.InvokeAsync(new InvokeDescription(throwValidationExceptionMethod, Array.Empty <object>()), CancellationToken.None); Assert.IsNull(invokeResult.Result); Assert.IsNotNull(invokeResult.ValidationErrors); Assert.AreEqual(1, invokeResult.ValidationErrors.Count); Assert.AreEqual("Validation error.", invokeResult.ValidationErrors.ElementAt(0).ErrorMessage); }
public void InvokeOperation_ServerValidationException() { TestProvider_Scenarios provider = ServerTestHelper.CreateInitializedDomainService <TestProvider_Scenarios>(DomainOperationType.Invoke); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(typeof(TestProvider_Scenarios)); DomainOperationEntry throwValidationExceptionMethod = serviceDescription.GetInvokeOperation("ThrowValidationException"); Assert.IsNotNull(throwValidationExceptionMethod); IEnumerable <ValidationResult> validationErrors; object result = provider.Invoke(new InvokeDescription(throwValidationExceptionMethod, new object[0]), out validationErrors); Assert.IsNull(result); Assert.IsNotNull(validationErrors); Assert.AreEqual(1, validationErrors.Count()); Assert.AreEqual("Validation error.", validationErrors.ElementAt(0).ErrorMessage); }
public async Task TestDomainService_QueryDirect_Throws() { MockDomainService_SelectThrows provider = ServerTestHelper.CreateInitializedDomainService <MockDomainService_SelectThrows>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(provider.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.First(p => p.Name == "GetEntities" && p.Operation == DomainOperation.Query); QueryDescription qd = new QueryDescription(method, Array.Empty <object>()); await ExceptionHelper.ExpectExceptionAsync <Exception>(async() => { try { await provider.QueryAsync <TestEntity>(qd, CancellationToken.None); } catch (TargetInvocationException ex) { throw ex.InnerException; } }, "Test"); }
public async Task InvokeOperation_ServerValidationError() { TestProvider_Scenarios provider = ServerTestHelper.CreateInitializedDomainService <TestProvider_Scenarios>(DomainOperationType.Invoke); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(typeof(TestProvider_Scenarios)); DomainOperationEntry incrementBid1ForAByMethod = serviceDescription.GetInvokeOperation("IncrementBid1ForABy"); Assert.IsNotNull(incrementBid1ForAByMethod); TestDomainServices.A inputA = new TestDomainServices.A() { BID1 = 1 }; var invokeResult = await provider.InvokeAsync(new InvokeDescription(incrementBid1ForAByMethod, new object[] { inputA, 2 }), CancellationToken.None); Assert.IsNull(invokeResult.Result); Assert.IsNotNull(invokeResult.ValidationErrors); Assert.AreEqual(2, invokeResult.ValidationErrors.Count); Assert.AreEqual("The field delta must be between 5 and 10.", invokeResult.ValidationErrors.ElementAt(0).ErrorMessage); Assert.AreEqual("The RequiredString field is required.", invokeResult.ValidationErrors.ElementAt(1).ErrorMessage); }
public async Task TestDomainService_QueryDirect() { TestDomainServices.LTS.Catalog provider = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.LTS.Catalog>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(provider.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.Where(p => p.Operation == DomainOperation.Query).First(p => p.Name == "GetProductsByCategory"); QueryDescription qd = new QueryDescription(method, new object[] { 1 }); var queryResult = await provider.QueryAsync <DataTests.AdventureWorks.LTS.Product>(qd, CancellationToken.None); int count = queryResult.Result.Cast <DataTests.AdventureWorks.LTS.Product>().Count(); Assert.AreEqual(32, count); // verify that we can use the same provider to execute another query qd = new QueryDescription(method, new object[] { 2 }); queryResult = await provider.QueryAsync <DataTests.AdventureWorks.LTS.Product>(qd, CancellationToken.None); count = queryResult.Result.Cast <DataTests.AdventureWorks.LTS.Product>().Count(); Assert.AreEqual(43, count); }
public async Task ServerValidation_InvokeOperation() { TestDomainServices.TestProvider_Scenarios service = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.TestProvider_Scenarios>(DomainOperationType.Invoke); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(service.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.Single(p => p.Name == "InvokeOperationWithParamValidation"); InvokeDescription invokeDescription = new InvokeDescription(method, new object[] { -3, "ABC", new TestDomainServices.CityWithCacheData() }); var invokeResult = await service.InvokeAsync(invokeDescription, CancellationToken.None); Assert.IsNotNull(invokeResult.ValidationErrors); Assert.AreEqual(2, invokeResult.ValidationErrors.Count()); ValidationResult error = invokeResult.ValidationErrors.ElementAt(0); Assert.AreEqual("The field a must be between 0 and 10.", error.ErrorMessage); Assert.AreEqual("a", error.MemberNames.Single()); error = invokeResult.ValidationErrors.ElementAt(1); Assert.AreEqual("The field b must be a string with a maximum length of 2.", error.ErrorMessage); Assert.AreEqual("b", error.MemberNames.Single()); }
public void TestDomainService_QueryDirect() { TestDomainServices.LTS.Catalog provider = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.LTS.Catalog>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(provider.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.Where(p => p.Operation == DomainOperation.Query).First(p => p.Name == "GetProductsByCategory"); QueryDescription qd = new QueryDescription(method, new object[] { 1 }); int totalCount; IEnumerable <ValidationResult> validationErrors; IEnumerable result = provider.Query(qd, out validationErrors, out totalCount); int count = result.Cast <DataTests.AdventureWorks.LTS.Product>().Count(); Assert.AreEqual(32, count); // verify that we can use the same provider to execute another query qd = new QueryDescription(method, new object[] { 2 }); result = provider.Query(qd, out validationErrors, out totalCount); count = result.Cast <DataTests.AdventureWorks.LTS.Product>().Count(); Assert.AreEqual(43, count); }
public void DomainService_CallSubmitWithMultipleInvocations() { DomainServiceDescription description = DomainServiceDescription.GetDescription(typeof(DomainMethod_ValidProvider_MultipleMethods)); List <ChangeSetEntry> changeSetEntries = new List <ChangeSetEntry>(); ChangeSetEntry processCountyOperation = new ChangeSetEntry(); processCountyOperation.Id = 1; processCountyOperation.Entity = new County { Name = "King", StateName = "WA" }; processCountyOperation.DomainOperationEntry = description.GetCustomMethod(typeof(County), "ProcessCounty"); processCountyOperation.Operation = DomainOperation.Update; processCountyOperation.EntityActions = new EntityActionCollection { { "ProcessCounty", null } }; changeSetEntries.Add(processCountyOperation); ChangeSetEntry processCityOperation = new ChangeSetEntry(); processCityOperation.Id = 2; processCityOperation.Entity = new City { Name = "Redmond", CountyName = "King", StateName = "WA" }; processCityOperation.DomainOperationEntry = description.GetCustomMethod(typeof(City), "ProcessCity"); processCityOperation.Operation = DomainOperation.Update; processCityOperation.EntityActions = new EntityActionCollection { { "ProcessCity", new object[] { new byte[] { 123, 1 } } } }; changeSetEntries.Add(processCityOperation); ChangeSet changeset = new ChangeSet(changeSetEntries); DomainMethod_ValidProvider_MultipleMethods myTestProvider = ServerTestHelper.CreateInitializedDomainService <DomainMethod_ValidProvider_MultipleMethods>(DomainOperationType.Submit); myTestProvider.Submit(changeset); // check that the domain services have invoked the domain method correctly by checking the internal variables set Assert.AreEqual <string>("ProcessCounty_ProcessCity_", myTestProvider.Invoked); Assert.AreEqual <int>(2, myTestProvider.InputData.Length); }
public async Task ServerValidation_Query() { TestDomainServices.TestProvider_Scenarios service = ServerTestHelper.CreateInitializedDomainService <TestDomainServices.TestProvider_Scenarios>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(service.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.Single(p => p.Name == "QueryWithParamValidation"); QueryDescription qd = new QueryDescription(method, new object[] { -1, "ABC" }); var queryResult = await service.QueryAsync <TestDomainServices.A>(qd, CancellationToken.None); Assert.IsNotNull(queryResult.ValidationErrors); Assert.AreEqual(2, queryResult.ValidationErrors.Count()); ValidationResult error = queryResult.ValidationErrors.ElementAt(0); Assert.AreEqual("The field a must be between 0 and 10.", error.ErrorMessage); Assert.AreEqual("a", error.MemberNames.Single()); error = queryResult.ValidationErrors.ElementAt(1); Assert.AreEqual("The field b must be a string with a maximum length of 2.", error.ErrorMessage); Assert.AreEqual("b", error.MemberNames.Single()); }
public void TestDomainService_QueryDirect_Throws() { MockDomainService_SelectThrows provider = ServerTestHelper.CreateInitializedDomainService <MockDomainService_SelectThrows>(DomainOperationType.Query); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(provider.GetType()); DomainOperationEntry method = serviceDescription.DomainOperationEntries.First(p => p.Name == "GetEntities" && p.Operation == DomainOperation.Query); QueryDescription qd = new QueryDescription(method, new object[0]); int totalCount; IEnumerable <ValidationResult> validationErrors; ExceptionHelper.ExpectException <Exception>(delegate { try { provider.Query(qd, out validationErrors, out totalCount); } catch (TargetInvocationException ex) { throw ex.InnerException; } }, "Test"); }
public void InvokeOperation_ServerValidationError() { TestProvider_Scenarios provider = ServerTestHelper.CreateInitializedDomainService <TestProvider_Scenarios>(DomainOperationType.Invoke); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(typeof(TestProvider_Scenarios)); DomainOperationEntry incrementBid1ForAByMethod = serviceDescription.GetInvokeOperation("IncrementBid1ForABy"); Assert.IsNotNull(incrementBid1ForAByMethod); IEnumerable <ValidationResult> validationErrors; TestDomainServices.A inputA = new TestDomainServices.A() { BID1 = 1 }; object result = provider.Invoke(new InvokeDescription(incrementBid1ForAByMethod, new object[] { inputA, 2 }), out validationErrors); Assert.IsNull(result); Assert.IsNotNull(validationErrors); Assert.AreEqual(2, validationErrors.Count()); Assert.AreEqual("The field delta must be between 5 and 10.", validationErrors.ElementAt(0).ErrorMessage); Assert.AreEqual("The RequiredString field is required.", validationErrors.ElementAt(1).ErrorMessage); }