public void Given_argument_name_and_value_are_defined_And_method_is_GET_When_adding_argument_Then_argument_added()
        {
            // setup
            var mockHost = "www.test.com";
            var mockPath = "/index.html";
            var mockUrl = mockHost + mockPath;
            var mockArgumentName = "ArgumentName";
            var mockArgumentValue = "ArgumentValue";

            var assembledRequest = new StringBuilder();
            assembledRequest.Append("GET " + mockPath + "?" + mockArgumentName + "=" + mockArgumentValue + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\n\n");
            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl);

            // execution
            target.AddArgument(mockArgumentName, mockArgumentValue);

            // assertion
            var result = target.ToByteArray();
            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_argument_name_is_defined_And_argument_value_is_not_defined_And_method_is_GET_When_adding_argument_Then_argument_added()
        {
            // setup
            var mockHost         = "www.test.com";
            var mockPath         = "/index.html";
            var mockUrl          = mockHost + mockPath;
            var mockArgumentName = "ArgumentName";

            var assembledRequest = new StringBuilder();

            assembledRequest.Append("GET " + mockPath + "?" + mockArgumentName + "= HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\n\n");
            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl);

            // execution
            target.AddArgument(mockArgumentName, "");

            // assertion
            var result = target.ToByteArray();

            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_argument_name_and_value_are_defined_And_have_encodable_characters_And_method_is_POST_When_adding_argument_Then_argument_added_with_encodable_characters_encoded()
        {
            // setup
            var mockHost             = "www.test.com";
            var mockPath             = "/index.html";
            var mockUrl              = mockHost + mockPath;
            var mockArgumentName     = "Argument Name";
            var mockArgumentValue    = "Argument&Value";
            var encodedArgumentName  = "Argument%20Name";
            var encodedArgumentValue = "Argument%26Value";

            var assembledRequest = new StringBuilder();

            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: " +
                                    (encodedArgumentName.Length + encodedArgumentValue.Length + 1).ToString());
            assembledRequest.Append("\n\n");
            assembledRequest.Append(encodedArgumentName + "=" + encodedArgumentValue);

            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument(mockArgumentName, mockArgumentValue);

            // assertion
            var result = target.ToByteArray();

            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_argument_name_is_not_defined_And_method_is_POST_When_adding_argument_Then_argument_not_added()
        {
            // setup
            var mockHost = "www.test.com";
            var mockPath = "/index.html";
            var mockUrl  = mockHost + mockPath;

            var assembledRequest = new StringBuilder();

            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: 0");
            assembledRequest.Append("\n\n");
            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument("", "");

            // assertion
            var result = target.ToByteArray();

            Assert.AreEqual(expectedBytes, result, "Argument not ignored");
        }
        public void Given_nultiple_argument_names_and_values_are_defined_And_method_is_POST_When_adding_argument_Then_all_arguments_added()
        {
            // setup
            var mockHost           = "www.test.com";
            var mockPath           = "/index.html";
            var mockUrl            = mockHost + mockPath;
            var mockArgumentName1  = "ArgumentName";
            var mockArgumentValue1 = "ArgumentValue";
            var mockArgumentName2  = "SecondArgumentName";
            var mockArgumentValue2 = "SecondArgumentValue";
            var mockArgumentName3  = "ArgumentNameThree";
            var mockArgumentValue3 = "ArgumentValueThree";

            var assembledRequest = new StringBuilder();

            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: " + (
                                        mockArgumentName1.Length + mockArgumentValue1.Length + 1 +
                                        mockArgumentName2.Length + mockArgumentValue2.Length + 2 +
                                        mockArgumentName3.Length + mockArgumentValue3.Length + 2).ToString());
            assembledRequest.Append("\n\n");
            assembledRequest.Append(mockArgumentName1 + "=" + mockArgumentValue1 +
                                    "&" + mockArgumentName2 + "=" + mockArgumentValue2 +
                                    "&" + mockArgumentName3 + "=" + mockArgumentValue3);

            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument(mockArgumentName1, mockArgumentValue1);
            target.AddArgument(mockArgumentName2, mockArgumentValue2);
            target.AddArgument(mockArgumentName3, mockArgumentValue3);

            // assertion
            var result = target.ToByteArray();

            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_nultiple_argument_names_and_values_are_defined_And_method_is_POST_When_adding_argument_Then_all_arguments_added()
        {
            // setup
            var mockHost = "www.test.com";
            var mockPath = "/index.html";
            var mockUrl = mockHost + mockPath;
            var mockArgumentName1 = "ArgumentName";
            var mockArgumentValue1 = "ArgumentValue";
            var mockArgumentName2 = "SecondArgumentName";
            var mockArgumentValue2 = "SecondArgumentValue";
            var mockArgumentName3 = "ArgumentNameThree";
            var mockArgumentValue3 = "ArgumentValueThree";

            var assembledRequest = new StringBuilder();
            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: " + (
                mockArgumentName1.Length + mockArgumentValue1.Length + 1 +
                mockArgumentName2.Length + mockArgumentValue2.Length + 2 +
                mockArgumentName3.Length + mockArgumentValue3.Length + 2).ToString());
            assembledRequest.Append("\n\n");
            assembledRequest.Append(mockArgumentName1 + "=" + mockArgumentValue1 +
                "&" + mockArgumentName2 + "=" + mockArgumentValue2 +
                "&" + mockArgumentName3 + "=" + mockArgumentValue3);

            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument(mockArgumentName1, mockArgumentValue1);
            target.AddArgument(mockArgumentName2, mockArgumentValue2);
            target.AddArgument(mockArgumentName3, mockArgumentValue3);

            // assertion
            var result = target.ToByteArray();
            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_argument_name_and_value_are_defined_And_have_encodable_characters_And_method_is_POST_When_adding_argument_Then_argument_added_with_encodable_characters_encoded()
        {
            // setup
            var mockHost = "www.test.com";
            var mockPath = "/index.html";
            var mockUrl = mockHost + mockPath;
            var mockArgumentName = "Argument Name";
            var mockArgumentValue = "Argument&Value";
            var encodedArgumentName = "Argument%20Name";
            var encodedArgumentValue = "Argument%26Value";

            var assembledRequest = new StringBuilder();
            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: " +
                (encodedArgumentName.Length + encodedArgumentValue.Length + 1).ToString());
            assembledRequest.Append("\n\n");
            assembledRequest.Append(encodedArgumentName + "=" + encodedArgumentValue);

            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument(mockArgumentName, mockArgumentValue);

            // assertion
            var result = target.ToByteArray();
            Assert.AreEqual(expectedBytes, result, "Argument not added");
        }
        public void Given_argument_name_is_not_defined_And_method_is_POST_When_adding_argument_Then_argument_not_added()
        {
            // setup
            var mockHost = "www.test.com";
            var mockPath = "/index.html";
            var mockUrl = mockHost + mockPath;

            var assembledRequest = new StringBuilder();
            assembledRequest.Append("POST " + mockPath + " HTTP/1.0\n");
            assembledRequest.Append("Host: ");
            assembledRequest.Append(mockHost);
            assembledRequest.Append("\nConnection: Close");
            assembledRequest.Append("\nContent-Type: application/x-www-form-urlencoded");
            assembledRequest.Append("\nContent-Length: 0");
            assembledRequest.Append("\n\n");
            var expectedBytes = Encoding.UTF8.GetBytes(assembledRequest.ToString());

            var target = new HttpRequest(mockUrl, HttpMethod.POST);

            // execution
            target.AddArgument("", "");

            // assertion
            var result = target.ToByteArray();
            Assert.AreEqual(expectedBytes, result, "Argument not ignored");
        }