public void JsonConvert_DeserializesUnexpectedNull_DateTimeValues(string data, Event.Event expectedResult)
        {
            // Note that the usage of the Event class here is because it has datetime fields
            var result = deserializer.Deserialize <Event.Event>(data);

            Assert.Equal(expectedResult.Id, result.Result.Id);
            Assert.Equal(AdjustToNearestSecond(expectedResult.StartDateTime), result.Result.StartDateTime);
            Assert.Equal(AdjustToNearestSecond(expectedResult.EndDateTime), result.Result.EndDateTime);
        }
示例#2
0
        /// <summary>
        /// Calls a method of the iVvy api. Encapsulates the header and
        /// signing requirements.
        /// </summary>
        public async Task <ResultOrError <T> > CallAsync <T>(
            string apiNamespace, string action, object requestData) where T : new()
        {
            if (ApiVersion != "1.0")
            {
                throw new ArgumentException("ApiVersion is not a valid version number");
            }
            var postData = "";

            if (requestData != null)
            {
                postData = serializer.Serialize(requestData);
            }
            var method              = "POST";
            var contentType         = "application/json; charset=utf-8";
            var contentMD5          = Utils.GetMD5Hash(postData);
            var date                = "";
            var requestUri          = "/api/" + ApiVersion + "/" + apiNamespace + "?action=" + action;
            var ivvyDate            = DateTime.Now.ToUniversalTime().ToString(Utils.DateTimeFormat);
            var headersToSign       = "IVVYDate=" + ivvyDate;
            var initialStringToSign = method + contentMD5 + contentType + date + requestUri + ApiVersion + headersToSign;
            var stringToSign        = initialStringToSign.ToLower();
            var signature           = Utils.SignString(stringToSign, ApiSecret);

            var message = new HttpRequestMessage(HttpMethod.Post, BaseUrl + requestUri);

            message.Headers.Clear();
            message.Content = new StringContent(postData, Encoding.UTF8, "application/json");
            message.Content.Headers.Add("Content-MD5", contentMD5);
            message.Content.Headers.Add("IVVY-Date", ivvyDate);
            message.Content.Headers.Add("X-Api-Authorization", "IWS " + ApiKey + ":" + signature);

            HttpResponseMessage httpResponse = null;
            ResultOrError <T>   result       = null;

            try
            {
                var httpClient = httpClientWrapper.GetHttpClient();
                httpResponse = await httpClient.SendAsync(message);

                var data = await httpResponse.Content.ReadAsStringAsync();

                await Events.AfterApiCalledAsync(new ApiCallDetails(
                                                     apiNamespace,
                                                     action,
                                                     message.Headers,
                                                     message.Content?.Headers,
                                                     postData,
                                                     httpResponse.StatusCode,
                                                     httpResponse.Headers,
                                                     data
                                                     ));

                result = deserializer.Deserialize <T>(data);
                if (result == null)
                {
                    result = new ResultOrError <T>()
                    {
                        ErrorCode         = libErrorCode,
                        ErrorCodeSpecific = "CallAsync",
                        ErrorMessage      = "Received invalid response.",
                    };
                }
            }
            catch (Exception ex)
            {
                result = new ResultOrError <T>()
                {
                    ErrorCode         = libErrorCode,
                    ErrorCodeSpecific = "CallAsync",
                    ErrorMessage      = ex.Message,
                };
            }
            finally
            {
                if (httpResponse != null)
                {
                    httpResponse.Dispose();
                }
            }
            return(result);
        }