Ejemplo n.º 1
0
        public void Ensure_Cache_Is_Correct()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = false
            };

            var umbracoContext         = GetUmbracoContext("/test", 1111, globalSettings: _globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);

            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            var samples = new Dictionary <int, string> {
                { 1046, "/home" },
                { 1173, "/home/sub1" },
                { 1174, "/home/sub1/sub2" },
                { 1176, "/home/sub1/sub-3" },
                { 1177, "/home/sub1/custom-sub-1" },
                { 1178, "/home/sub1/custom-sub-2" },
                { 1175, "/home/sub-2" },
                { 1172, "/test-page" }
            };

            foreach (var sample in samples)
            {
                var result = publishedUrlProvider.GetUrl(sample.Key);
                Assert.AreEqual(sample.Value, result);
            }

            var randomSample = new KeyValuePair <int, string>(1177, "/home/sub1/custom-sub-1");

            for (int i = 0; i < 5; i++)
            {
                var result = publishedUrlProvider.GetUrl(randomSample.Key);
                Assert.AreEqual(randomSample.Value, result);
            }

            var cache = umbracoContext.Content as PublishedContentCache;

            if (cache == null)
            {
                throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported.");
            }
            var cachedRoutes = cache.RoutesCache.GetCachedRoutes();

            Assert.AreEqual(8, cachedRoutes.Count);

            foreach (var sample in samples)
            {
                Assert.IsTrue(cachedRoutes.ContainsKey(sample.Key));
                Assert.AreEqual(sample.Value, cachedRoutes[sample.Key]);
            }

            var cachedIds = cache.RoutesCache.GetCachedIds();

            Assert.AreEqual(0, cachedIds.Count);
        }
Ejemplo n.º 2
0
        public async Task DoNotPolluteCache()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };

            GlobalSettings.HideTopLevelNodeFromPath = false;

            SetDomains1();

            const string url = "http://domain1.com/1001-1/1001-1-1";

            // get the nice URL for 100111
            var umbracoContextAccessor = GetUmbracoContextAccessor(url);
            var umbracoContext         = umbracoContextAccessor.GetRequiredUmbracoContext();

            var urlProvider = new DefaultUrlProvider(
                Mock.Of <IOptionsMonitor <RequestHandlerSettings> >(x => x.CurrentValue == requestHandlerSettings),
                Mock.Of <ILogger <DefaultUrlProvider> >(),
                new SiteDomainMapper(),
                umbracoContextAccessor,
                new UriUtility(Mock.Of <IHostingEnvironment>()),
                Mock.Of <ILocalizationService>());
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            string absUrl = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute);

            Assert.AreEqual("http://domain2.com/1001-1-1/", absUrl);

            const string cacheKeyPrefix = "NuCache.ContentCache.RouteByContent";

            // check that the proper route has been cached
            var cache = (FastDictionaryAppCache)umbracoContext.PublishedSnapshot.ElementsCache;

            var cachedRoutes = cache.Keys.Where(x => x.StartsWith(cacheKeyPrefix)).ToList();
            var cacheKey     = $"{cacheKeyPrefix}[P:100111]";

            Assert.AreEqual("10011/1001-1-1", cache.Get(cacheKey));

            // route a rogue URL
            var publishedRouter = CreatePublishedRouter(umbracoContextAccessor);
            var frequest        = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);

            publishedRouter.FindDomain(frequest);
            Assert.IsTrue(frequest.HasDomain());

            // check that it's been routed
            var lookup = new ContentFinderByUrl(Mock.Of <ILogger <ContentFinderByUrl> >(), umbracoContextAccessor);
            var result = await lookup.TryFindContent(frequest);

            Assert.IsTrue(result);
            Assert.AreEqual(100111, frequest.PublishedContent.Id);

            // has the cache been polluted?
            cachedRoutes = cache.Keys.Where(x => x.StartsWith(cacheKeyPrefix)).ToList();
            Assert.AreEqual("10011/1001-1-1", cache.Get(cacheKey)); // no

            // what's the nice URL now?
            Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good
        }
        public void Get_Url_Alternate()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };
            var globalSettings = new GlobalSettings {
                HideTopLevelNodeFromPath = false
            };

            var umbracoContext         = GetUmbracoContext("http://domain1.com/en/test", 1111, globalSettings: globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            SetDomains5();

            var url = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute);

            Assert.AreEqual("http://domain1.com/en/1001-1-1/", url);

            var result = publishedUrlProvider.GetOtherUrls(100111).ToArray();

            foreach (var x in result)
            {
                Console.WriteLine(x);
            }

            Assert.AreEqual(2, result.Length);
            Assert.AreEqual(result[0].Text, "http://domain1b.com/en/1001-1-1/");
            Assert.AreEqual(result[1].Text, "http://domain1a.com/en/1001-1-1/");
        }
