public async Task QuerySchedules_ToQueryString_ResourceId_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); // Create var crmRequest = new QueryScheduleRequest() { ResourceId = SetupBase.EntityId }; await crmClient.ExecuteAsync(crmRequest); // Test var value = QueryHelpers.ParseQuery(requestUri.Query).GetValueOrDefault("@ResourceId").ToString(); value.Should().NotBeNullOrEmpty(); value.Should().Be($"{SetupBase.EntityId}"); }
public async Task Search_When_Direction_Present_Then_Query_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var crmRequest = new SearchRequest() { AppointmentRequest = new AppointmentRequest { SearchWindowStart = new DateTime(2020, 09, 19, 9, 0, 0, DateTimeKind.Utc), Direction = SearchDirection.Forward } }; await crmClient.ExecuteAsync(crmRequest); var value = QueryHelpers.ParseQuery(requestUri.Query).GetValueOrDefault("@AppointmentRequest").ToString(); value.Should().NotBeNullOrEmpty(); value.Should() .Be( "{\"ServiceId\":\"00000000-0000-0000-0000-000000000000\",\"SearchWindowStart\":\"2020-09-19T09:00:00Z\",\"Direction\":\"Forward\",\"NumberOfResults\":1}" ); }
public async Task UpdateEntity_When_Set_DateOnly_Property_Then_Request_Is_Valid() { const string expectedRequestContent = @"{""@odata.type"":""Microsoft.Dynamics.CRM.contact"",""birthdate"":""2020-09-15"",""contactid"":""00000000-0000-0000-0000-000000000001""}"; var httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId) { ["birthdate"] = new DateTime(2020, 09, 15) }; await crmClient.UpdateAsync(entity); httpRequestContent.Should().Be(expectedRequestContent); }
public async Task QuerySchedules_ToQueryString_When_One_TimeCodes_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var crmRequest = new QueryScheduleRequest() { TimeCodes = new[] { TimeCode.Filter } }; await crmClient.ExecuteAsync(crmRequest); // Test var value = QueryHelpers.ParseQuery(requestUri.Query).GetValueOrDefault("@TimeCodes").ToString(); value.Should().NotBeNullOrEmpty(); value.Should().Be($"[\"{(int) TimeCode.Filter}\"]"); }
public async Task UpdateEntity_When_Set_Lookup_Property_Then_Request_Is_Valid() { const string expectedRequestContent = "{\"[email protected]\":\"systemusers(00000000-0000-0000-0000-000000000001)\",\"contactid\":\"00000000-0000-0000-0000-000000000001\"}"; var httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId) { ["ownerid"] = new EntityReference("systemuser", SetupBase.EntityId) }; await crmClient.UpdateAsync(entity); httpRequestContent.Should().Be(expectedRequestContent); }
public async Task RetrievePrincipalAccessRequest_Query_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var principal = new EntityReference("systemuser", Guid.NewGuid()); var accountRef = new EntityReference("account", Guid.NewGuid()); var crmRequest = new RetrievePrincipalAccessRequest(principal, accountRef); await crmClient.ExecuteAsync(crmRequest); var queryParams = QueryHelpers.ParseQuery(requestUri.Query); queryParams.ContainsKey($"@{nameof(crmRequest.Target)}").Should() .BeTrue(); queryParams[$"@{nameof(crmRequest.Target)}"].ToString().Should() .Be($"{{\"@odata.id\":\"accounts({accountRef.Id})\"}}"); }
public async Task QuerySchedules_ToQueryString_Start_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var crmRequest = new QueryScheduleRequest() { Start = new DateTime(2019, 02, 25, 0, 0, 0, DateTimeKind.Utc), }; await crmClient.ExecuteAsync(crmRequest); var value = QueryHelpers.ParseQuery(requestUri.Query) .GetValueOrDefault("@Start").ToString(); value.Should().NotBeNullOrEmpty(); value.Should().Be(crmRequest.Start.ToString("yyyy-MM-ddTHH:mm:ssZ")); }
public async Task UpdateEntity_When_Set_DateTime_Property_As_LocalKind_Then_Request_Is_Valid() { var localDateTime = new DateTime(2020, 09, 15, 0, 0, 0, DateTimeKind.Local); var expectedRequestContent = $"{{\"modifiedon\":\"{localDateTime.ToUniversalTime():yyyy-MM-ddTHH:mm:ssZ}\",\"contactid\":\"00000000-0000-0000-0000-000000000001\"}}"; var httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId) { ["modifiedon"] = localDateTime }; await crmClient.UpdateAsync(entity); httpRequestContent.Should().Be(expectedRequestContent); }
public async Task UpdateEntity_When_Set_String_Property_Then_Request_Is_Valid() { string expectedRequestContent = "{\"firstname\":\"[TEST]\",\"contactid\":\"00000000-0000-0000-0000-000000000001\"}"; string httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId); entity["firstname"] = "[TEST]"; // Execute await crmClient.UpdateAsync(entity); // Validate httpRequestContent.Should().Be(expectedRequestContent); }
public async void WhenNotWebApiAction_And_NotRequestBindingPath_ThenUrlValid() { Uri requestUri = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); const string accessType = "Default"; string msDynamicsAccessTypeValue = $"Microsoft.Dynamics.CRM.EndpointAccessType'{accessType}'"; var orgRequest = new OrganizationRequest <JObject>("RetrieveCurrentOrganization"); orgRequest.Parameters.Add("AccessType", msDynamicsAccessTypeValue); var crmClient = FakeCrmWebApiClient.Create(httpClient); await crmClient.ExecuteAsync(orgRequest); var lastPathSegment = requestUri.Segments[^ 1];
public async Task GetAllTimeZonesWithDisplayName_Deserialize_Correct() { const string jsonContent = @" { ""value"": [ { ""timezonecode"": 0, ""timezonedefinitionid"": ""30343341-5cdc-4def-a8ac-7d76187548d2"", ""versionnumber"": 743832113, ""userinterfacename"":""(GMT-12:00) International Date Line West"", ""bias"": 720 }, { ""timezonecode"": 1, ""timezonedefinitionid"": ""a6d443d7-e9a0-406e-86a2-853d65d17098"", ""versionnumber"": 743832117, ""userinterfacename"": ""(GMT+13:00) Samoa"", ""bias"": -780 }, { ""timezonecode"": 2, ""timezonedefinitionid"": ""fa16509c-06a9-4ef1-8cb1-883f812f74e1"", ""versionnumber"": 743832127, ""userinterfacename"": ""(GMT-10:00) Hawaii"", ""bias"": 600 } ] }"; var apiResponse = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json") }; var httpClient = new HttpClient(new MockedHttpMessageHandler(apiResponse)); var crmClient = FakeCrmWebApiClient.Create(httpClient); var apiRequest = new GetAllTimeZonesWithDisplayNameRequest(localeId: 1033); var result = await crmClient.ExecuteAsync(apiRequest); result.Entities.Should().HaveCount(3); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 0).Should().NotBeNull(); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 1).Should().NotBeNull(); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 2).Should().NotBeNull(); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 2) .GetAttributeValue <double>("bias") .Should().Be(600); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 2) .GetAttributeValue <string>("userinterfacename") .Should().Be("(GMT-10:00) Hawaii"); result.Entities.First(x => x.GetAttributeValue <int>("timezonecode") == 2) .GetAttributeValue <Guid>("timezonedefinitionid") .Should() .Be(Guid.Parse("fa16509c-06a9-4ef1-8cb1-883f812f74e1")); }
public async Task CreateAsync_Then_EntityId_Parsed_From_Response_Headers() { var apiResponse = new HttpResponseMessage(HttpStatusCode.NoContent); apiResponse.Headers.Add( "OData-EntityId", $"https://{SetupBase.D365CeHttpClientBaseAddress}/accounts({SetupBase.EntityId})"); var httpClient = new HttpClient(new MockedHttpMessageHandler(apiResponse)); var client = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("account"); var result = await client.CreateAsync(entity); result.Should().NotBeEmpty(); result.Should().Be(SetupBase.EntityId); }
public async Task GetAllTimeZonesWithDisplayName_When_LocaleId_Present_Query_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmRequest = new GetAllTimeZonesWithDisplayNameRequest(1033); var crmClient = FakeCrmWebApiClient.Create(httpClient); await crmClient.ExecuteAsync(crmRequest); // ^2 index from end requestUri.Segments[^ 2].Should().Be("timezonedefinitions/");
public async Task DisassociateAsync_Always_EntityTagHeaderValueIsNull() { EntityTagHeaderValue httpRequestHeader = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { httpRequestHeader = request.Headers.IfMatch.FirstOrDefault(); return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var contactRef = new EntityReference("contact", SetupBase.EntityId); await crmClient.DisassociateAsync(contactRef, "customerid"); httpRequestHeader.Should().Be(default);
public async Task DisassociateAsync_Always_RequestHaveHttpMethodIsDelete() { HttpMethod httpRequestMethod = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { httpRequestMethod = request.Method; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var contactRef = new EntityReference("contact", SetupBase.EntityId); await crmClient.DisassociateAsync(contactRef, "customerid"); httpRequestMethod.Should().Be(HttpMethod.Delete); }
public async Task UpdateEntity_When_RowVersion_NotPresent_And_AllowUpsert_IsTrue_Then_IfMathHeader_Is_Empty() { HttpRequestHeaders httpRequestHeaders = default; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestHeaders = request.Headers; return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("account"); await crmClient.UpdateAsync(entity, allowUpsert : true); httpRequestHeaders.IfMatch.Count.Should().Be(0); }
public async Task WhoAmI_Query_IsCorrect() { Uri requestUri = null; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { requestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var crmRequest = new WhoAmIRequest(); await crmClient.ExecuteAsync(crmRequest); var value = requestUri.Segments.Last(); value.Should().NotBeNullOrEmpty(); value.Should().Be("WhoAmI()"); }
public async Task UpdateEntity_When_RowVersion_NotPresent_Then_Upsert_Is_Disabled() { HttpRequestHeaders httpRequestHeaders = default; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestHeaders = request.Headers; return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("account"); await crmClient.UpdateAsync(entity); httpRequestHeaders.IfMatch.Count.Should().BeGreaterOrEqualTo(1); httpRequestHeaders.IfMatch.ElementAt(0).IsWeak.Should().BeFalse(); httpRequestHeaders.IfMatch.ElementAt(0).Tag.Should().Be("*"); }
public async Task UpdateEntity_Request_Have_HttpMethod_Is_PATCH() { HttpMethod httpRequestMethod = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { httpRequestMethod = request.Method; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId) { ["firstname"] = "[TEST]" }; await crmClient.UpdateAsync(entity); httpRequestMethod.Should().Be(HttpMethod.Patch); }
public async Task UpdateEntity_Request_Have_JSON_ContentType() { MediaTypeHeaderValue contentType = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { contentType = request.Content.Headers.ContentType; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId); entity["firstname"] = "[TEST]"; await crmClient.UpdateAsync(entity); contentType.MediaType.Should().Be("application/json"); }
public async Task UpdateEntity_Request_Have_Correct_Uri() { Uri httpRequestUri = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { httpRequestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId); entity["firstname"] = "[TEST]"; await crmClient.UpdateAsync(entity); httpRequestUri.Segments.Last().Should().Be($"contacts({SetupBase.EntityId})"); }
public void CreateAsync_When_Duplicated_ById_Then_Throw_Exception() { var crmResponse = @" { ""error"": { ""code"": """", ""message"": ""A record with matching key values already exists."", ""innererror"": { ""message"": ""Duplicate Record Found for Entity: 1 with ID: { + " + SetupBase.EntityId + @"}"", ""type"" : """", ""stacktrace"" : """" } } }"; var apiResponse = new HttpResponseMessage(HttpStatusCode.PreconditionFailed) { Content = new StringContent(crmResponse, Encoding.UTF8, "application/json") }; apiResponse.Content.Headers.ContentType.Parameters.Add( new NameValueHeaderValue("odata.metadata", "minimal")); var httpClient = new HttpClient(new MockedHttpMessageHandler(apiResponse)); var client = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("account") { Id = SetupBase.EntityId }; Func <Task> createAction = () => client.CreateAsync(entity); createAction.Should() .Throw <WebApiException>() .WithMessage("A record with matching key values already exists.") .And.StatusCode.Should().Be((int)HttpStatusCode.PreconditionFailed); }
public async Task UpdateEntity_When_Set_Money_Property_Then_Request_Is_Valid() { string expectedRequestContent = "{\"@odata.type\":\"Microsoft.Dynamics.CRM.contact\",\"creditlimit\":300.15,\"contactid\":\"00000000-0000-0000-0000-000000000001\"}"; string httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId); entity["creditlimit"] = 300.15; await crmClient.UpdateAsync(entity); httpRequestContent.Should().Be(expectedRequestContent); }
public async Task DisassociateAsync_ReferenceContainsAlternateKey_RequestHaveCorrectUri() { Uri httpRequestUri = default; var httpClient = new HttpClient(new MockedHttpMessageHandler((request) => { httpRequestUri = request.RequestUri; return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entityRef = new EntityReference("contact", "keyName", "keyValue"); await crmClient.DisassociateAsync(entityRef, "customerid"); var lastSegment = httpRequestUri.Segments.Length - 1; httpRequestUri.Segments[lastSegment - 2].Should().Be($"contacts(keyName='keyValue')/"); httpRequestUri.Segments[lastSegment - 1].Should().Be("customerid/"); httpRequestUri.Segments[lastSegment].Should().Be("$ref"); }
public async Task UpdateEntity_When_Set_Boolean_Property_Then_Request_Is_Valid() { const string expectedRequestContent = "{\"creditonhold\":true,\"contactid\":\"00000000-0000-0000-0000-000000000001\"}"; var httpRequestContent = string.Empty; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestContent = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("contact", SetupBase.EntityId); entity["creditonhold"] = true; await crmClient.UpdateAsync(entity); httpRequestContent.Should().Be(expectedRequestContent); }
public async Task When_CustomAction_Parameter_Is_EntityReference_Then_Body_IsCorrect() { string body = null; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { body = await request.Content.ReadAsStringAsync(); return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); // Preparation var userRef = new EntityReference("systemuser", SetupBase.EntityId); var crmRequest = new ActionUnboundEntityReferenceIn(userRef); // Execution await crmClient.ExecuteAsync(crmRequest); // Validation body.Should().NotBeNullOrEmpty(); var requestContent = JsonSerializer.Deserialize <Dictionary <string, Dictionary <string, object> > >(body); requestContent.Should().ContainKey("UserRef"); var userRefDeserialized = requestContent["UserRef"]; userRefDeserialized.Should().ContainKey("systemuserid"); (userRefDeserialized["systemuserid"] as string).Should() .Equals(SetupBase.EntityId.ToString()); userRefDeserialized.Should().ContainKey("@odata.type"); (userRefDeserialized["@odata.type"] as string).Should() .Equals("Microsoft.Dynamics.CRM.systemuser"); }
public async Task UpdateEntity_When_RowVersion_IsODataETag_Then_Request_Is_Valid() { HttpRequestHeaders httpRequestHeaders = default; var httpClient = new HttpClient(new MockedHttpMessageHandler(async(request) => { httpRequestHeaders = request.Headers; return(new HttpResponseMessage(HttpStatusCode.NoContent)); })); var crmClient = FakeCrmWebApiClient.Create(httpClient); var entity = new Entity("account") { RowVersion = "W/\"723316\"" }; await crmClient.UpdateAsync(entity); httpRequestHeaders.IfMatch.Count.Should().BeGreaterOrEqualTo(1); httpRequestHeaders.IfMatch.ElementAt(0).IsWeak.Should().BeTrue(); httpRequestHeaders.IfMatch.ElementAt(0).Tag.Should().Be("\"723316\""); }