public void CreateSobject()
        {
            var referenceId = "TheRecord";

            MockSobject sobject = CreateDefaultMockSobject();

            var builder = _compositeBuilder.CreateSobject(referenceId, sobject);

            Subrequest subrequest = builder.Subrequests.FirstOrDefault();

            Assert.IsNotNull(subrequest);

            string json = SubrequestSerialization.Serialize(subrequest, Formatting.None);

            Assert.That(json.Contains($"\"method\":\"POST\""));
            Assert.That(json.Contains($"\"url\":\"/services/data/v{_salesforceApiVersion}.0/sobjects/{typeof(MockSobject).Name}\""));
            Assert.That(json.Contains($"\"Username\":\"{sobject.Username}\""));
            Assert.That(json.Contains($"\"Security_Token__c\":\"{sobject.SecurityToken}\""));
            Assert.That(json.Contains($"\"referenceId\":\"{referenceId}\""));
            Assert.That(json.Contains($"CreateOnlyField"));

            Assert.That(!json.Contains("Password"));
            Assert.That(!json.Contains("ReadOnlyField"));
            Assert.That(!json.Contains("UpdateOnlyField"));
            Assert.That(!json.Contains("DeleteOnlyField"));
        }
        public async Task <List <CompositeSubrequestResult> > ExecuteAsync()
        {
            var json = Subrequests.Select(req => SubrequestSerialization.Serialize(req));

            var body = $"{{ \"allOrNone\": {_allOrNone.ToString().ToLower()}, \"compositeRequest\": [{string.Join(",", json)}] }}";

            var content = new StringContent(body);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            HttpResponseMessage response = await _client.PostAsync($"/services/data/v{_salesforceApiVersion}.0/composite/", content);

            var result = await response.Content.ReadAsStringAsync();

            if (!response.IsSuccessStatusCode)
            {
                var ex = new Exception("Salesforce communication error");

                var errors = JsonConvert.DeserializeObject <List <SalesforceHtpError> >(result);

                foreach (var error in errors)
                {
                    ex.Data[error.ErrorCode] = error.Message;
                }

                throw ex;
            }

            Clear();

            var responseBody = JsonConvert.DeserializeObject <CompositeResponseBody>(result);

            //var results = new List<CompositeSubrequestResult<T>>();

            //foreach (var compositeResponse in responseBody.CompositeResponse)
            //{
            //    var subrequest = Subrequests.First(x => x.compositeSubrequestBase.ReferenceId == compositeResponse.ReferenceId);

            //    if(subrequest.salesforceSerialization == SalesforceSerialization.CREATE)
            //    {
            //        var convertedBody = JsonConvert.DeserializeObject<CreateResponseModel>(compositeResponse.Body);
            //        var convertedSubrequestResult = new CompositeSubrequestResult<CreateResponseModel>(convertedBody, compositeResponse);
            //    }

            //    var dasdasd = JsonConvert.DeserializeObject(compositeResponse.Body, subrequest.responseType);
            //}

            return(responseBody.CompositeResponse);
        }
        public void RetrieveSobject()
        {
            var referenceId = "TheRecord";
            var id          = "12345";

            var builder = _compositeBuilder.RetrieveSobject(referenceId, id, out MockSobject objRef);

            Subrequest subrequest = builder.Subrequests.FirstOrDefault();

            Assert.IsNotNull(subrequest);

            string json = SubrequestSerialization.Serialize(subrequest, Formatting.None);

            Assert.That(json.Contains($"\"method\":\"GET\""));
            Assert.That(json.Contains($"\"url\":\"/services/data/v{_salesforceApiVersion}.0/sobjects/{typeof(MockSobject).Name}/{id}\""));
            Assert.That(json.Contains($"\"referenceId\":\"{referenceId}\""));

            Assert.That(!json.Contains("body"));
        }
        public void DeleteSobject()
        {
            var referenceId = "TheRecord";
            var id          = "1qa2ws3ed4rf5tg6yh";

            MockSobject sobject = CreateDefaultMockSobject(id);

            var builder = _compositeBuilder.DeleteSobject <MockSobject>(referenceId, id);

            Subrequest subrequest = builder.Subrequests.FirstOrDefault();

            Assert.IsNotNull(subrequest);

            string json = SubrequestSerialization.Serialize(subrequest, Formatting.None);

            Assert.That(json.Contains($"\"method\":\"DELETE\""));
            Assert.That(json.Contains($"\"url\":\"/services/data/v{_salesforceApiVersion}.0/sobjects/{typeof(MockSobject).Name}/{id}\""));
            Assert.That(json.Contains($"\"referenceId\":\"{referenceId}\""));

            Assert.That(!json.Contains("body"));
        }