Ejemplo n.º 4
0
        public void Get_Url_For_Culture_Variant_With_Current_Url()
        {
            const string currentUri = "http://example.fr/test";

            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };

            var contentType      = new PublishedContentType(Guid.NewGuid(), 666, "alias", PublishedItemType.Content, Enumerable.Empty <string>(), Enumerable.Empty <PublishedPropertyType>(), ContentVariation.Culture);
            var publishedContent = new SolidPublishedContent(contentType)
            {
                Id = 1234
            };

            var publishedContentCache = new Mock <IPublishedContentCache>();

            publishedContentCache.Setup(x => x.GetRouteById(1234, "fr-FR"))
            .Returns("9876/home/test-fr");     //prefix with the root id node with the domain assigned as per the umbraco standard
            publishedContentCache.Setup(x => x.GetById(It.IsAny <int>()))
            .Returns <int>(id => id == 1234 ? publishedContent : null);

            var domainCache = new Mock <IDomainCache>();

            domainCache.Setup(x => x.GetAssigned(It.IsAny <int>(), false))
            .Returns((int contentId, bool includeWildcards) =>
            {
                if (contentId != 9876)
                {
                    return(Enumerable.Empty <Domain>());
                }
                return(new[]
                {
                    new Domain(2, "example.us", 9876, "en-US", false),     //default
                    new Domain(3, "example.fr", 9876, "fr-FR", false)
                });
            });
            domainCache.Setup(x => x.DefaultCulture).Returns(CultureInfo.GetCultureInfo("en-US").Name);

            var snapshot = Mock.Of <IPublishedSnapshot>(x => x.Content == publishedContentCache.Object && x.Domains == domainCache.Object);

            var snapshotService = new Mock <IPublishedSnapshotService>();

            snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny <string>()))
            .Returns(snapshot);

            var umbracoContext = GetUmbracoContext(currentUri,
                                                   globalSettings: _globalSettings,
                                                   snapshotService: snapshotService.Object);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);

            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR");

            Assert.AreEqual("/home/test-fr/", url);
        }
        public void Get_Url_Relative_Or_Absolute()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };
            var globalSettings = new GlobalSettings {
                HideTopLevelNodeFromPath = false
            };

            var umbracoContext         = GetUmbracoContext("http://domain1.com/test", 1111, globalSettings: globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            SetDomains4();

            Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111));
            Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311));

            publishedUrlProvider.Mode = UrlMode.Absolute;

            Assert.AreEqual("http://domain1.com/en/1001-1-1/", publishedUrlProvider.GetUrl(100111));
            Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311));
        }
        public void Get_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected)
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };
            var globalSettings = new GlobalSettings {
                HideTopLevelNodeFromPath = false
            };

            var umbracoContext         = GetUmbracoContext("/test", 1111, globalSettings: globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            SetDomains4();

            var currentUri = new Uri(currentUrl);
            var mode       = absolute ? UrlMode.Absolute : UrlMode.Auto;
            var result     = publishedUrlProvider.GetUrl(nodeId, mode, current: currentUri);

            Assert.AreEqual(expected, result);
        }
