public void RssWriterProducesValidFeedWithEnclosureFromDatabase() { string hostName = UnitTestHelper.GenerateUniqueString() + ".com"; Config.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, NullValue.NullDateTime); entry.DateCreated = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture); entry.DateSyndicated = entry.DateCreated; int entryId = UnitTestHelper.Create(entry); //persist to db. string enclosureUrl = "http://perseus.franklins.net/hanselminutes_0107.mp3"; string enclosureMimeType = "audio/mp3"; long enclosureSize = 26707573; Enclosure enc = UnitTestHelper.BuildEnclosure("<Digital Photography Explained (for Geeks) with Aaron Hockley/>", enclosureUrl, enclosureMimeType, entryId, enclosureSize, true, true); Enclosures.Create(enc); var subtextContext = new Mock <ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item nodes."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the title."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("link").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("guid").InnerText, "Not what we expected for the guid."); Assert.AreEqual(enclosureUrl, itemNodes[0].SelectSingleNode("enclosure/@url").InnerText, "Not what we expected for the enclosure url."); Assert.AreEqual(enclosureMimeType, itemNodes[0].SelectSingleNode("enclosure/@type").InnerText, "Not what we expected for the enclosure mimetype."); Assert.AreEqual(enclosureSize.ToString(), itemNodes[0].SelectSingleNode("enclosure/@length").InnerText, "Not what we expected for the enclosure size."); Assert.AreEqual(expectedUrl + "#feedback", itemNodes[0].SelectSingleNode("comments").InnerText, "Not what we expected for the link."); }
public void RssImageUrlConcatenatedProperly(string application, string subfolder, string expected) { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", subfolder, application); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = subfolder; blogInfo.Title = "My Blog Is Better Than Yours"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", application, null); Mock <HttpContextBase> httpContext = Mock.Get(subtextContext.Object.RequestContext.HttpContext); httpContext.Setup(h => h.Request.ApplicationPath).Returns(application); var writer = new RssWriter(new StringWriter(), new List <Entry>(), DateTime.Now, false, subtextContext.Object); Uri rssImageUrl = writer.GetRssImage(); Assert.AreEqual(expected, rssImageUrl.ToString(), "not the expected url."); }
public void CommentRssWriterProducesValidEmptyFeed() { var blogInfo = new Blog(); blogInfo.Host = "localhost"; blogInfo.Subfolder = "blog"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.Title = "My Blog Rulz"; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blogInfo, "haacked", "title of the post", "Body of the post."); entry.EntryName = "titleofthepost"; entry.DateCreatedUtc = entry.DatePublishedUtc = entry.DateModifiedUtc = DateTime.ParseExact("2006/04/01", "yyyy/MM/dd", CultureInfo.InvariantCulture); var context = new Mock<ISubtextContext>(); context.FakeSyndicationContext(blogInfo, "/", null); Mock<BlogUrlHelper> urlHelper = Mock.Get(context.Object.UrlHelper); urlHelper.Setup(url => url.EntryUrl(It.IsAny<Entry>())).Returns( "/blog/archive/2006/04/01/titleofthepost.aspx"); var writer = new CommentRssWriter(new StringWriter(), new List<FeedbackItem>(), entry, context.Object); Assert.IsTrue(entry.HasEntryName, "This entry should have an entry name."); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>title of the post</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/blog/archive/2006/04/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(2) + @"<description>Body of the post.</description>" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>title of the post</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/blog/archive/2006/04/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(1) + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); Assert.AreEqual(expected, writer.Xml); }
public void RssHandlerHandlesDatePublishedUtcProperly() { // arrange string hostName = UnitTestHelper.GenerateUniqueHostname(); var repository = new DatabaseObjectProvider(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); repository.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); //Create two entries, but only include one in main syndication. Entry entryForSyndication = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking"); UnitTestHelper.Create(entryForSyndication); Entry entryTwoForSyndication = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2"); int id = UnitTestHelper.Create(entryTwoForSyndication); Entry entry = UnitTestHelper.GetEntry(id, PostConfig.None, false); DateTime date = entry.DatePublishedUtc; entry.IncludeInMainSyndication = false; entry.Blog = new Blog() { Title = "MyTestBlog" }; var subtextContext = new Mock<ISubtextContext>(); subtextContext.Setup(c => c.Blog).Returns(Config.CurrentBlog); subtextContext.Setup(c => c.Repository).Returns(repository); UnitTestHelper.Update(entry, subtextContext.Object); Assert.AreEqual(date, entry.DatePublishedUtc); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); Mock<BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item node."); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); //Include the second entry back in the syndication. entry.IncludeInMainSyndication = true; UnitTestHelper.Update(entry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, "", ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "Expected two items in the feed now."); }
public void RssHandlerHandlesDoesNotSyndicateFuturePosts() { // Setup string hostName = UnitTestHelper.GenerateUniqueHostname(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); Config.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Config.CurrentBlog.TimeZoneId = TimeZonesTest.HawaiiTimeZoneId; //Create two entries, but only include one in main syndication. UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking", null, NullValue.NullDateTime)); Entry futureEntry = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2", null, NullValue.NullDateTime); futureEntry.DateSyndicated = Config.CurrentBlog.TimeZone.Now.AddMinutes(20); UnitTestHelper.Create(futureEntry); string rssOutput = null; var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item node."); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); Config.CurrentBlog.TimeZoneId = TimeZonesTest.PacificTimeZoneId; UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); subtextContext = new Mock <ISubtextContext>(); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "Expected two items in the feed now."); }
public void AtomWriterProducesValidFeedFromDatabase() { string hostName = UnitTestHelper.GenerateUniqueString(); var repository = new DatabaseObjectProvider(); repository.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; DateTime dateCreated = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime(); Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, dateCreated); UnitTestHelper.Create(entry); //persist to db. var subtextContext = new Mock <ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); Mock <BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); var handler = new AtomHandler(subtextContext.Object); handler.ProcessRequest(); HttpContext.Current.Response.Flush(); var doc = new XmlDocument(); doc.LoadXml(rssOutput); var nsmanager = new XmlNamespaceManager(doc.NameTable); nsmanager.AddNamespace("atom", "http://www.w3.org/2005/Atom"); XmlNodeList itemNodes = doc.SelectNodes("/atom:feed/atom:entry", nsmanager); Assert.AreEqual(1, itemNodes.Count, "expected one entry node."); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("atom:title", nsmanager).InnerText, "Not what we expected for the title."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("atom:id", nsmanager).InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("atom:link/@href", nsmanager).InnerText, "Not what we expected for the link."); }
public void CommentRssHandlerProducesValidEmptyFeed() { string hostName = UnitTestHelper.GenerateUniqueHostname(); //BlogInfo blog = new BlogInfo { // Host = hostName, // Email = "*****@*****.**", // RFC3229DeltaEncodingEnabled = false, //}; int blogId = Config.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Blog blog = Config.CurrentBlog; blog.Host = hostName; blog.Email = "*****@*****.**"; blog.RFC3229DeltaEncodingEnabled = false; DateTime dateCreated = DateTime.Now; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blog, "Author", "Best post EVER", "testbody", null, dateCreated); var repository = new Mock <ObjectProvider>(); repository.Setup(r => r.GetEntry(It.IsAny <int>(), true, true)).Returns(entry); int id = UnitTestHelper.Create(entry); //persist to db. string rssOutput = null; var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blog, "/" + id + ".aspx", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository.Object); subtextContext.Object.RequestContext.RouteData.Values.Add("id", id.ToString()); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever/entry"); var handler = new RssCommentHandler(subtextContext.Object); handler.ProcessRequest(); var doc = new XmlDocument(); doc.LoadXml(rssOutput); XmlNodeList titleNodes = doc.SelectNodes("/rss/channel/title"); Assert.IsNotNull(titleNodes, "The title node should not be null."); Assert.AreEqual("Best post EVER", titleNodes[0].InnerText, "Did not get the expected value of the title node."); }
public void RssWriterProducesValidFeedFromDatabase() { var repository = new DatabaseObjectProvider(); string hostName = UnitTestHelper.GenerateUniqueHostname(); repository.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, NullValue.NullDateTime); entry.DateCreatedUtc = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime(); entry.DatePublishedUtc = entry.DateCreatedUtc; UnitTestHelper.Create(entry); //persist to db. string rssOutput = null; var subtextContext = new Mock <ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(repository); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); Mock <BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item nodes."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the title."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("link").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("guid").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl + "#feedback", itemNodes[0].SelectSingleNode("comments").InnerText, "Not what we expected for the link."); }
public void AtomWriterProducesValidFeedFromDatabase() { string hostName = UnitTestHelper.GenerateUniqueString(); var repository = new DatabaseObjectProvider(); repository.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; DateTime dateCreated = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime(); Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, dateCreated); UnitTestHelper.Create(entry); //persist to db. var subtextContext = new Mock<ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); Mock<BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); var handler = new AtomHandler(subtextContext.Object); handler.ProcessRequest(); HttpContext.Current.Response.Flush(); var doc = new XmlDocument(); doc.LoadXml(rssOutput); var nsmanager = new XmlNamespaceManager(doc.NameTable); nsmanager.AddNamespace("atom", "http://www.w3.org/2005/Atom"); XmlNodeList itemNodes = doc.SelectNodes("/atom:feed/atom:entry", nsmanager); Assert.AreEqual(1, itemNodes.Count, "expected one entry node."); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("atom:title", nsmanager).InnerText, "Not what we expected for the title."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("atom:id", nsmanager).InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("atom:link/@href", nsmanager).InnerText, "Not what we expected for the link."); }
public void CommentRssHandlerProducesValidEmptyFeed() { string hostName = UnitTestHelper.GenerateUniqueHostname(); //BlogInfo blog = new BlogInfo { // Host = hostName, // Email = "*****@*****.**", // RFC3229DeltaEncodingEnabled = false, //}; int blogId = new DatabaseObjectProvider().CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, string.Empty); BlogRequest.Current.Blog = new DatabaseObjectProvider().GetBlog(hostName, string.Empty); Blog blog = Config.CurrentBlog; blog.Host = hostName; blog.Email = "*****@*****.**"; blog.RFC3229DeltaEncodingEnabled = false; DateTime dateCreated = DateTime.UtcNow; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blog, "Author", "Best post EVER", "testbody", null, dateCreated); var repository = new Mock<ObjectRepository>(); repository.Setup(r => r.GetEntry(It.IsAny<int>(), true, true)).Returns(entry); int id = UnitTestHelper.Create(entry); //persist to db. string rssOutput = null; var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blog, "/" + id + ".aspx", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository.Object); subtextContext.Object.RequestContext.RouteData.Values.Add("id", id.ToString()); Mock<BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever/entry"); var handler = new RssCommentHandler(subtextContext.Object); handler.ProcessRequest(); var doc = new XmlDocument(); doc.LoadXml(rssOutput); XmlNodeList titleNodes = doc.SelectNodes("/rss/channel/title"); Assert.IsNotNull(titleNodes, "The title node should not be null."); Assert.AreEqual("Best post EVER", titleNodes[0].InnerText, "Did not get the expected value of the title node."); }
public void RssHandlerProducesValidRssFeed() { string hostName = UnitTestHelper.GenerateUniqueHostname(); var repository = new DatabaseObjectProvider(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); repository.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking")); Thread.Sleep(50); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2")); var subtextContext = new Mock <ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); Mock <BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "expected two item nodes."); Assert.AreEqual("Title Test 2", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); Assert.AreEqual("Title Test", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking Pt 2", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking pt 2".Length), "Not what we expected for the second body."); Assert.AreEqual("Body Rocking", itemNodes[1].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); }
public void RssImageUrlConcatenatedProperly(string application, string subfolder, string expected) { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", subfolder, application); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = subfolder; blogInfo.Title = "My Blog Is Better Than Yours"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", application, null); Mock<HttpContextBase> httpContext = Mock.Get(subtextContext.Object.RequestContext.HttpContext); httpContext.Setup(h => h.Request.ApplicationPath).Returns(application); var writer = new RssWriter(new StringWriter(), new List<Entry>(), DateTime.Now, false, subtextContext.Object); Uri rssImageUrl = writer.GetRssImage(); Assert.AreEqual(expected, rssImageUrl.ToString(), "not the expected url."); }
public void RssWriterProducesValidFeedFromDatabase() { string hostName = UnitTestHelper.GenerateUniqueHostname(); Config.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, NullValue.NullDateTime); entry.DateCreated = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture); entry.DateSyndicated = entry.DateCreated; UnitTestHelper.Create(entry); //persist to db. string rssOutput = null; var subtextContext = new Mock<ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item nodes."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the title."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("link").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("guid").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl + "#feedback", itemNodes[0].SelectSingleNode("comments").InnerText, "Not what we expected for the link."); }
public void RssWriterProducesValidFeedWithEnclosureFromDatabase() { string hostName = UnitTestHelper.GenerateUniqueString() + ".com"; Config.CreateBlog("Test", "username", "password", hostName, string.Empty); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Config.CurrentBlog.Email = "*****@*****.**"; Config.CurrentBlog.RFC3229DeltaEncodingEnabled = false; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication("Author", "testtitle", "testbody", null, NullValue.NullDateTime); entry.DateCreated = DateTime.ParseExact("2008/01/23", "yyyy/MM/dd", CultureInfo.InvariantCulture); entry.DateSyndicated = entry.DateCreated; int entryId = UnitTestHelper.Create(entry); //persist to db. string enclosureUrl = "http://perseus.franklins.net/hanselminutes_0107.mp3"; string enclosureMimeType = "audio/mp3"; long enclosureSize = 26707573; Enclosure enc = UnitTestHelper.BuildEnclosure("<Digital Photography Explained (for Geeks) with Aaron Hockley/>", enclosureUrl, enclosureMimeType, entryId, enclosureSize, true, true); Enclosures.Create(enc); var subtextContext = new Mock<ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/archive/2008/01/23/testtitle.aspx"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item nodes."); string urlFormat = "http://{0}/archive/2008/01/23/{1}.aspx"; string expectedUrl = string.Format(urlFormat, hostName, "testtitle"); Assert.AreEqual("testtitle", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the title."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("link").InnerText, "Not what we expected for the link."); Assert.AreEqual(expectedUrl, itemNodes[0].SelectSingleNode("guid").InnerText, "Not what we expected for the guid."); Assert.AreEqual(enclosureUrl, itemNodes[0].SelectSingleNode("enclosure/@url").InnerText, "Not what we expected for the enclosure url."); Assert.AreEqual(enclosureMimeType, itemNodes[0].SelectSingleNode("enclosure/@type").InnerText, "Not what we expected for the enclosure mimetype."); Assert.AreEqual(enclosureSize.ToString(), itemNodes[0].SelectSingleNode("enclosure/@length").InnerText, "Not what we expected for the enclosure size."); Assert.AreEqual(expectedUrl + "#feedback", itemNodes[0].SelectSingleNode("comments").InnerText, "Not what we expected for the link."); }
public void RssHandlerProducesValidRssFeed() { string hostName = UnitTestHelper.GenerateUniqueHostname(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); Config.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking")); Thread.Sleep(50); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2")); var subtextContext = new Mock<ISubtextContext>(); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "expected two item nodes."); Assert.AreEqual("Title Test 2", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); Assert.AreEqual("Title Test", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking Pt 2", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking pt 2".Length), "Not what we expected for the second body."); Assert.AreEqual("Body Rocking", itemNodes[1].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); }
public void RssHandlerSortsByDateSyndicated() { // Setup string hostName = UnitTestHelper.GenerateUniqueHostname(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); Config.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); //Create two entries. int firstId = UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking")); Thread.Sleep(1000); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2")); var subtextContext = new Mock<ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); //Expect the first item to be the second entry. Assert.AreEqual("Title Test 2", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Title Test", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); //Remove first entry from syndication. Entry firstEntry = UnitTestHelper.GetEntry(firstId, PostConfig.None, false); firstEntry.IncludeInMainSyndication = false; firstEntry.Blog = new Blog() { Title = "MyTestBlog" }; UnitTestHelper.Update(firstEntry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); subtextContext = new Mock<ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "Here we were expeting only one item"); Thread.Sleep(10); //Now add it back in changing the DateSyndicated firstEntry.IncludeInMainSyndication = true; firstEntry.DateSyndicated = Config.CurrentBlog.TimeZone.Now; UnitTestHelper.Update(firstEntry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); subtextContext = new Mock<ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); //Expect the second item to be the second entry. Assert.AreEqual(2, itemNodes.Count, "Here we were expeting 2 items"); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Title Test 2", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); }
public void CommentRssWriterProducesValidEmptyFeed() { var blogInfo = new Blog(); blogInfo.Host = "localhost"; blogInfo.Subfolder = "blog"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.Title = "My Blog Rulz"; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blogInfo, "haacked", "title of the post", "Body of the post."); entry.EntryName = "titleofthepost"; entry.DateCreated = entry.DateSyndicated = entry.DateModified = DateTime.ParseExact("2006/04/01", "yyyy/MM/dd", CultureInfo.InvariantCulture); var context = new Mock <ISubtextContext>(); context.FakeSyndicationContext(blogInfo, "/", null); Mock <UrlHelper> urlHelper = Mock.Get(context.Object.UrlHelper); urlHelper.Setup(url => url.EntryUrl(It.IsAny <Entry>())).Returns( "/blog/archive/2006/04/01/titleofthepost.aspx"); var writer = new CommentRssWriter(new StringWriter(), new List <FeedbackItem>(), entry, context.Object); Assert.IsTrue(entry.HasEntryName, "This entry should have an entry name."); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>title of the post</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/blog/archive/2006/04/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(2) + @"<description>Body of the post.</description>" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>title of the post</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/blog/archive/2006/04/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(1) + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); Assert.AreEqual(expected, writer.Xml); }
public void CommentRssWriterProducesValidFeed() { var blogInfo = new Blog(); blogInfo.Host = "localhost"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.Title = "My Blog Rulz"; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blogInfo, "haacked", "title of the post", "Body of the post."); entry.EntryName = "titleofthepost"; entry.DateCreatedUtc = entry.DatePublishedUtc = entry.DateModifiedUtc = DateTime.ParseExact("2006/01/30 02:00", "yyyy/MM/dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime(); entry.Id = 1001; var comment = new FeedbackItem(FeedbackType.Comment); comment.Id = 1002; comment.DateCreatedUtc = comment.DateModifiedUtc = DateTime.ParseExact("2006/02/01 08:00", "yyyy/MM/dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime(); comment.Title = "re: titleofthepost"; comment.ParentEntryName = entry.EntryName; comment.ParentDateCreatedUtc = entry.DateCreatedUtc; comment.Body = "<strong>I rule!</strong>"; comment.Author = "Jane Schmane"; comment.Email = "*****@*****.**"; comment.EntryId = entry.Id; var comments = new List<FeedbackItem>(); comments.Add(comment); var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/Subtext.Web/Whatever", "Subtext.Web", null); Mock<HttpContextBase> httpContext = Mock.Get(subtextContext.Object.RequestContext.HttpContext); httpContext.Setup(c => c.Request.ApplicationPath).Returns("/Subtext.Web"); Mock<BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.FeedbackUrl(It.IsAny<FeedbackItem>())).Returns( "/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#" + comment.Id); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns( "/Subtext.Web/archive/2006/02/01/titleofthepost.aspx"); var writer = new CommentRssWriter(new StringWriter(), comments, entry, subtextContext.Object); Assert.IsTrue(entry.HasEntryName, "This entry should have an entry name."); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>title of the post</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(2) + @"<description>Body of the post.</description>" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>title of the post</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>re: titleofthepost</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#1002</link>" + Environment.NewLine + indent(3) + @"<description><strong>I rule!</strong></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Jane Schmane</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#1002</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Wed, 01 Feb 2006 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent() + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); // Act string rss = writer.Xml; // Assert UnitTestHelper.AssertStringsEqualCharacterByCharacter(expected, rss); }
public void RssWriterProducesValidFeed() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Title = "My Blog Is Better Than Yours"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; blogInfo.ShowEmailAddressInRss = true; blogInfo.TrackbacksEnabled = true; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List <Entry>(CreateSomeEntries()); entries[0].Categories.AddRange(new[] { "Category1", "Category2" }); entries[0].Email = "*****@*****.**"; entries[2].Categories.Add("Category 3"); var enc = new Enclosure(); enc.Url = "http://perseus.franklins.net/hanselminutes_0107.mp3"; enc.Title = "<Digital Photography Explained (for Geeks) with Aaron Hockley/>"; enc.Size = 26707573; enc.MimeType = "audio/mp3"; enc.AddToFeed = true; entries[2].Enclosure = enc; var enc1 = new Enclosure(); enc1.Url = "http://perseus.franklins.net/hanselminutes_0107.mp3"; enc1.Title = "<Digital Photography Explained (for Geeks) with Aaron Hockley/>"; enc1.Size = 26707573; enc1.MimeType = "audio/mp3"; enc1.AddToFeed = false; entries[3].Enclosure = enc1; var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", "Subtext.Web", null); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns <Entry>( e => "/Subtext.Web/whatever/" + e.Id + ".aspx"); var writer = new RssWriter(new StringWriter(), entries, NullValue.NullDateTime, false, subtextContext.Object); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>My Blog Is Better Than Yours</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + @"<description />" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<managingEditor>[email protected]</managingEditor>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>My Blog Is Better Than Yours</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1001.</title>" + Environment.NewLine + indent(3) + @"<category>Category1</category>" + Environment.NewLine + indent(3) + @"<category>Category2</category>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1001.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1001<img src=""http://localhost/Subtext.Web/aggbug/1001.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1001.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Sun, 23 Feb 1975 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1001.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1001.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1001.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1002.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1002.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1002<img src=""http://localhost/Subtext.Web/aggbug/1002.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1002.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Fri, 25 Jun 1976 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1002.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1002.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1002.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + @"<category>Category 3</category>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1003.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1003.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1003.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1003.aspx</trackback:ping>" + Environment.NewLine + indent(3) + @"<enclosure url=""http://perseus.franklins.net/hanselminutes_0107.mp3"" length=""26707573"" type=""audio/mp3"" />" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1004.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1004.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1004.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1004.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent() + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); UnitTestHelper.AssertStringsEqualCharacterByCharacter(expected, writer.Xml); }
public void RssWriterSendsWholeFeedWhenRFC3229Disabled() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = ""; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = false; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List<Entry>(CreateSomeEntriesDescending()); var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/Subtext.Web/", "Subtext.Web", null); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns<Entry>(e => "/Subtext.Web/whatever/" + e.Id); var writer = new RssWriter(new StringWriter(), entries, DateTime.ParseExact("07/14/2003", "MM/dd/yyyy", CultureInfo.InvariantCulture), false, subtextContext.Object); string expected = @"<rss version=""2.0"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + "<channel>" + Environment.NewLine + indent(2) + "<title />" + Environment.NewLine + indent(2) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + "<description />" + Environment.NewLine + indent(2) + "<language>en-US</language>" + Environment.NewLine + indent(2) + "<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + "<generator>{0}</generator>" + Environment.NewLine + indent(2) + "<image>" + Environment.NewLine + indent(3) + "<title />" + Environment.NewLine + indent(3) + "<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + "<width>77</width>" + Environment.NewLine + indent(3) + "<height>60</height>" + Environment.NewLine + indent(2) + "</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1004</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1004</guid>" + Environment.NewLine + indent(3) + "<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1004#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + "<item>" + Environment.NewLine + indent(3) + "<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1003</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1003</guid>" + Environment.NewLine + indent(3) + "<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1003#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1002.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1002</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1002<img src=""http://localhost/Subtext.Web/aggbug/1002.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1002</guid>" + Environment.NewLine + indent(3) + "<pubDate>Fri, 25 Jun 1976 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1002#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1002.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1001.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1001</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1001<img src=""http://localhost/Subtext.Web/aggbug/1001.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1001</guid>" + Environment.NewLine + indent(3) + "<pubDate>Sun, 23 Feb 1975 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1001#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1001.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent() + "</channel>" + Environment.NewLine + "</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); UnitTestHelper.AssertStringsEqualCharacterByCharacter(expected, writer.Xml); }
public void RssHandlerHandlesDatePublishedUtcProperly() { // arrange string hostName = UnitTestHelper.GenerateUniqueHostname(); var repository = new DatabaseObjectProvider(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); repository.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); //Create two entries, but only include one in main syndication. Entry entryForSyndication = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking"); UnitTestHelper.Create(entryForSyndication); Entry entryTwoForSyndication = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2"); int id = UnitTestHelper.Create(entryTwoForSyndication); Entry entry = UnitTestHelper.GetEntry(id, PostConfig.None, false); DateTime date = entry.DatePublishedUtc; entry.IncludeInMainSyndication = false; entry.Blog = new Blog() { Title = "MyTestBlog" }; var subtextContext = new Mock <ISubtextContext>(); subtextContext.Setup(c => c.Blog).Returns(Config.CurrentBlog); subtextContext.Setup(c => c.Repository).Returns(repository); UnitTestHelper.Update(entry, subtextContext.Object); Assert.AreEqual(date, entry.DatePublishedUtc); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); Mock <BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item node."); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); //Include the second entry back in the syndication. entry.IncludeInMainSyndication = true; UnitTestHelper.Update(entry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, "", ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "Expected two items in the feed now."); }
public void RssHandlerSortsByDatePublishedUtc() { // Setup string hostName = UnitTestHelper.GenerateUniqueHostname(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); var repository = new DatabaseObjectProvider(); repository.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); //Create two entries. int firstId = UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking")); Thread.Sleep(1000); UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2")); var subtextContext = new Mock <ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(repository); string rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(repository); Mock <BlogUrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); //Expect the first item to be the second entry. Assert.AreEqual("Title Test 2", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Title Test", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); //Remove first entry from syndication. Entry firstEntry = UnitTestHelper.GetEntry(firstId, PostConfig.None, false); firstEntry.IncludeInMainSyndication = false; firstEntry.Blog = new Blog() { Title = "MyTestBlog" }; UnitTestHelper.Update(firstEntry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, string.Empty); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); subtextContext = new Mock <ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(repository); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "Here we were expeting only one item"); Thread.Sleep(10); //Now add it back in changing the DateSyndicated firstEntry.IncludeInMainSyndication = true; firstEntry.DatePublishedUtc = DateTime.UtcNow; UnitTestHelper.Update(firstEntry, subtextContext.Object); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = repository.GetBlog(hostName, string.Empty); subtextContext = new Mock <ISubtextContext>(); subtextContext.Setup(c => c.Repository).Returns(repository); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); //Expect the second item to be the second entry. Assert.AreEqual(2, itemNodes.Count, "Here we were expeting 2 items"); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Title Test 2", itemNodes[1].SelectSingleNode("title").InnerText, "Not what we expected for the second title."); }
public static void FakeSyndicationContext(this Mock <ISubtextContext> subtextContextMock, Blog blog, string virtualPath, string applicationPath, Action <string> callback) { subtextContextMock.FakeSyndicationContext(blog, virtualPath, applicationPath, null, callback); }
public void RssWriterHandlesRFC3229DeltaEncoding() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = ""; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List<Entry>(CreateSomeEntriesDescending()); var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", "Subtext.Web", null); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/Subtext.Web/whatever"); // Tell the write we already received 1002 published 6/25/1976. var writer = new RssWriter(new StringWriter(), entries, DateTime.ParseExact("06/25/1976", "MM/dd/yyyy", CultureInfo.InvariantCulture), true, subtextContext.Object); // We only expect 1003 and 1004 string expected = @"<rss version=""2.0"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + "<channel>" + Environment.NewLine + indent(2) + "<title />" + Environment.NewLine + indent(2) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + "<description />" + Environment.NewLine + indent(2) + "<language>en-US</language>" + Environment.NewLine + indent(2) + "<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + "<generator>{0}</generator>" + Environment.NewLine + indent(2) + "<image>" + Environment.NewLine + indent(3) + "<title />" + Environment.NewLine + indent(3) + "<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + "<width>77</width>" + Environment.NewLine + indent(3) + "<height>60</height>" + Environment.NewLine + indent(2) + "</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent() + "</channel>" + Environment.NewLine + "</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); Assert.AreEqual(expected, writer.Xml); Assert.AreEqual(DateTime.ParseExact("06/25/1976", "MM/dd/yyyy", CultureInfo.InvariantCulture), writer.DateLastViewedFeedItemPublished, "The Item ID Last Viewed (according to If-None-Since is wrong."); Assert.AreEqual(DateTime.ParseExact("07/14/2003", "MM/dd/yyyy", CultureInfo.InvariantCulture), writer.LatestPublishDate, "The Latest Feed Item ID sent to the client is wrong."); }
public void RssWriterHandlesRFC3229DeltaEncoding() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = ""; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List <Entry>(CreateSomeEntriesDescending()); var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", "Subtext.Web", null); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns("/Subtext.Web/whatever"); // Tell the write we already received 1002 published 6/25/1976. var writer = new RssWriter(new StringWriter(), entries, DateTime.ParseExact("06/25/1976", "MM/dd/yyyy", CultureInfo.InvariantCulture), true, subtextContext.Object); // We only expect 1003 and 1004 string expected = @"<rss version=""2.0"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + "<channel>" + Environment.NewLine + indent(2) + "<title />" + Environment.NewLine + indent(2) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + "<description />" + Environment.NewLine + indent(2) + "<language>en-US</language>" + Environment.NewLine + indent(2) + "<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + "<generator>{0}</generator>" + Environment.NewLine + indent(2) + "<image>" + Environment.NewLine + indent(3) + "<title />" + Environment.NewLine + indent(3) + "<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + "<width>77</width>" + Environment.NewLine + indent(3) + "<height>60</height>" + Environment.NewLine + indent(2) + "</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent() + "</channel>" + Environment.NewLine + "</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); Assert.AreEqual(expected, writer.Xml); Assert.AreEqual(DateTime.ParseExact("06/25/1976", "MM/dd/yyyy", CultureInfo.InvariantCulture), writer.DateLastViewedFeedItemPublished, "The Item ID Last Viewed (according to If-None-Since is wrong."); Assert.AreEqual(DateTime.ParseExact("07/14/2003", "MM/dd/yyyy", CultureInfo.InvariantCulture), writer.LatestPublishDate, "The Latest Feed Item ID sent to the client is wrong."); }
public void RssHandlerHandlesDoesNotSyndicateFuturePosts() { // Setup string hostName = UnitTestHelper.GenerateUniqueHostname(); UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); Config.CreateBlog("", "username", "password", hostName, string.Empty); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); Config.CurrentBlog.TimeZoneId = TimeZonesTest.HawaiiTimeZoneId; //Create two entries, but only include one in main syndication. UnitTestHelper.Create(UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test", "Body Rocking", null, NullValue.NullDateTime)); Entry futureEntry = UnitTestHelper.CreateEntryInstanceForSyndication("Haacked", "Title Test 2", "Body Rocking Pt 2", null, NullValue.NullDateTime); futureEntry.DateSyndicated = Config.CurrentBlog.TimeZone.Now.AddMinutes(20); UnitTestHelper.Create(futureEntry); string rssOutput = null; var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); XmlNodeList itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(1, itemNodes.Count, "expected one item node."); Assert.AreEqual("Title Test", itemNodes[0].SelectSingleNode("title").InnerText, "Not what we expected for the first title."); Assert.AreEqual("Body Rocking", itemNodes[0].SelectSingleNode("description").InnerText.Substring(0, "Body Rocking".Length), "Not what we expected for the first body."); Config.CurrentBlog.TimeZoneId = TimeZonesTest.PacificTimeZoneId; UnitTestHelper.SetHttpContextWithBlogRequest(hostName, ""); BlogRequest.Current.Blog = Config.GetBlog(hostName, string.Empty); subtextContext = new Mock<ISubtextContext>(); rssOutput = null; subtextContext.FakeSyndicationContext(Config.CurrentBlog, "/", s => rssOutput = s); subtextContext.Setup(c => c.Repository).Returns(ObjectProvider.Instance()); urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns("/whatever"); itemNodes = GetRssHandlerItemNodes(subtextContext.Object, ref rssOutput); Assert.AreEqual(2, itemNodes.Count, "Expected two items in the feed now."); }
public void CommentRssWriterProducesValidFeed() { var blogInfo = new Blog(); blogInfo.Host = "localhost"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.Title = "My Blog Rulz"; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; Entry entry = UnitTestHelper.CreateEntryInstanceForSyndication(blogInfo, "haacked", "title of the post", "Body of the post."); entry.EntryName = "titleofthepost"; entry.DateCreated = entry.DateSyndicated = entry.DateModified = DateTime.ParseExact("2006/02/01", "yyyy/MM/dd", CultureInfo.InvariantCulture); entry.Id = 1001; var comment = new FeedbackItem(FeedbackType.Comment); comment.Id = 1002; comment.DateCreated = comment.DateModified = DateTime.ParseExact("2006/02/01", "yyyy/MM/dd", CultureInfo.InvariantCulture); comment.Title = "re: titleofthepost"; comment.ParentEntryName = entry.EntryName; comment.ParentDateCreated = entry.DateCreated; comment.Body = "<strong>I rule!</strong>"; comment.Author = "Jane Schmane"; comment.Email = "*****@*****.**"; comment.EntryId = entry.Id; var comments = new List <FeedbackItem>(); comments.Add(comment); var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/Subtext.Web/Whatever", "Subtext.Web", null); Mock <HttpContextBase> httpContext = Mock.Get(subtextContext.Object.RequestContext.HttpContext); httpContext.Setup(c => c.Request.ApplicationPath).Returns("/Subtext.Web"); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.FeedbackUrl(It.IsAny <FeedbackItem>())).Returns( "/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#" + comment.Id); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns( "/Subtext.Web/archive/2006/02/01/titleofthepost.aspx"); var writer = new CommentRssWriter(new StringWriter(), comments, entry, subtextContext.Object); Assert.IsTrue(entry.HasEntryName, "This entry should have an entry name."); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>title of the post</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(2) + @"<description>Body of the post.</description>" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>title of the post</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>re: titleofthepost</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#1002</link>" + Environment.NewLine + indent(3) + @"<description><strong>I rule!</strong></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Jane Schmane</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/archive/2006/02/01/titleofthepost.aspx#1002</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Wed, 01 Feb 2006 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent() + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); Assert.AreEqual(expected, writer.Xml); }
public void RssWriterSendsWholeFeedWhenRFC3229Disabled() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Subfolder = ""; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = false; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List <Entry>(CreateSomeEntriesDescending()); var subtextContext = new Mock <ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/Subtext.Web/", "Subtext.Web", null); Mock <UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny <Entry>())).Returns <Entry>(e => "/Subtext.Web/whatever/" + e.Id); var writer = new RssWriter(new StringWriter(), entries, DateTime.ParseExact("07/14/2003", "MM/dd/yyyy", CultureInfo.InvariantCulture), false, subtextContext.Object); string expected = @"<rss version=""2.0"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + "<channel>" + Environment.NewLine + indent(2) + "<title />" + Environment.NewLine + indent(2) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + "<description />" + Environment.NewLine + indent(2) + "<language>en-US</language>" + Environment.NewLine + indent(2) + "<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + "<generator>{0}</generator>" + Environment.NewLine + indent(2) + "<image>" + Environment.NewLine + indent(3) + "<title />" + Environment.NewLine + indent(3) + "<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + "<width>77</width>" + Environment.NewLine + indent(3) + "<height>60</height>" + Environment.NewLine + indent(2) + "</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1004</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1004</guid>" + Environment.NewLine + indent(3) + "<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1004#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + "<item>" + Environment.NewLine + indent(3) + "<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1003</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1003</guid>" + Environment.NewLine + indent(3) + "<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1003#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1002.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1002</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1002<img src=""http://localhost/Subtext.Web/aggbug/1002.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1002</guid>" + Environment.NewLine + indent(3) + "<pubDate>Fri, 25 Jun 1976 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1002#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1002.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + "<title>Title of 1001.</title>" + Environment.NewLine + indent(3) + "<link>http://localhost/Subtext.Web/whatever/1001</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1001<img src=""http://localhost/Subtext.Web/aggbug/1001.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + "<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + "<guid>http://localhost/Subtext.Web/whatever/1001</guid>" + Environment.NewLine + indent(3) + "<pubDate>Sun, 23 Feb 1975 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + "<comments>http://localhost/Subtext.Web/whatever/1001#feedback</comments>" + Environment.NewLine + indent(3) + "<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1001.aspx</wfw:commentRss>" + Environment.NewLine + indent(2) + "</item>" + Environment.NewLine + indent() + "</channel>" + Environment.NewLine + "</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); UnitTestHelper.AssertStringsEqualCharacterByCharacter(expected, writer.Xml); }
public void RssWriterProducesValidFeed() { UnitTestHelper.SetHttpContextWithBlogRequest("localhost", "", "Subtext.Web"); var blogInfo = new Blog(); BlogRequest.Current.Blog = blogInfo; blogInfo.Host = "localhost"; blogInfo.Title = "My Blog Is Better Than Yours"; blogInfo.Email = "*****@*****.**"; blogInfo.RFC3229DeltaEncodingEnabled = true; blogInfo.TimeZoneId = TimeZonesTest.PacificTimeZoneId; blogInfo.ShowEmailAddressInRss = true; blogInfo.TrackbacksEnabled = true; HttpContext.Current.Items.Add("BlogInfo-", blogInfo); var entries = new List<Entry>(CreateSomeEntries()); entries[0].Categories.AddRange(new[] {"Category1", "Category2"}); entries[0].Email = "*****@*****.**"; entries[2].Categories.Add("Category 3"); var enc = new Enclosure(); enc.Url = "http://perseus.franklins.net/hanselminutes_0107.mp3"; enc.Title = "<Digital Photography Explained (for Geeks) with Aaron Hockley/>"; enc.Size = 26707573; enc.MimeType = "audio/mp3"; enc.AddToFeed = true; entries[2].Enclosure = enc; var enc1 = new Enclosure(); enc1.Url = "http://perseus.franklins.net/hanselminutes_0107.mp3"; enc1.Title = "<Digital Photography Explained (for Geeks) with Aaron Hockley/>"; enc1.Size = 26707573; enc1.MimeType = "audio/mp3"; enc1.AddToFeed = false; entries[3].Enclosure = enc1; var subtextContext = new Mock<ISubtextContext>(); subtextContext.FakeSyndicationContext(blogInfo, "/", "Subtext.Web", null); Mock<UrlHelper> urlHelper = Mock.Get(subtextContext.Object.UrlHelper); urlHelper.Setup(u => u.BlogUrl()).Returns("/Subtext.Web/"); urlHelper.Setup(u => u.EntryUrl(It.IsAny<Entry>())).Returns<Entry>( e => "/Subtext.Web/whatever/" + e.Id + ".aspx"); var writer = new RssWriter(new StringWriter(), entries, NullValue.NullDateTime, false, subtextContext.Object); string expected = @"<rss version=""2.0"" " + @"xmlns:dc=""http://purl.org/dc/elements/1.1/"" " + @"xmlns:trackback=""http://madskills.com/public/xml/rss/module/trackback/"" " + @"xmlns:wfw=""http://wellformedweb.org/CommentAPI/"" " + @"xmlns:slash=""http://purl.org/rss/1.0/modules/slash/"" " + @"xmlns:copyright=""http://blogs.law.harvard.edu/tech/rss"" " + @"xmlns:image=""http://purl.org/rss/1.0/modules/image/"">" + Environment.NewLine + indent() + @"<channel>" + Environment.NewLine + indent(2) + @"<title>My Blog Is Better Than Yours</title>" + Environment.NewLine + indent(2) + @"<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(2) + @"<description />" + Environment.NewLine + indent(2) + @"<language>en-US</language>" + Environment.NewLine + indent(2) + @"<copyright>Subtext Weblog</copyright>" + Environment.NewLine + indent(2) + @"<managingEditor>[email protected]</managingEditor>" + Environment.NewLine + indent(2) + @"<generator>{0}</generator>" + Environment.NewLine + indent(2) + @"<image>" + Environment.NewLine + indent(3) + @"<title>My Blog Is Better Than Yours</title>" + Environment.NewLine + indent(3) + @"<url>http://localhost/Subtext.Web/images/RSS2Image.gif</url>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/Default.aspx</link>" + Environment.NewLine + indent(3) + @"<width>77</width>" + Environment.NewLine + indent(3) + @"<height>60</height>" + Environment.NewLine + indent(2) + @"</image>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1001.</title>" + Environment.NewLine + indent(3) + @"<category>Category1</category>" + Environment.NewLine + indent(3) + @"<category>Category2</category>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1001.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1001<img src=""http://localhost/Subtext.Web/aggbug/1001.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1001.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Sun, 23 Feb 1975 08:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1001.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1001.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1001.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1002.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1002.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1002<img src=""http://localhost/Subtext.Web/aggbug/1002.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1002.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Fri, 25 Jun 1976 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1002.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1002.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1002.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1003.</title>" + Environment.NewLine + indent(3) + @"<category>Category 3</category>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1003.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1003<img src=""http://localhost/Subtext.Web/aggbug/1003.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1003.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Tue, 16 Oct 1979 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1003.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1003.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1003.aspx</trackback:ping>" + Environment.NewLine + indent(3) + @"<enclosure url=""http://perseus.franklins.net/hanselminutes_0107.mp3"" length=""26707573"" type=""audio/mp3"" />" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent(2) + @"<item>" + Environment.NewLine + indent(3) + @"<title>Title of 1004.</title>" + Environment.NewLine + indent(3) + @"<link>http://localhost/Subtext.Web/whatever/1004.aspx</link>" + Environment.NewLine + indent(3) + @"<description>Body of 1004<img src=""http://localhost/Subtext.Web/aggbug/1004.aspx"" width=""1"" height=""1"" /></description>" + Environment.NewLine + indent(3) + @"<dc:creator>Phil Haack</dc:creator>" + Environment.NewLine + indent(3) + @"<guid>http://localhost/Subtext.Web/whatever/1004.aspx</guid>" + Environment.NewLine + indent(3) + @"<pubDate>Mon, 14 Jul 2003 07:00:00 GMT</pubDate>" + Environment.NewLine + indent(3) + @"<comments>http://localhost/Subtext.Web/whatever/1004.aspx#feedback</comments>" + Environment.NewLine + indent(3) + @"<wfw:commentRss>http://localhost/Subtext.Web/comments/commentRss/1004.aspx</wfw:commentRss>" + Environment.NewLine + indent(3) + @"<trackback:ping>http://localhost/Subtext.Web/services/trackbacks/1004.aspx</trackback:ping>" + Environment.NewLine + indent(2) + @"</item>" + Environment.NewLine + indent() + @"</channel>" + Environment.NewLine + @"</rss>"; expected = string.Format(expected, VersionInfo.VersionDisplayText); UnitTestHelper.AssertStringsEqualCharacterByCharacter(expected, writer.Xml); }