public async Task SetHeaderParameters_HasIncomingRequestWithHeader_SetHeaderFromIncoming(string headerKey, string headerValue)
        {
            // arrange
            var fakeRequest = new Mock <HttpRequest>();
            var fakeContext = new Mock <HttpContext>();

            fakeRequest.Setup(x => x.Headers)
            .Returns(new HeaderDictionary()
            {
                new KeyValuePair <string, StringValues>(headerKey, new StringValues(headerValue))
            });

            fakeRequest.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);
            fakeContext.Setup(x => x.Request)
            .Returns(fakeRequest.Object);

            var fakeContextAccessor = new Mock <IHttpContextAccessor>();

            fakeContextAccessor.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);

            var handler = new BaseCompanyRequestHeadersHandler(fakeContextAccessor.Object);

            handler.InnerHandler = new FakeHttpClientHandler();
            var client = new System.Net.Http.HttpClient(handler);

            // act
            var request = new HttpRequestMessage(HttpMethod.Get, "http://0.0.0.0:80");
            await client.SendAsync(request);

            // assert
            Assert.That(request.Headers.GetValues(headerKey)
                        .First(), Is.EqualTo(headerValue));
        }
        public async Task SetHeaderParameters_HasValuesInContext_SetHeaders()
        {
            // arrange
            var fakeContext = new Mock <ICallContext>();

            fakeContext.Setup(x => x.UserId)
            .Returns("hamster");
            fakeContext.Setup(x => x.UserDomain)
            .Returns("Domain");
            fakeContext.Setup(x => x.RequestCallerIp)
            .Returns("0.0.0.0");
            fakeContext.Setup(x => x.AuthorizeInfo)
            .Returns("token");
            fakeContext.Setup(x => x.RequestId)
            .Returns("123");

            var fakeContextFactory = new Mock <ICallContextFactory>();

            fakeContextFactory.Setup(x => x.Create())
            .Returns(fakeContext.Object);

            var handler = new BaseCompanyRequestHeadersHandler(fakeContextFactory.Object)
            {
                InnerHandler = new FakeHttpClientHandler()
            };
            var client = new System.Net.Http.HttpClient(handler);

            // act
            var request = new HttpRequestMessage(HttpMethod.Get, "http://0.0.0.0:80");
            await client.SendAsync(request);

            // assert
            Assert.Multiple(() =>
            {
                Assert.That(request.Headers.GetValues(CompanyHttpHeaders.UserId)
                            .First(), Is.EqualTo(fakeContext.Object.UserId));
                Assert.That(request.Headers.GetValues(CompanyHttpHeaders.UserDomain)
                            .First(), Is.EqualTo(fakeContext.Object.UserDomain));
                Assert.That(request.Headers.GetValues(CompanyHttpHeaders.RequestId)
                            .First(), Is.EqualTo(fakeContext.Object.RequestId));
                Assert.That(request.Headers.GetValues(CompanyHttpHeaders.RequestHeaderCallerIp)
                            .First(), Is.EqualTo(fakeContext.Object.RequestCallerIp));
            });
        }
        public async Task GetCallerIp_HasRequestWithoutCallerIpHeader_SetCallerIpFromConnection()
        {
            // arrange
            var fakeRequest = new Mock <HttpRequest>();

            fakeRequest.Setup(x => x.Headers)
            .Returns(new HeaderDictionary());

            var fakeContext = new Mock <HttpContext>();

            fakeRequest.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);
            fakeContext.Setup(x => x.Request)
            .Returns(fakeRequest.Object);
            var fakeConnectionInfo = new Mock <ConnectionInfo>();

            fakeConnectionInfo.Setup(x => x.RemoteIpAddress)
            .Returns(new IPAddress(123));

            fakeContext.Setup(x => x.Connection)
            .Returns(fakeConnectionInfo.Object);

            var fakeContextAccessor = new Mock <IHttpContextAccessor>();

            fakeContextAccessor.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);

            var handler = new BaseCompanyRequestHeadersHandler(fakeContextAccessor.Object);

            handler.InnerHandler = new FakeHttpClientHandler();
            var client = new System.Net.Http.HttpClient(handler);

            // act
            var request = new HttpRequestMessage(HttpMethod.Get, "http://0.0.0.0:80");
            await client.SendAsync(request);

            // assert
            Assert.That(request.Headers.GetValues(CompanyHttpHeaders.RequestHeaderCallerIp)
                        .First(), Is.EqualTo(new IPAddress(123).ToString()));
        }
        public async Task SetHeaderParameters_DontHaveIncomingRequest_SetDefaultHeaders()
        {
            // arrange
            var fakeRequest = new Mock <HttpRequest>();
            var fakeContext = new Mock <HttpContext>();

            fakeRequest.Setup(x => x.Headers)
            .Returns(new HeaderDictionary());
            fakeRequest.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);
            fakeContext.Setup(x => x.Request)
            .Returns(fakeRequest.Object);

            var fakeContextAccessor = new Mock <IHttpContextAccessor>();

            fakeContextAccessor.Setup(x => x.HttpContext)
            .Returns(fakeContext.Object);

            var handler = new BaseCompanyRequestHeadersHandler(fakeContextAccessor.Object);

            handler.InnerHandler = new FakeHttpClientHandler();
            var client = new System.Net.Http.HttpClient(handler);

            // act
            var request = new HttpRequestMessage(HttpMethod.Get, "http://0.0.0.0:80");
            await client.SendAsync(request);

            // assert
            Assert.That(request.Headers.GetValues(CompanyHttpHeaders.RequestId)
                        .First(), Is.Not.Empty);
            Assert.That(request.Headers.GetValues(CompanyHttpHeaders.UserId)
                        .First(), Is.EqualTo(Environment.UserName));
            Assert.That(request.Headers.GetValues(CompanyHttpHeaders.UserDomain)
                        .First(), Is.EqualTo(Environment.UserDomainName));
            request.Headers.TryGetValues(CompanyHttpHeaders.RequestHeaderCallerIp, out var values);
            Assert.That(values, Is.Null);
        }