Ejemplo n.º 7
0
        public async Task DoNotPolluteCache()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };
            var globalSettings = new GlobalSettings {
                HideTopLevelNodeFromPath = false
            };

            SetDomains1();

            const string url = "http://domain1.com/1001-1/1001-1-1";

            // get the nice URL for 100111
            var umbracoContext         = GetUmbracoContext(url, 9999, globalSettings: globalSettings);
            var umbracoContextAccessor = GetUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Absolute));

            // check that the proper route has been cached
            var cache = umbracoContext.Content as PublishedContentCache;

            if (cache == null)
            {
                throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported.");
            }
            var cachedRoutes = cache.RoutesCache.GetCachedRoutes();

            Assert.AreEqual("10011/1001-1-1", cachedRoutes[100111]);

            // route a rogue URL
            var publishedRouter = CreatePublishedRouter(umbracoContextAccessor);
            var frequest        = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);

            publishedRouter.FindDomain(frequest);
            Assert.IsTrue(frequest.HasDomain());

            // check that it's been routed
            var lookup = new ContentFinderByUrl(LoggerFactory.CreateLogger <ContentFinderByUrl>(), GetUmbracoContextAccessor(umbracoContext));
            var result = lookup.TryFindContent(frequest);

            Assert.IsTrue(result);
            Assert.AreEqual(100111, frequest.PublishedContent.Id);

            // has the cache been polluted?
            cachedRoutes = cache.RoutesCache.GetCachedRoutes();
            Assert.AreEqual("10011/1001-1-1", cachedRoutes[100111]); // no
            //Assert.AreEqual("1001/1001-1/1001-1-1", cachedRoutes[100111]); // yes

            // what's the nice URL now?
            Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good
            //Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad
        }
        private Uri UmbracoAssembleUrl(DomainAndUri domainUri, string path, Uri current, UrlProviderMode mode)
        {
            // This method is private in umbraco, but we want to use their!
            DefaultUrlProvider provider = ActivatorHelper.CreateInstance <DefaultUrlProvider>();

            return(ActivatorHelper.GetPrivateMethodReturnValueOfInstance <Uri>(
                       instance: provider,
                       methodName: "AssembleUrl",
                       methodArguments: new object[] { domainUri, path, current, mode }));
        }
Ejemplo n.º 9
0
        public async Task Invariant_Child_Content_Published_No_Domains()
        {
            var contentType = MockedContentTypes.CreateBasicContentType();
            var parent      = MockedContent.CreateBasicContent(contentType);

            parent.Id        = 1046; // FIXME: we are using this ID only because it's built into the test XML published cache
            parent.Name      = "home";
            parent.Path      = "-1,1046";
            parent.Published = true;
            var child = MockedContent.CreateBasicContent(contentType);

            child.Name      = "sub1";
            child.Id        = 1173; // FIXME: we are using this ID only because it's built into the test XML published cache
            child.Path      = "-1,1046,1173";
            child.Published = true;

            var umbContext             = GetUmbracoContext("http://localhost:8000");
            var umbracoContextAccessor = GetUmbracoContextAccessor(umbContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(_requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = new UrlProvider(
                umbracoContextAccessor,
                Microsoft.Extensions.Options.Options.Create(_webRoutingSettings),
                new UrlProviderCollection(new [] { urlProvider }),
                new MediaUrlProviderCollection(Enumerable.Empty <IMediaUrlProvider>()),
                Mock.Of <IVariationContextAccessor>()
                );

            var publishedRouter = CreatePublishedRouter(
                umbracoContextAccessor,
                Factory,
                contentFinders: new ContentFinderCollection(new[] { new ContentFinderByUrl(LoggerFactory.CreateLogger <ContentFinderByUrl>(), umbracoContextAccessor) }));
            var urls = (await child.GetContentUrlsAsync(publishedRouter,
                                                        umbContext,
                                                        GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService,
                                                        VariationContextAccessor,
                                                        LoggerFactory.CreateLogger <IContent>(),
                                                        UriUtility,
                                                        publishedUrlProvider
                                                        )).ToList();

            Assert.AreEqual(1, urls.Count);
            Assert.AreEqual("/home/sub1/", urls[0].Text);
            Assert.AreEqual("en-US", urls[0].Culture);
            Assert.IsTrue(urls[0].IsUrl);
        }
        [TestCase(1172, "/test-page/")] // not hidden because not first root
        public void Get_Url_Hiding_Top_Level(int nodeId, string niceUrlMatch)
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };

            var umbracoContext         = GetUmbracoContext("/test", 1111, globalSettings: _globalSettings, snapshotService: PublishedSnapshotService);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            var result = publishedUrlProvider.GetUrl(nodeId);

            Assert.AreEqual(niceUrlMatch, result);
        }
Ejemplo n.º 11
0
        public void Get_Url_Unpublished()
        {
            var requestHandlerSettings = new RequestHandlerSettings();

            var urlProvider = new DefaultUrlProvider(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                                                     LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                                                     new SiteDomainMapper(), UmbracoContextAccessor, UriUtility);
            var umbracoContext       = GetUmbracoContext("http://example.com/test", 1111, globalSettings: _globalSettings);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            //mock the Umbraco settings that we need

            Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999));

            publishedUrlProvider.Mode = UrlMode.Absolute;

            Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999));
        }
