public void CallServicesCachedServiceTest()
        {
            Guid serviceGuid = Guid.NewGuid();
            var  serviceInfo = new CachedServiceInfo
            {
                Id = serviceGuid,
            };
            var serviceAndTokenIds = new List <Guid> {
                serviceGuid
            };
            var cacheRegion     = "region";
            var serviceResponse = "Service response";

            var serviceRepository = Substitute.For <IServiceRepository>();
            var dynamicService    = Substitute.For <IDynamicService>();
            var cachedService     = Substitute.For <ICachedService>();
            var staticService     = Substitute.For <IStaticService>();
            var taskScheduler     = Substitute.For <ITaskScheduler>();
            var cache             = Substitute.For <ICache>();

            serviceRepository.GetServicesAndTokens(serviceAndTokenIds).ReturnsForAnyArgs(new[] { serviceInfo });
            cachedService.CallService(serviceInfo, cacheRegion, CancellationToken.None, null)
            .ReturnsForAnyArgs(Task.FromResult(new ServiceResponse
            {
                Value = serviceResponse
            }));

            var sut = new ServiceBrokerService(serviceRepository, dynamicService, cachedService, staticService, taskScheduler, cache);

            ServiceBrokerResponse actual = sut.CallServices(serviceAndTokenIds, cacheRegion, TimeSpan.FromMilliseconds(10));

            serviceRepository.ReceivedWithAnyArgs(1).GetServicesAndTokens(serviceAndTokenIds);

            Assert.AreEqual(1, actual.ServiceResponses.Count());

            ServiceResponse dynamicServiceResponse = actual.ServiceResponses.First();

            Assert.AreEqual(ServiceResponseStatus.Success, dynamicServiceResponse.Status);
            Assert.AreEqual(serviceResponse, dynamicServiceResponse.Value);
        }
        public void GetUserProfileTest()
        {
            Guid service1Id         = Guid.NewGuid();
            Guid service2Id         = Guid.NewGuid();
            Guid token1Id           = Guid.NewGuid();
            Guid token2Id           = Guid.NewGuid();
            var  service1Name       = "Service1";
            var  service2Name       = "Service2";
            var  token1Name         = "Token1";
            var  token2Name         = "Token1";
            var  token1Content      = "content";
            var  cachedService1Info = new CachedServiceInfo
            {
                Id     = service1Id,
                Name   = service1Name,
                Tokens = new []
                {
                    new XPathTokenInfo
                    {
                        Id    = token1Id,
                        Name  = token1Name,
                        XPath = "/node/text()"
                    },
                    new XPathTokenInfo
                    {
                        Id    = token2Id,
                        Name  = token2Name,
                        XPath = "/node/text()"
                    }
                }
            };
            var cachedService2Info = new CachedServiceInfo
            {
                Id     = service2Id,
                Name   = service2Name,
                Tokens = new TokenInfo[0]
            };
            var cacheRegion       = "region";
            var serviceCacheEntry = new CacheEntry <string>
            {
                Value = $"<node>{token1Content}</node>"
            };
            var tokenCacheEntry = new CacheEntry <string>
            {
                Value = token1Content
            };

            var serviceRepository = Substitute.For <IServiceRepository>();
            var dynamicService    = Substitute.For <IDynamicService>();
            var cachedService     = Substitute.For <ICachedService>();
            var staticService     = Substitute.For <IStaticService>();
            var taskScheduler     = Substitute.For <ITaskScheduler>();
            var cache             = Substitute.For <ICache>();

            cache.Get <string>(cacheRegion, service1Id.ToString()).Returns(serviceCacheEntry);
            cache.Get <string>(cacheRegion, token1Id.ToString()).Returns(tokenCacheEntry);

            serviceRepository.GetCachedServices().ReturnsForAnyArgs(new[] { cachedService1Info, cachedService2Info });

            var sut = new ServiceBrokerService(serviceRepository, dynamicService, cachedService, staticService, taskScheduler, cache);

            XDocument profile = sut.GetUserProfile(cacheRegion, false);

            Assert.IsNotNull(profile.Root);

            XNode serviceNode = profile.Root.FirstNode;

            Assert.IsNotNull(serviceNode);

            Assert.AreEqual(XmlNodeType.Element, serviceNode.NodeType);

            var serviceElement = serviceNode as XElement;

            Assert.IsNotNull(serviceElement);

            Assert.AreEqual(service1Name, serviceElement.Name);
        }
        public void SingleCachedServiceTest()
        {
            Guid     serviceId   = Guid.NewGuid();
            Guid     tokenId     = Guid.NewGuid();
            var      cacheRegion = "cacheRegion";
            TimeSpan timeSpan    = TimeSpan.FromMilliseconds(10);

            Guid[] serviceIds  = new[] { serviceId };
            var    endpoint    = "/";
            var    innerText   = "Text";
            var    serviceInfo = new CachedServiceInfo
            {
                Id                 = serviceId,
                Endpoint           = endpoint,
                Timeout            = TimeSpan.FromMilliseconds(5),
                CircuitBreakerInfo = new CircuitBreakerInfo
                {
                    ExceptionCount = 1
                },
                Tokens = new[]
                {
                    new XPathTokenInfo
                    {
                        Id    = tokenId,
                        Name  = "XPath",
                        XPath = "/content/text()"
                    }
                }
            };
            var httpClientResponse = new HttpClientResponse
            {
                HttpStatusCode = System.Net.HttpStatusCode.OK,
                Response       = $"<content>{innerText}</content>"
            };

            var cache             = new CacheMock();
            var httpClientWrapper = Substitute.For <IHttpClientWrapper>();
            var serviceRepository = Substitute.For <IServiceRepository>();
            var taskScheduler     = Substitute.For <ITaskScheduler>();

            serviceRepository.GetServicesAndTokens(serviceIds).Returns(new[] { serviceInfo });
            httpClientWrapper.PostAsync(endpoint, null, CancellationToken.None).ReturnsForAnyArgs(httpClientResponse);

            var tokenService   = new TokenService(cache);
            var dynamicService = new DynamicService(cache, httpClientWrapper, tokenService);
            var cachedService  = new CachedService(cache, httpClientWrapper, tokenService);
            var staticService  = new StaticService(cache, tokenService);
            var serviceBroker  = new ServiceBrokerService(serviceRepository, dynamicService, cachedService, staticService, taskScheduler, cache);

            ServiceBrokerResponse actual = serviceBroker.CallServices(serviceIds, cacheRegion, timeSpan);

            serviceBroker.CallServices(serviceIds, cacheRegion, timeSpan);

            httpClientWrapper.ReceivedWithAnyArgs(1).PostAsync(endpoint, null, CancellationToken.None);

            Assert.IsNotNull(actual);
            Assert.IsNotNull(actual.ServiceResponses);
            Assert.IsTrue(actual.ServiceResponses.Any());

            ServiceResponse serviceResponse = actual.ServiceResponses.First();

            Assert.AreEqual(ServiceResponseStatus.Success, serviceResponse.Status);
            Assert.AreEqual(httpClientResponse.Response, serviceResponse.Value);
            Assert.IsNotNull(serviceResponse.TokenResponses);
            Assert.IsTrue(serviceResponse.TokenResponses.Any());

            TokenResponse tokenResponse = serviceResponse.TokenResponses.First();

            Assert.AreEqual(TokenResponseStatus.Found, tokenResponse.Status);
            Assert.AreEqual(innerText, tokenResponse.Value);
        }