public void Equals_DifferentObjectWithDifferentValueAndBody([Values] bool method, [Values] bool uri, [Values] bool headers, [Values] bool body)
        {
            var cassetteRecordRequest = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:5000/api/users/1"),
                new NameValueCollection
            {
                { "Some-Header", "value" },
            },
                new StringCassetteBody("{}"));
            var differentCassetteRecordRequest = new CassetteRecordRequest(
                method ? HttpMethod.Get.Method : HttpMethod.Post.Method,
                uri ? new Uri("http://localhost:5000/api/users/1") : new Uri("http://localhost:5000/api/users/2"),
                new NameValueCollection
            {
                { "Some-Header", headers ? "value" : "other" },
            },
                new StringCassetteBody(body ? "{}" : "{\"a\": 1}"));

            var equal = method && uri && headers && body;

            Assert.That(cassetteRecordRequest.Equals(differentCassetteRecordRequest), Is.EqualTo(equal));
            Assert.That(cassetteRecordRequest.Equals((object)differentCassetteRecordRequest), Is.EqualTo(equal));
            Assert.That(cassetteRecordRequest == differentCassetteRecordRequest, Is.EqualTo(equal));
            Assert.That(cassetteRecordRequest != differentCassetteRecordRequest, Is.EqualTo(!equal));
        }
        public async Task CreateFromRequest_RequestWithStreamBody()
        {
            var request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost:5000/api/users/1"))
            {
                Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("text")))
                {
                    Headers =
                    {
                        ContentType = new MediaTypeHeaderValue("text/plain")
                        {
                            CharSet = "utf-8"
                        }
                    }
                }
            };

            var record = await CassetteRecordRequest.CreateFromRequest(request, null);

            Assert.That(record.Method, Is.EqualTo(request.Method.Method));
            Assert.That(record.Uri, Is.EqualTo(request.RequestUri));
            Assert.That(record.Body, Is.EqualTo(new BytesCassetteBody(Encoding.UTF8.GetBytes("text"))));

            // Host header should be added always
            Assert.That(record.Headers, Has.Count.EqualTo(2));
            Assert.That(record.Headers["Host"], Is.EqualTo(request.RequestUri.IdnHost));
            Assert.That(record.Headers["Content-Type"], Contains.Substring("text/plain").And.Contains("utf-8"));
        }
        public void GetHashCode_DifferentObjectWithSameMethodAndUri_EqualHashCodes()
        {
            var cassetteRecordRequest          = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), new StringCassetteBody("{}"));
            var differentCassetteRecordRequest = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), new StringCassetteBody("{}"));

            Assert.That(differentCassetteRecordRequest.GetHashCode(), Is.EqualTo(cassetteRecordRequest.GetHashCode()));
        }
        public void ToRequestMessage_RecordWithWrongHeader_ThrowsArgumentException()
        {
            var record = new CassetteRecordRequest("GET", new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), "text");

            record.Headers.Add("Does-It-A-Valid-Header?", "No");

            Assert.Throws <ArgumentException>(() => record.ToRequestMessage());
        }
        public void Equals_DifferentObjectWithSameValueAndSameBody_True()
        {
            var cassetteRecordRequest          = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), new StringCassetteBody("{}"));
            var differentCassetteRecordRequest = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), new StringCassetteBody("{}"));

            Assert.That(cassetteRecordRequest.Equals(differentCassetteRecordRequest), Is.True);
            Assert.That(cassetteRecordRequest.Equals((object)differentCassetteRecordRequest), Is.True);
            Assert.That(cassetteRecordRequest == differentCassetteRecordRequest, Is.True);
            Assert.That(cassetteRecordRequest != differentCassetteRecordRequest, Is.False);
        }
        public void Equals_TheSameObject_True()
        {
            var cassetteRecordRequest          = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection());
            var differentCassetteRecordRequest = cassetteRecordRequest;

            Assert.That(cassetteRecordRequest.Equals(differentCassetteRecordRequest), Is.True);
            Assert.That(cassetteRecordRequest.Equals((object)differentCassetteRecordRequest), Is.True);
            Assert.That(cassetteRecordRequest == differentCassetteRecordRequest, Is.True);
            Assert.That(cassetteRecordRequest != differentCassetteRecordRequest, Is.False);
        }
        public void ToRequestMessage_RecordWithoutBody()
        {
            var record = new CassetteRecordRequest("GET", new Uri("http://localhost:5000/api/users/1"), new NameValueCollection());

            var message = record.ToRequestMessage();

            Assert.That(message.Method, Is.EqualTo(HttpMethod.Get));
            Assert.That(message.RequestUri, Is.EqualTo(record.Uri));
            Assert.That(message.Headers.Count(), Is.EqualTo(0));
            Assert.That(message.Content, Is.Null);
        }
        public async Task CreateFromRequest_RequestWithoutBody()
        {
            var request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost:5000/api/users/1"));

            var record = await CassetteRecordRequest.CreateFromRequest(request, null);

            Assert.That(record.Method, Is.EqualTo(request.Method.Method));
            Assert.That(record.Uri, Is.EqualTo(request.RequestUri));
            Assert.That(record.Body, Is.Null);

            // Host header should be added always
            Assert.That(record.Headers, Has.Count.EqualTo(1));
            Assert.That(record.Headers["Host"], Is.EqualTo(request.RequestUri.IdnHost));
        }
        public async Task ToRequestMessage_RecordWithBody()
        {
            var record = new CassetteRecordRequest("GET", new Uri("http://localhost:5000/api/users/1"), new NameValueCollection(), "text");

            record.Headers.Add("Content-Type", "text/plain; charset=utf-8");

            var message = record.ToRequestMessage();

            Assert.That(message.Method, Is.EqualTo(HttpMethod.Get));
            Assert.That(message.RequestUri, Is.EqualTo(record.Uri));
            Assert.That(message.Headers.Count(), Is.EqualTo(0));
            Assert.That(message.Content, Is.TypeOf <StringContent>());
            Assert.That(await message.Content.ReadAsStringAsync(), Is.EqualTo("text"));
            Assert.That(message.Content.Headers.ContentType.MediaType, Is.EqualTo("text/plain"));
            Assert.That(message.Content.Headers.ContentType.CharSet, Is.EqualTo("utf-8"));
        }
        public void Equals_DifferentObjectWithDifferentHeader_False([Values(1, 2, 3, 4)] int headers)
        {
            var cassetteRecordRequest = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:5000/api/users/1"),
                new NameValueCollection
            {
                { "Some-Header", "value" },
            },
                new StringCassetteBody("{}"));
            var differentCassetteRecordRequest = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:5000/api/users/1"),
                new NameValueCollection(),
                new StringCassetteBody("{}"));

            switch (headers)
            {
            case 1:     // Different Value
                differentCassetteRecordRequest.Headers.Add("Some-Header", "other");
                break;

            case 2:     // Different Headers Count
                differentCassetteRecordRequest.Headers.Add("Some-Header", "value");
                differentCassetteRecordRequest.Headers.Add("Some-Other-Header", "other");
                break;

            case 3:     // Different Header Value Count
                differentCassetteRecordRequest.Headers.Add("Some-Header", "value");
                differentCassetteRecordRequest.Headers.Add("Some-Header", "other");
                break;

            case 4:     // Different Headers
                differentCassetteRecordRequest.Headers.Add("Some-Other-Header", "other");
                break;
            }
            ;

            Assert.That(cassetteRecordRequest.Equals(differentCassetteRecordRequest), Is.False);
            Assert.That(cassetteRecordRequest.Equals((object)differentCassetteRecordRequest), Is.False);
            Assert.That(cassetteRecordRequest == differentCassetteRecordRequest, Is.False);
            Assert.That(cassetteRecordRequest != differentCassetteRecordRequest, Is.True);
        }
        public void GetHashCode_SameMethodAndUri_Equal()
        {
            var record1 = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:8080/test"),
                new NameValueCollection
            {
                { "Header1", "Foo" },
            });
            var record2 = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:8080/test"),
                new NameValueCollection
            {
                { "Header2", "Bar" },
            });

            var comparer = new CassetteRecordRequestMethodUriEqualityComparer();

            Assert.That(comparer.GetHashCode(record1), Is.EqualTo(comparer.GetHashCode(record2)));
        }
        public void UseInHashSet_True_Success()
        {
            var record1 = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:8080/test"),
                new NameValueCollection
            {
                { "Header1", "Foo" },
            });
            var record2 = new CassetteRecordRequest(
                HttpMethod.Get.Method,
                new Uri("http://localhost:8080/test"),
                new NameValueCollection
            {
                { "Header2", "Bar" },
            });

            var comparer = new CassetteRecordRequestMethodUriEqualityComparer();
            var hashSet  = new HashSet <CassetteRecordRequest>(comparer);

            Assert.That(hashSet.Add(record1), Is.True);
            Assert.That(hashSet.Add(record2), Is.False);
        }
        public void Equals_String_False()
        {
            var cassetteRecordRequest = new CassetteRecordRequest(HttpMethod.Get.Method, new Uri("http://localhost:5000/api/users/1"), new NameValueCollection());

            Assert.That(cassetteRecordRequest.Equals("String"), Is.False);
        }