Ejemplo n.º 12
0
        public void Get_Url_Relative_Or_Absolute()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };

            var umbracoContext         = GetUmbracoContext("http://example.com/test", 1111, globalSettings: _globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            Assert.AreEqual("/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177));

            publishedUrlProvider.Mode = UrlMode.Absolute;
            Assert.AreEqual("http://example.com/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177));
        }
        public void Should_AddTwoUrls_WhenControllerAddedToTree()
        {
            MockRepository mocks = new MockRepository();

            IUrlTokenizer tokenizer = mocks.DynamicMock<IUrlTokenizer>();
            IControllerTree controllerTree = new DefaultControllerTree();

            StubServiceProvider serviceProvider = new StubServiceProvider(tokenizer, controllerTree);

            DefaultUrlProvider provider = new DefaultUrlProvider();
            provider.Service(serviceProvider);

            using (mocks.Record())
            {
                tokenizer.AddDefaultRule("area/controller.rails", "area", "controller", "collection");
                tokenizer.AddDefaultRule("/area/controller.rails", "area","controller", "collection");
            }

            using (mocks.Playback())
            {
                controllerTree.AddController("area", "controller", typeof(SampleRestController));
            }
        }
Ejemplo n.º 14
0
        public void Should_AddTwoUrls_WhenControllerAddedToTree()
        {
            MockRepository mocks = new MockRepository();

            IUrlTokenizer   tokenizer      = mocks.DynamicMock <IUrlTokenizer>();
            IControllerTree controllerTree = new DefaultControllerTree();

            StubServiceProvider serviceProvider = new StubServiceProvider(tokenizer, controllerTree);

            DefaultUrlProvider provider = new DefaultUrlProvider();

            provider.Service(serviceProvider);

            using (mocks.Record())
            {
                tokenizer.AddDefaultRule("area/controller.rails", "area", "controller", "collection");
                tokenizer.AddDefaultRule("/area/controller.rails", "area", "controller", "collection");
            }

            using (mocks.Playback())
            {
                controllerTree.AddController("area", "controller", typeof(SampleRestController));
            }
        }
Ejemplo n.º 15
0
    private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider)
    {
        var webRoutingSettings = new WebRoutingSettings();

        return(new UrlProvider(
                   new TestUmbracoContextAccessor(umbracoContext),
                   Options.Create(webRoutingSettings),
                   new UrlProviderCollection(() => new[] { urlProvider }),
                   new MediaUrlProviderCollection(() => Enumerable.Empty <IMediaUrlProvider>()),
                   Mock.Of <IVariationContextAccessor>()));
    }
        public void Get_Url_DomainsAndCache()
        {
            var requestHandlerSettings = new RequestHandlerSettings {
                AddTrailingSlash = true
            };
            var globalSettings = new GlobalSettings {
                HideTopLevelNodeFromPath = false
            };

            var umbracoContext         = GetUmbracoContext("/test", 1111, globalSettings: globalSettings);
            var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
            var urlProvider            = new DefaultUrlProvider(
                Microsoft.Extensions.Options.Options.Create(requestHandlerSettings),
                LoggerFactory.CreateLogger <DefaultUrlProvider>(),
                new SiteDomainMapper(), umbracoContextAccessor, UriUtility);
            var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);

            SetDomains4();

            string ignore;

            ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"));
            ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com"));
            ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com"));
            ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com"));
            ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com"));

            var cache = umbracoContext.Content as PublishedContentCache;

            if (cache == null)
            {
                throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported.");
            }
            var cachedRoutes = cache.RoutesCache.GetCachedRoutes();

            Assert.AreEqual(7, cachedRoutes.Count);

            var cachedIds = cache.RoutesCache.GetCachedIds();

            Assert.AreEqual(0, cachedIds.Count);

            CheckRoute(cachedRoutes, cachedIds, 1001, "1001/");
            CheckRoute(cachedRoutes, cachedIds, 10011, "10011/");
            CheckRoute(cachedRoutes, cachedIds, 100111, "10011/1001-1-1");
            CheckRoute(cachedRoutes, cachedIds, 10012, "10012/");
            CheckRoute(cachedRoutes, cachedIds, 100121, "10012/1001-2-1");
            CheckRoute(cachedRoutes, cachedIds, 10013, "1001/1001-3");
            CheckRoute(cachedRoutes, cachedIds, 1002, "/1002");

            // use the cache
            Assert.AreEqual("/", publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/en/", publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/fr/", publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/1001-3/", publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")));
            Assert.AreEqual("/1002/", publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")));

            Assert.AreEqual("http://domain1.com/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com")));
        }