예제 #1
0
        public void Can_deserialize_object_without_xml_declaration()
        {
            const string xml          = "<response status=\"ok\"><testObject id=\"1\"> <name>A big test object</name><listOfThings><string>one</string><string>two</string><string>three</string></listOfThings><listOfInnerObjects><InnerObject id=\"1\"><Name>Trevor</Name></InnerObject><InnerObject id=\"2\"><Name>Bill</Name></InnerObject></listOfInnerObjects></testObject></response>";
            var          stubResponse = new Response(HttpStatusCode.OK, xml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());

            Assert.DoesNotThrow(() => xmlParser.Parse <TestObject>(stubResponse));

            var testObject = xmlParser.Parse <TestObject>(stubResponse);

            Assert.That(testObject.Id, Is.EqualTo(1));
        }
		public void Can_deserialize_object_without_xml_declaration()
		{
			const string xml = "<response status=\"ok\"><testObject id=\"1\"> <name>A big test object</name><listOfThings><string>one</string><string>two</string><string>three</string></listOfThings><listOfInnerObjects><InnerObject id=\"1\"><Name>Trevor</Name></InnerObject><InnerObject id=\"2\"><Name>Bill</Name></InnerObject></listOfInnerObjects></testObject></response>";
			var stubResponse = new Response(HttpStatusCode.OK, xml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			Assert.DoesNotThrow(() => xmlParser.Parse<TestObject>(stubResponse));

			var testObject = xmlParser.Parse<TestObject>(stubResponse);

			Assert.That(testObject.Id, Is.EqualTo(1));
		}
예제 #3
0
        public void Can_deserialize_object()
        {
            const string xml = "<?xml version=\"1.0\"?><response xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" status=\"ok\"><testObject id=\"1\"> <name>A big test object</name><listOfThings><string>one</string><string>two</string><string>three</string></listOfThings><listOfInnerObjects><InnerObject id=\"1\"><Name>Trevor</Name></InnerObject><InnerObject id=\"2\"><Name>Bill</Name></InnerObject></listOfInnerObjects></testObject></response>";

            var stubResponse = new Response(HttpStatusCode.OK, xml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());

            Assert.DoesNotThrow(() => xmlParser.Parse <TestObject>(stubResponse));

            var testObject = xmlParser.Parse <TestObject>(stubResponse);

            Assert.That(testObject.Id, Is.EqualTo(1));
        }
		public void Can_deserialize_object()
		{
			const string xml = "<?xml version=\"1.0\"?><response xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" status=\"ok\"><testObject id=\"1\"> <name>A big test object</name><listOfThings><string>one</string><string>two</string><string>three</string></listOfThings><listOfInnerObjects><InnerObject id=\"1\"><Name>Trevor</Name></InnerObject><InnerObject id=\"2\"><Name>Bill</Name></InnerObject></listOfInnerObjects></testObject></response>";

			var stubResponse = new Response(HttpStatusCode.OK, xml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			Assert.DoesNotThrow(() => xmlParser.Parse<TestObject>(stubResponse));

			var testObject = xmlParser.Parse<TestObject>(stubResponse);

			Assert.That(testObject.Id, Is.EqualTo(1));
		}
예제 #5
0
        public bool remove(bool soft = false)
        {
            beforeRemove();

            if (soft)
            {
                return(afterRemove(null, soft));
            }

            HTTPRequest http = Request();

            http.addParameter("entity", Entity + "/delete");
            prepareRemoveData(http);
            if (!exec(http, this))
            {
                return(false);
            }
            ResponseParser parser = ResponseParser.Parse(http.ResponseData);

            if (!parser.NoError)
            {
                LastError = parser.LastError;
                return(false);
            }
            if (parser.ServerErrorFlag != 0)
            {
                LastError = parser.ToObject <string>();
                return(false);
            }
            return(afterRemove(parser));
        }
예제 #6
0
        public void ParsePresets()
        {
            var r = (FsResult <IEnumerable <Preset> >)ResponseParser.Parse(Verb.ListGetNext, Command.PRESETS, Xml.Presets);

            Assert.IsTrue(r.Succeeded);
            Assert.AreEqual(10, r.Value.Count());
        }
예제 #7
0
        private bool saveChuck(string chuck)
        {
            HTTPRequest http = Core.Model.Request();

            http.addParameter("entity", Entity + "/savechuck");
            http.addParameter("id", Id);
            http.addParameter("chuck", chuck);
            if (!Core.Model.exec(http, this))
            {
                return(false);
            }

            ResponseParser parser = ResponseParser.Parse(http.ResponseData);

            if (!parser.NoError)
            {
                LastError = parser.LastError;
                return(false);
            }
            if (parser.ServerErrorFlag != 0)
            {
                LastError = parser.ToObject <string>();
                return(false);
            }
            return(true);
        }
예제 #8
0
        private bool changeRowOrder(string action)
        {
            HTTPRequest http = Request();

            http.addParameter("entity", Entity + "/" + action);
            http.addParameter("id", Id);
            if (!exec(http, this))
            {
                return(false);
            }

            ResponseParser parser = ResponseParser.Parse(http.ResponseData);

            if (!parser.NoError)
            {
                LastError = parser.LastError;
                return(false);
            }
            if (parser.ServerErrorFlag != 0)
            {
                LastError = parser.ToObject <string>();
                return(false);
            }

            int changedRowId = parser.ToObject <int>();

            if (changedRowId == 0)
            {
                return(true);
            }
            return(rowSwap(changedRowId));
        }
예제 #9
0
파일: StressTests.cs 프로젝트: xirurr/AQA
        public void ShouldCalculateFromHundredFilesCorrectly()
        {
            var parameters     = new StringBuilder();
            var correctMargins = new decimal();

            for (var i = 0; i < 100; i++)
            {
                var inputValue = new InputValue
                {
                    OpenPrice    = 1,
                    ClosePrice   = 2,
                    Volume       = 3,
                    ContractSize = 4,
                    Leverage     = 5,
                    Commission   = 7,
                };
                correctMargins = (inputValue.Volume * inputValue.ContractSize / inputValue.Leverage);
                var tmpFilePath = InputValueSaver.SaveToTmpFile(inputValue);

                parameters.Append(tmpFilePath + " ");
            }


            var response = ResponseParser.Parse(new FileStarter().LaunchProcess("-f " + parameters));

            Assert.That(response.FirstOrDefault(o =>
                                                Math.Abs(o.Margin - correctMargins) > 0.0001M), Is.Null, "Error in group calculation (3)");
        }
예제 #10
0
        public void can_deserialise_response_user_cards()
        {
            var xmlParser = new ResponseParser <AddCard>();

            var deserializedCards = xmlParser.Parse(response);

            Assert.That(deserializedCards, Is.Not.Null);
        }
예제 #11
0
        private DateTime?GetExpirationDate(LicenseRegistration registration, string response)
        {
            var parsed = parser.Parse(response);

            return(parsed != null && parsed.Key == registration.Key
        ? parsed.Expiration
        : (DateTime?)null);
        }
예제 #12
0
        public void WithoutDescriptionInAttribute_ReturnsResponseWithStatusCodeString()
        {
            var parser = new ResponseParser();

            var response = parser.Parse(new ProducesResponseAttribute(HttpStatusCode.Accepted));

            Assert.Equal("Accepted", response.Description);
        }
예제 #13
0
        public void ReturnsResponseObjectWithHttpStatusCode()
        {
            var parser = new ResponseParser();

            var response = parser.Parse(new ProducesResponseAttribute(HttpStatusCode.Accepted));

            Assert.Equal(202, response.HttpStatusCode);
        }
		public void can_deserialise_response_user_cards()
		{
			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var deserializedCards = xmlParser.Parse<AddCard>(response);
			
			Assert.That(deserializedCards, Is.Not.Null);
		}
예제 #15
0
        public void can_deserialise_response_user_cards()
        {
            var xmlParser = new ResponseParser(new ApiResponseDetector());

            var deserializedCards = xmlParser.Parse <AddCard>(response);

            Assert.That(deserializedCards, Is.Not.Null);
        }
예제 #16
0
        public void ParseValidModes()
        {
            var r = (FsResult <IEnumerable <RadioMode> >)ResponseParser.Parse(Verb.ListGetNext, Command.VALID_MODES, Xml.RadioModes);

            Assert.IsTrue(r.Succeeded);
            Assert.AreEqual(8, r.Value.Count());
            Assert.IsNotNull(r.Value.First(m => m.Label == "AUX-Modus"));
        }
		public void can_deserialise_response_user_cards()
		{
			var xmlParser = new ResponseParser<AddCard>();

			var deserializedCards = xmlParser.Parse(response);
			
			Assert.That(deserializedCards, Is.Not.Null);
		}
예제 #18
0
        public void ParseEqualizerPresets()
        {
            var r = (FsResult <IEnumerable <EqualizerPreset> >)ResponseParser.Parse(Verb.ListGetNext, Command.EQUALIZER_PRESETS, Xml.EqualizerPresets);

            Assert.IsTrue(r.Succeeded);
            Assert.AreEqual(9, r.Value.Count());
            Assert.IsNotNull(r.Value.First(m => m.Label == "Nachrichten"));
        }
예제 #19
0
        public void WithDescriptionInAttribute_ReturnsResponseWithDescription()
        {
            const string description = "Your request has been accepted.";
            var          parser      = new ResponseParser();

            var response = parser.Parse(new ProducesResponseAttribute(HttpStatusCode.Accepted, description));

            Assert.Equal(description, response.Description);
        }
예제 #20
0
        public void ParseNotificationSingle()
        {
            var r = (FsResult <IEnumerable <FsNotification> >)ResponseParser.Parse(Verb.GetNotify, null, Xml.NotificationSingle);

            Assert.IsTrue(r.Succeeded);
            Assert.AreEqual(1, r.Value.Count());
            Assert.AreEqual("netremote.play.status", r.Value.ElementAt(0).Name);
            Assert.AreEqual(2, r.Value.ElementAt(0).GetValue <byte>());
        }
예제 #21
0
        public async Task ParseTokenResponse_post_binding_sp_initiated()
        {
            //ARRANGE
            var inResponseTo = Guid.NewGuid().ToString();

            var response            = ResponseFactoryMock.GetTokenResponseSuccess(inResponseTo, StatusCodes.Success);
            var logger              = new LogProviderMock();
            var serialised          = ResponseFactoryMock.Serialize(response);
            var xmlSignatureManager = new XmlSignatureManager();
            var document            = new XmlDocument();

            document.LoadXml(serialised);
            var cert = AssertionFactroryMock.GetMockCertificate();

            xmlSignatureManager.SignXml(document, response.ID, cert.PrivateKey, null);
            var base64Encoded = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(document.DocumentElement.OuterXml));

            var compressor           = new DeflateCompressor();
            var encoder              = new MessageEncoding(compressor);
            var jsonSerialiser       = new NSJsonSerializer(new DefaultSettingsProvider());
            var relayStateSerialiser = new RelaystateSerialiser(jsonSerialiser, encoder, logger) as IRelayStateSerialiser;
            var relayState           = await relayStateSerialiser.Serialize(new Dictionary <string, object> {
                { "Key", "Value" }
            });

            var form = new SAMLForm();

            form.SetResponse(base64Encoded);
            form.SetRelatState(relayState);

            Func <Type, IMetadataHandler> metadataHandlerFactory = t => new MetadataEntitityDescriptorHandler();

            var certManager      = new CertificateManager(logger);
            var signatureManager = new XmlSignatureManager();
            Func <IEnumerable <ResponseValidationRule> > rulesResolver = () => new[] { new ResponseSignatureRule(logger, certManager, signatureManager) };
            var validator = new Federation.Protocols.Response.Validation.ResponseValidator(logger, new RuleFactory(rulesResolver));
            var configurationRetrieverMock        = new ConfigurationRetrieverMock();
            var federationPartyContextBuilderMock = new FederationPartyContextBuilderMock();
            var configurationManger = new ConfigurationManager <MetadataBase>(federationPartyContextBuilderMock, configurationRetrieverMock);
            var relayStateHandler   = new RelayStateHandler(relayStateSerialiser, logger);
            var responseParser      = new ResponseParser(metadataHandlerFactory, t => new SamlTokenResponseParser(logger),
                                                         configurationManger, relayStateHandler, logger, validator);
            var postBindingDecoder = new PostBindingDecoder(logger);
            var message            = await postBindingDecoder.Decode(form.HiddenControls.ToDictionary(k => k.Key, v => v.Value));

            var context = new SamlInboundContext
            {
                Message            = message,
                DescriptorResolver = m => metadataHandlerFactory(typeof(object)).GetIdentityProviderSingleSignOnDescriptor(m).Single().Roles.Single()
            };
            //ACT
            var result = await responseParser.Parse(context);

            //ASSERT
            Assert.IsTrue(result.IsValidated);
        }
예제 #22
0
        public void ShouldRiseErrorIfLeverageBelowZero()
        {
            var parameters = "--open 1.2 --close 2 --volume 1.5 --contract-size 100000 --leverage -2";

            var response = ResponseParser.Parse(new FileStarter().LaunchProcess(parameters));

            Assert.That(response[0].Errors.Count == 1, "wrong errors count");
            Assert.That(response[0].Errors[0].Contains("Leverage must be greater than 0"),
                        "Wrong error: " + response[0].Errors[0]);
        }
예제 #23
0
        public void Test1(string response, int processed, int failed, int total, decimal secondsSpent)
        {
            var parser = new ResponseParser();
            var parsed = parser.Parse(response);

            Assert.Equal(processed, parsed.Processed);
            Assert.Equal(failed, parsed.Failed);
            Assert.Equal(secondsSpent, parsed.SecondsSpent);
            Assert.Equal(total, parsed.Total);
        }
		public void should_deserialize_emtpy_release_type_to_unknown()
		{
			var responseXml = File.ReadAllText("StubResponses/ArtistReleases.xml");
			var response = new Response(HttpStatusCode.OK, responseXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());
			var release = xmlParser.Parse<ArtistReleases>(response).Releases.First();

			Assert.That(release.Type,Is.EqualTo(ReleaseType.Unknown));
		}
예제 #25
0
        public void should_deserialize_emtpy_release_type_to_unknown()
        {
            var responseXml = File.ReadAllText("StubResponses/ArtistReleases.xml");
            var response    = new Response(HttpStatusCode.OK, responseXml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());
            var release   = xmlParser.Parse <ArtistReleases>(response).Releases.First();

            Assert.That(release.Type, Is.EqualTo(ReleaseType.Unknown));
        }
		public void can_deseralize_card_types()
		{
			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var result = xmlParser.Parse<PaymentCardTypes>(stubResponse);

			Assert.That(result.CardTypes.Count(),Is.EqualTo(4));
			var lastCard = result.CardTypes.Last();
			Assert.That(lastCard.Type, Is.EqualTo("American Express"));
			Assert.That(lastCard.Id, Is.EqualTo("AMEX"));
		}
        public void Can_Deserialise_ok_response_without_body__as_DeleteCard()
        {
            const string ResponseXml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><response status=\"ok\" version=\"1.2\" />";

            var response = new Response(HttpStatusCode.OK, ResponseXml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());
            var result    = xmlParser.Parse <DeleteCard>(response);

            Assert.That(result, Is.Not.Null);
        }
		public void Can_Deserialise_ok_response_without_body__as_DeleteCard()
		{
			const string ResponseXml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><response status=\"ok\" version=\"1.2\" />";

			var response = new Response(HttpStatusCode.OK, ResponseXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());
			var result = xmlParser.Parse<DeleteCard>(response);

			Assert.That(result, Is.Not.Null);
		}
예제 #29
0
        public void ParseNotificationMultiple()
        {
            var r = (FsResult <IEnumerable <FsNotification> >)ResponseParser.Parse(Verb.GetNotify, null, Xml.NotificationMultiple);

            Assert.IsTrue(r.Succeeded);
            Assert.AreEqual(2, r.Value.Count());
            Assert.AreEqual("netremote.play.info.name", r.Value.ElementAt(0).Name);
            Assert.AreEqual("Lounge FM Vienna", r.Value.ElementAt(0).GetValue <string>());
            Assert.AreEqual("netremote.play.info.text", r.Value.ElementAt(1).Name);
            Assert.AreEqual("Coralie Clément - L'Ombre Et La Lumiere", r.Value.ElementAt(1).GetValue <string>());
        }
예제 #30
0
        public void WithFunctionWithProducesResponseAttrbiutes_ReturnsParsedAttributes()
        {
            var functionMethod = typeof(ResponseAttributeFuncs).GetMethod(nameof(ResponseAttributeFuncs.DeleteUser));
            var parser         = new ResponseParser();

            var responses = parser.Parse(functionMethod);

            Assert.Equal(2, responses.Count());
            Assert.Contains(responses, r => r.HttpStatusCode == 204);
            Assert.Contains(responses, r => r.HttpStatusCode == 404);
        }
        /// <summary>
        /// Authenticates the specified network credentials with a provider endpoint and
        /// returns the SAML assertion data from which temporary AWS credentials can be obtained.
        /// </summary>
        /// <param name="identityProviderUrl">The authentication endpoint to be called.</param>
        /// <param name="credentials">
        /// Credentials for the call. If null, the users default network credentials will be used
        /// in a temporary impersonation context.
        /// </param>
        /// <param name="authenticationType">
        /// The authentication type expected by the endpoint. The default value if not specified
        /// is 'Kerberos'. Valid values are 'NTLM', 'Digest', 'Kerberos' and 'Negotiate'.
        /// </param>
        /// <returns>SAMLAssertion instance wrapping the returned document on successful authentication.</returns>
        public SAMLAssertion GetSAMLAssertion(Uri identityProviderUrl,
                                              ICredentials credentials,
                                              string authenticationType)
        {
            var response = AuthenticationController.Authenticate(identityProviderUrl,
                                                                 credentials,
                                                                 string.IsNullOrEmpty(authenticationType)
                                                                    ? SAMLEndpointSettings.DefaultAuthenticationType : authenticationType,
                                                                 ProxySettings);

            return(ResponseParser.Parse(response));
        }
예제 #32
0
        public void Error_captures_http_status_code_from_html()
        {
            const string badXml = "<html><head>Error</head><body>It did not work<br><hr></body></html>";

            var response = new Response(HttpStatusCode.InternalServerError, badXml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());

            var ex = Assert.Throws <NonXmlResponseException>(() => xmlParser.Parse <TestObject>(response));

            Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
        }
예제 #33
0
        public void ShouldRiseErrorIfMultipleMandatoryValuesBelowZero()
        {
            var parameters = "--open -1 --close -2 --volume 1.5 --contract-size -3 --leverage -4";

            var response = ResponseParser.Parse(new FileStarter().LaunchProcess(parameters));

            Assert.That(response[0].Errors.Count == 4, "wrong errors count");
            Assert.That(response[0].Errors.Any(o => o.Contains("Leverage must be greater than 0")), "Wrong error");
            Assert.That(response[0].Errors.Any(o => o.Contains("Close price must be greater than 0")), "Wrong error");
            Assert.That(response[0].Errors.Any(o => o.Contains("Open price must be greater than 0")), "Wrong error");
            Assert.That(response[0].Errors.Any(o => o.Contains("Contract size must be greater than 0")), "Wrong error");
        }
예제 #34
0
        public void Should_throw_unrecognised_error_exception_if_xml_is_missing_error_message()
        {
            const string validXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error code=\"123\"></error></response>";
            var          response = new Response(HttpStatusCode.OK, validXml);

            var xmlParser = new ResponseParser(new ApiResponseDetector());

            var ex = Assert.Throws <UnrecognisedErrorException>(() => xmlParser.Parse <TestObject>(response));

            Assert.That(ex.ResponseBody, Is.EqualTo(response.Body));
            Assert.That(ex.Message, Is.EqualTo(UnrecognisedErrorException.DEFAULT_ERROR_MESSAGE));
        }
예제 #35
0
        public void Should_throw_non_xml_response_exception_when_response_body_is_empty()
        {
            var response = new Response(HttpStatusCode.OK, string.Empty);


            var xmlSerializer = new ResponseParser(new ApiResponseDetector());

            var ex = Assert.Throws <NonXmlResponseException>(() => xmlSerializer.Parse <TestObject>(response));

            Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
            Assert.That(ex.ResponseBody, Is.Empty);
        }
예제 #36
0
        public void WithMethodWithoutPRoducesResponseAttributes_ReturnsDefaultAttibute()
        {
            var functionMethod = typeof(ResponseAttributeFuncs).GetMethod(nameof(ResponseAttributeFuncs.NoResponseAttribute));
            var parser         = new ResponseParser();

            var responses = parser.Parse(functionMethod);

            var onlyResponse = Assert.Single(responses);

            Assert.Equal(parser.DefaultResponse.HttpStatusCode, onlyResponse.HttpStatusCode);
            Assert.Equal(parser.DefaultResponse.Description, onlyResponse.Description);
        }
예제 #37
0
        public void can_deseralize_card_types()
        {
            var xmlParser = new ResponseParser(new ApiResponseDetector());

            var result = xmlParser.Parse <PaymentCardTypes>(stubResponse);

            Assert.That(result.CardTypes.Count(), Is.EqualTo(4));
            var lastCard = result.CardTypes.Last();

            Assert.That(lastCard.Type, Is.EqualTo("American Express"));
            Assert.That(lastCard.Id, Is.EqualTo("AMEX"));
        }
		public void Should_throw_input_parameter_exception_for_1001_error_code_with_error_http_status_code()
		{
			const string errorXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error code=\"1001\"><errorMessage>Test error</errorMessage></error></response>";
			var response = new Response(HttpStatusCode.InternalServerError, errorXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<InputParameterException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.EqualTo(errorXml));
			Assert.That(ex.Message, Is.EqualTo("Test error"));
			Assert.That(ex.ErrorCode, Is.EqualTo(ErrorCode.RequiredParameterMissing));
		}
		public void Should_throw_invalid_resource_exception_for_2001_error_code_with_ok_http_status_code()
		{
			const string errorXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error code=\"2001\"><errorMessage>Test error</errorMessage></error></response>";
			var response = new Response(HttpStatusCode.OK, errorXml);

			var xmlParser = new ResponseParser<TestObject>();

			var ex = Assert.Throws<InvalidResourceException>(() => xmlParser.Parse(response));

			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.EqualTo(errorXml));
			Assert.That(ex.Message, Is.EqualTo("Test error"));
			Assert.That(ex.ErrorCode, Is.EqualTo(ErrorCode.ResourceNotFound));
		}
		public void can_deserialise_response_user_cards()
		{
			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var deserializedCards = xmlParser.Parse<Cards>(response);

			var firstCard = deserializedCards.UserCards[0];
			Assert.That(deserializedCards.UserCards.Count(), Is.EqualTo(1));

			Assert.That(firstCard.Id, Is.EqualTo(8154430));
			Assert.That(firstCard.CardHolderName, Is.EqualTo("MR I HUNT"));
			Assert.That(firstCard.Type, Is.EqualTo("Visa"));
			Assert.That(firstCard.Last4Digits, Is.EqualTo("5485"));
			Assert.That(firstCard.IsoTwoLetterCountryCode, Is.EqualTo("NZ"));


			Assert.That(firstCard.ExpiryDate, Is.EqualTo("201202"));
			Assert.That(firstCard.FormatedExpiryDate, Is.EqualTo(new DateTime(2012, 02, 29, 23, 59, 59, 999)));
		}
		public void Should_throw_non_xml_response_exception_for_content_that_appears_XML_but_is_not()
		{
			const string badXml = @"<?xml version=""1.0"" encoding=""utf-8"" ?><response status=""ok"">LOL!</hah>";

			var response = new Response(HttpStatusCode.OK, badXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo("Response is not xml"));
			Assert.That(ex.ResponseBody, Is.EqualTo(badXml));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_throw_non_xml_response_exception_for_html_ok_response()
		{
			const string badXml = "<html><head>Error</head><body>Some random html page<br><hr></body></html>";

			var response = new Response(HttpStatusCode.OK, badXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo("Response is not xml"));
			Assert.That(ex.ResponseBody, Is.EqualTo(badXml));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Error_captures_http_status_code_from_html()
		{
			const string badXml = "<html><head>Error</head><body>It did not work<br><hr></body></html>";

			var response = new Response(HttpStatusCode.InternalServerError, badXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_not_fail_if_xml_is_a_malformed_api_error()
		{
			const string badError = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error><errorme></errorme></error></response>";
			var response = new Response(HttpStatusCode.OK, badError);

			var xmlParser = new ResponseParser<TestObject>();

			var ex = Assert.Throws<UnrecognisedErrorException>(() => xmlParser.Parse(response));

			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.EqualTo(response.Body));
			Assert.That(ex.Message, Is.EqualTo(UnrecognisedErrorException.DEFAULT_ERROR_MESSAGE));
		}
		public void Detects_html_as_not_xml()
		{
			const string badXml = "<html><head>Error</head><body>It did not work<br><hr></body></html>";

			var response = new Response(HttpStatusCode.InternalServerError, badXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo("Response is not xml"));
			Assert.That(ex.ResponseBody, Is.EqualTo(badXml));
		}
		public void Should_throw_unrecognised_error_exception_if_xml_is_missing_error_message()
		{
			const string validXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error code=\"123\"></error></response>";
			var response = new Response(HttpStatusCode.OK, validXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<UnrecognisedErrorException>(() => xmlParser.Parse<TestObject>(response));
			Assert.That(ex.ResponseBody, Is.EqualTo(response.Body));
			Assert.That(ex.Message, Is.EqualTo(UnrecognisedErrorException.DEFAULT_ERROR_MESSAGE));
		}
		public void Should_throw_non_xml_response_exception_when_response_body_is_empty()
		{
			var response = new Response(HttpStatusCode.OK, string.Empty);


			var xmlSerializer = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlSerializer.Parse<TestObject>(response));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.Empty);
		}
		public void Error_captures_http_status_code_from_html()
		{
			const string badXml = "<html><head>Error</head><body>It did not work<br><hr></body></html>";

			var response = new Response(HttpStatusCode.InternalServerError, badXml);

			var xmlParser = new ResponseParser<TestObject>();

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlParser.Parse(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo("Response is not xml"));
			Assert.That(ex.ResponseBody, Is.EqualTo(badXml));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_handle_plaintext_oauth_fail_with_ok_status()
		{
			const string ErrorText = "OAuth authentication error: Not found";
			var response = new Response(HttpStatusCode.OK, ErrorText);

			var xmlParser = new ResponseParser(new ApiResponseDetector());
			var ex = Assert.Throws<OAuthException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo(ErrorText));
			Assert.That(ex.ResponseBody, Is.EqualTo(response.Body));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_throw_unrecognised_status_exception_when_deserializing_with_invalid_status()
		{
			const string InvalidStatusXmlResponse = "<?xml version=\"1.0\"?><response status=\"fish\" version=\"1.2\"></response>";
			var response = new Response(HttpStatusCode.OK, InvalidStatusXmlResponse);

			var xmlParser = new ResponseParser<TestEmptyObject>();

			var ex = Assert.Throws<UnrecognisedStatusException>(() => xmlParser.Parse(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo(UnrecognisedStatusException.DEFAULT_ERROR_MESSAGE));
			Assert.That(ex.ResponseBody, Is.EqualTo(InvalidStatusXmlResponse));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_handle_plaintext_oauth_fail()
		{
			const string ErrorText = "OAuth authentication error: Not authorised - no user credentials provided";
			var response = new Response(HttpStatusCode.Unauthorized, ErrorText);

			var xmlParser = new ResponseParser<TestObject>();
			var ex = Assert.Throws<OAuthException>(() => xmlParser.Parse(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo(ErrorText));
			Assert.That(ex.ResponseBody, Is.EqualTo(response.Body));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_throw_exception_when_deserialize_with_missing_status()
		{
			const string MissingStatusXmlResponse = "<?xml version=\"1.0\"?><response version=\"1.2\"></response>";
			var response = new Response(HttpStatusCode.OK, MissingStatusXmlResponse);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<UnrecognisedStatusException>(() => xmlParser.Parse<TestEmptyObject>(response));

			Assert.That(ex, Is.Not.Null);
			Assert.That(ex.Message, Is.EqualTo(UnrecognisedStatusException.DEFAULT_ERROR_MESSAGE));
			Assert.That(ex.ResponseBody, Is.EqualTo(MissingStatusXmlResponse));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
		}
		public void Should_throw_argument_null_exception_when_reponse_is_null()
		{
			var apiXmlDeserializer = new ResponseParser(new ApiResponseDetector());

			Assert.Throws<ArgumentNullException>(() => apiXmlDeserializer.Parse<TestObject>(null));
		}
		public void Should_throw_unrecognised_error_exception_for_error_code_out_of_range_with_ok_http_status_code()
		{
			const string errorXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><response status=\"error\" version=\"1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://api.7digital.com/1.2/static/7digitalAPI.xsd\" ><error code=\"42\"><errorMessage>Test error</errorMessage></error></response>";
			var response = new Response(HttpStatusCode.OK, errorXml);

			var xmlParser = new ResponseParser(new ApiResponseDetector());

			var ex = Assert.Throws<UnrecognisedErrorException>(() => xmlParser.Parse<TestObject>(response));

			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.EqualTo(errorXml));
			Assert.That(ex.Message, Is.EqualTo("Test error"));
		}
		public void Should_throw_non_xml_response_exception_when_response_body_is_null()
		{
			var response = new Response(HttpStatusCode.OK, null);


			var xmlSerializer = new ResponseParser<TestObject>();

			var ex = Assert.Throws<NonXmlResponseException>(() => xmlSerializer.Parse(response));
			Assert.That(ex.StatusCode, Is.EqualTo(response.StatusCode));
			Assert.That(ex.ResponseBody, Is.Null);
		}