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); }
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/"); }
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); }
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 })); }
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); }
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)); }
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)); } }
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)); } }
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"))); }