Get RSSParserTests working — comment out all the other tests which aren’t expected to work yet.

This commit is contained in:
Brent Simmons 2024-09-09 21:49:46 -07:00
parent eeb27475de
commit b23888a20b
10 changed files with 717 additions and 699 deletions

View File

@ -52,6 +52,7 @@ private extension RSSParser {
let saxParser = SAXParser(delegate: self, data: data)
saxParser.parse()
feed.articles = articles
}
private struct XMLName {

View File

@ -7,101 +7,101 @@
//
import XCTest
import Parser
import FeedParser
class AtomParserTests: XCTestCase {
func testDaringFireballPerformance() {
// 0.009 sec on my 2012 iMac.
let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //Its actually an Atom feed
self.measure {
let _ = try! FeedParser.parseSync(d)
}
}
func testAllThisPerformance() {
// 0.003 sec on my 2012 iMac.
let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
self.measure {
let _ = try! FeedParser.parseSync(d)
}
}
func testGettingHomePageLink() async {
let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.homePageURL == "http://leancrew.com/all-this")
}
func testDaringFireball() async {
let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //Its actually an Atom feed
let parsedFeed = try! await FeedParser.parse(d)!
for article in parsedFeed.items {
XCTAssertNotNil(article.url)
XCTAssertTrue(article.uniqueID.hasPrefix("tag:daringfireball.net,2017:/"))
XCTAssertEqual(article.authors!.count, 1) // TODO: parse Atom authors
let author = article.authors!.first!
if author.name == "Daring Fireball Department of Commerce" {
XCTAssertNil(author.url)
}
else {
XCTAssertEqual(author.name, "John Gruber")
XCTAssertEqual(author.url, "http://daringfireball.net/")
}
XCTAssertNotNil(article.datePublished)
XCTAssert(article.attachments == nil)
XCTAssertEqual(article.language, "en")
}
}
func test4fsodonlineAttachments() async {
// Thanks to Marco for finding me some Atom podcast feeds. Apparently theyre super-rare.
let d = parserData("4fsodonline", "atom", "http://4fsodonline.blogspot.com/")
let parsedFeed = try! await FeedParser.parse(d)!
for article in parsedFeed.items {
XCTAssertTrue(article.attachments!.count > 0)
let attachment = article.attachments!.first!
XCTAssertTrue(attachment.url.hasPrefix("http://www.blogger.com/video-play.mp4?"))
XCTAssertNil(attachment.sizeInBytes)
XCTAssertEqual(attachment.mimeType!, "video/mp4")
}
}
func testExpertOpinionENTAttachments() async {
// Another from Marco.
let d = parserData("expertopinionent", "atom", "http://expertopinionent.typepad.com/my-blog/")
let parsedFeed = try! await FeedParser.parse(d)!
for article in parsedFeed.items {
guard let attachments = article.attachments else {
continue
}
XCTAssertEqual(attachments.count, 1)
let attachment = attachments.first!
XCTAssertTrue(attachment.url.hasSuffix(".mp3"))
XCTAssertNil(attachment.sizeInBytes)
XCTAssertEqual(attachment.mimeType!, "audio/mpeg")
}
}
}
//class AtomParserTests: XCTestCase {
//
// func testDaringFireballPerformance() {
//
// // 0.009 sec on my 2012 iMac.
// let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //Its actually an Atom feed
// self.measure {
// let _ = try! FeedParser.parseSync(d)
// }
// }
//
// func testAllThisPerformance() {
//
// // 0.003 sec on my 2012 iMac.
// let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
// self.measure {
// let _ = try! FeedParser.parseSync(d)
// }
// }
//
// func testGettingHomePageLink() async {
//
// let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// XCTAssertTrue(parsedFeed.homePageURL == "http://leancrew.com/all-this")
// }
//
// func testDaringFireball() async {
//
// let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //Its actually an Atom feed
// let parsedFeed = try! await FeedParser.parse(d)!
//
// for article in parsedFeed.items {
//
// XCTAssertNotNil(article.url)
//
// XCTAssertTrue(article.uniqueID.hasPrefix("tag:daringfireball.net,2017:/"))
//
// XCTAssertEqual(article.authors!.count, 1) // TODO: parse Atom authors
// let author = article.authors!.first!
// if author.name == "Daring Fireball Department of Commerce" {
// XCTAssertNil(author.url)
// }
// else {
// XCTAssertEqual(author.name, "John Gruber")
// XCTAssertEqual(author.url, "http://daringfireball.net/")
// }
//
// XCTAssertNotNil(article.datePublished)
// XCTAssert(article.attachments == nil)
//
// XCTAssertEqual(article.language, "en")
// }
// }
//
// func test4fsodonlineAttachments() async {
//
// // Thanks to Marco for finding me some Atom podcast feeds. Apparently theyre super-rare.
//
// let d = parserData("4fsodonline", "atom", "http://4fsodonline.blogspot.com/")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// for article in parsedFeed.items {
//
// XCTAssertTrue(article.attachments!.count > 0)
// let attachment = article.attachments!.first!
//
// XCTAssertTrue(attachment.url.hasPrefix("http://www.blogger.com/video-play.mp4?"))
// XCTAssertNil(attachment.sizeInBytes)
// XCTAssertEqual(attachment.mimeType!, "video/mp4")
// }
// }
//
// func testExpertOpinionENTAttachments() async {
//
// // Another from Marco.
//
// let d = parserData("expertopinionent", "atom", "http://expertopinionent.typepad.com/my-blog/")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// for article in parsedFeed.items {
//
// guard let attachments = article.attachments else {
// continue
// }
//
// XCTAssertEqual(attachments.count, 1)
// let attachment = attachments.first!
//
// XCTAssertTrue(attachment.url.hasSuffix(".mp3"))
// XCTAssertNil(attachment.sizeInBytes)
// XCTAssertEqual(attachment.mimeType!, "audio/mpeg")
// }
// }
//}

View File

@ -7,41 +7,41 @@
//
import XCTest
import Parser
import FeedParser
class EntityDecodingTests: XCTestCase {
func test39Decoding() {
// Bug found by Manton Reece the ' entity was not getting decoded by NetNewsWire in JSON Feeds from micro.blog.
let s = "These are the times that try men's souls."
let decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "These are the times that try men's souls.")
}
func testEntities() {
var s = "…"
var decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "")
s = "…"
decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "")
s = "'"
decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "'")
s = "§"
decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "§")
s = "£"
decoded = s.rsparser_stringByDecodingHTMLEntities()
XCTAssertEqual(decoded, "£")
}
}
//class EntityDecodingTests: XCTestCase {
//
// func test39Decoding() {
//
// // Bug found by Manton Reece the ' entity was not getting decoded by NetNewsWire in JSON Feeds from micro.blog.
//
// let s = "These are the times that try men's souls."
// let decoded = s.rsparser_stringByDecodingHTMLEntities()
//
// XCTAssertEqual(decoded, "These are the times that try men's souls.")
// }
//
// func testEntities() {
// var s = "…"
// var decoded = s.rsparser_stringByDecodingHTMLEntities()
//
// XCTAssertEqual(decoded, "")
//
// s = "…"
// decoded = s.rsparser_stringByDecodingHTMLEntities()
// XCTAssertEqual(decoded, "")
//
// s = "'"
// decoded = s.rsparser_stringByDecodingHTMLEntities()
// XCTAssertEqual(decoded, "'")
//
// s = "§"
// decoded = s.rsparser_stringByDecodingHTMLEntities()
// XCTAssertEqual(decoded, "§")
//
// s = "£"
// decoded = s.rsparser_stringByDecodingHTMLEntities()
// XCTAssertEqual(decoded, "£")
//
// }
//}

View File

@ -7,235 +7,235 @@
//
import XCTest
import Parser
import ParserObjC
import FeedParser
import SAX
class FeedParserTypeTests: XCTestCase {
// MARK: HTML
func testDaringFireballHTMLType() {
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
let type = feedType(d)
XCTAssertTrue(type == .notAFeed)
}
func testFurboHTMLType() {
let d = parserData("furbo", "html", "http://furbo.org/")
let type = feedType(d)
XCTAssertTrue(type == .notAFeed)
}
func testInessentialHTMLType() {
let d = parserData("inessential", "html", "http://inessential.com/")
let type = feedType(d)
XCTAssertTrue(type == .notAFeed)
}
func testSixColorsHTMLType() {
let d = parserData("sixcolors", "html", "https://sixcolors.com/")
let type = feedType(d)
XCTAssertTrue(type == .notAFeed)
}
// MARK: RSS
func testEMarleyRSSType() {
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testScriptingNewsRSSType() {
let d = parserData("scriptingNews", "rss", "http://scripting.com/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testKatieFloydRSSType() {
let d = parserData("KatieFloyd", "rss", "https://katiefloyd.com/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testMantonRSSType() {
let d = parserData("manton", "rss", "http://manton.org/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testDCRainmakerRSSType() {
let d = parserData("dcrainmaker", "xml", "https://www.dcrainmaker.com/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testMacworldRSSType() {
let d = parserData("macworld", "rss", "https://www.macworld.com/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testNatashaTheRobotRSSType() {
let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testDontHitSaveRSSWithBOMType() {
let d = parserData("donthitsave", "xml", "http://donthitsave.com/donthitsavefeed.xml")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testBioRDF() {
let d = parserData("bio", "rdf", "http://connect.biorxiv.org/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
func testPHPXML() {
let d = parserData("phpxml", "rss", "https://www.fcutrecht.net/")
let type = feedType(d)
XCTAssertTrue(type == .rss)
}
// MARK: Atom
func testDaringFireballAtomType() {
// File extension is .rss, but its really an Atom feed.
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
let type = feedType(d)
XCTAssertTrue(type == .atom)
}
func testOneFootTsunamiAtomType() {
let d = parserData("OneFootTsunami", "atom", "http://onefoottsunami.com/")
let type = feedType(d)
XCTAssertTrue(type == .atom)
}
func testRussCoxAtomType() {
let d = parserData("russcox", "atom", "https://research.swtch.com/")
let type = feedType(d)
XCTAssertTrue(type == .atom)
}
// MARK: RSS-in-JSON
func testScriptingNewsJSONType() {
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
let type = feedType(d)
XCTAssertTrue(type == .rssInJSON)
}
// MARK: JSON Feed
func testInessentialJSONFeedType() {
let d = parserData("inessential", "json", "http://inessential.com/")
let type = feedType(d)
XCTAssertTrue(type == .jsonFeed)
}
func testAllThisJSONFeedType() {
let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
let type = feedType(d)
XCTAssertTrue(type == .jsonFeed)
}
func testCurtJSONFeedType() {
let d = parserData("curt", "json", "http://curtclifton.net/")
let type = feedType(d)
XCTAssertTrue(type == .jsonFeed)
}
func testPixelEnvyJSONFeedType() {
let d = parserData("pxlnv", "json", "http://pxlnv.com/")
let type = feedType(d)
XCTAssertTrue(type == .jsonFeed)
}
func testRoseJSONFeedType() {
let d = parserData("rose", "json", "https://www.rosemaryorchard.com/")
let type = feedType(d)
XCTAssertTrue(type == .jsonFeed)
}
// MARK: Unknown
func testPartialAllThisUnknownFeedType() {
// In the case of this feed, the partial data isnt enough to detect that its a JSON Feed.
// The type detector should return .unknown rather than .notAFeed.
let d = parserData("allthis-partial", "json", "http://leancrew.com/allthis/")
let type = feedType(d, isPartialData: true)
XCTAssertEqual(type, .unknown)
}
// MARK: Performance
func testFeedTypePerformance() {
// 0.000 on my 2012 iMac.
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
self.measure {
let _ = feedType(d)
}
}
func testFeedTypePerformance2() {
// 0.000 on my 2012 iMac.
let d = parserData("inessential", "json", "http://inessential.com/")
self.measure {
let _ = feedType(d)
}
}
func testFeedTypePerformance3() {
// 0.000 on my 2012 iMac.
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
self.measure {
let _ = feedType(d)
}
}
func testFeedTypePerformance4() {
// 0.001 on my 2012 iMac.
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
self.measure {
let _ = feedType(d)
}
}
}
//class FeedParserTypeTests: XCTestCase {
//
// // MARK: HTML
//
// func testDaringFireballHTMLType() {
//
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
// let type = feedType(d)
// XCTAssertTrue(type == .notAFeed)
// }
//
// func testFurboHTMLType() {
//
// let d = parserData("furbo", "html", "http://furbo.org/")
// let type = feedType(d)
// XCTAssertTrue(type == .notAFeed)
// }
//
// func testInessentialHTMLType() {
//
// let d = parserData("inessential", "html", "http://inessential.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .notAFeed)
// }
//
// func testSixColorsHTMLType() {
//
// let d = parserData("sixcolors", "html", "https://sixcolors.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .notAFeed)
// }
//
// // MARK: RSS
//
// func testEMarleyRSSType() {
//
// let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testScriptingNewsRSSType() {
//
// let d = parserData("scriptingNews", "rss", "http://scripting.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testKatieFloydRSSType() {
//
// let d = parserData("KatieFloyd", "rss", "https://katiefloyd.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testMantonRSSType() {
//
// let d = parserData("manton", "rss", "http://manton.org/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testDCRainmakerRSSType() {
//
// let d = parserData("dcrainmaker", "xml", "https://www.dcrainmaker.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testMacworldRSSType() {
//
// let d = parserData("macworld", "rss", "https://www.macworld.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testNatashaTheRobotRSSType() {
//
// let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testDontHitSaveRSSWithBOMType() {
//
// let d = parserData("donthitsave", "xml", "http://donthitsave.com/donthitsavefeed.xml")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testBioRDF() {
// let d = parserData("bio", "rdf", "http://connect.biorxiv.org/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// func testPHPXML() {
// let d = parserData("phpxml", "rss", "https://www.fcutrecht.net/")
// let type = feedType(d)
// XCTAssertTrue(type == .rss)
// }
//
// // MARK: Atom
//
// func testDaringFireballAtomType() {
//
// // File extension is .rss, but its really an Atom feed.
// let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
// let type = feedType(d)
// XCTAssertTrue(type == .atom)
// }
//
// func testOneFootTsunamiAtomType() {
//
// let d = parserData("OneFootTsunami", "atom", "http://onefoottsunami.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .atom)
// }
//
// func testRussCoxAtomType() {
// let d = parserData("russcox", "atom", "https://research.swtch.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .atom)
// }
//
// // MARK: RSS-in-JSON
//
// func testScriptingNewsJSONType() {
//
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .rssInJSON)
// }
//
// // MARK: JSON Feed
//
// func testInessentialJSONFeedType() {
//
// let d = parserData("inessential", "json", "http://inessential.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .jsonFeed)
// }
//
// func testAllThisJSONFeedType() {
//
// let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
// let type = feedType(d)
// XCTAssertTrue(type == .jsonFeed)
// }
//
// func testCurtJSONFeedType() {
//
// let d = parserData("curt", "json", "http://curtclifton.net/")
// let type = feedType(d)
// XCTAssertTrue(type == .jsonFeed)
// }
//
// func testPixelEnvyJSONFeedType() {
//
// let d = parserData("pxlnv", "json", "http://pxlnv.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .jsonFeed)
// }
//
// func testRoseJSONFeedType() {
//
// let d = parserData("rose", "json", "https://www.rosemaryorchard.com/")
// let type = feedType(d)
// XCTAssertTrue(type == .jsonFeed)
// }
//
// // MARK: Unknown
//
// func testPartialAllThisUnknownFeedType() {
//
// // In the case of this feed, the partial data isnt enough to detect that its a JSON Feed.
// // The type detector should return .unknown rather than .notAFeed.
//
// let d = parserData("allthis-partial", "json", "http://leancrew.com/allthis/")
// let type = feedType(d, isPartialData: true)
// XCTAssertEqual(type, .unknown)
// }
//
// // MARK: Performance
//
// func testFeedTypePerformance() {
//
// // 0.000 on my 2012 iMac.
//
// let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
// self.measure {
// let _ = feedType(d)
// }
// }
//
// func testFeedTypePerformance2() {
//
// // 0.000 on my 2012 iMac.
//
// let d = parserData("inessential", "json", "http://inessential.com/")
// self.measure {
// let _ = feedType(d)
// }
// }
//
// func testFeedTypePerformance3() {
//
// // 0.000 on my 2012 iMac.
//
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
// self.measure {
// let _ = feedType(d)
// }
// }
//
// func testFeedTypePerformance4() {
//
// // 0.001 on my 2012 iMac.
//
// let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
// self.measure {
// let _ = feedType(d)
// }
// }
//
//}
func parserData(_ filename: String, _ fileExtension: String, _ url: String) -> ParserData {
let filename = "Resources/\(filename)"

View File

@ -7,37 +7,36 @@
//
import XCTest
import Parser
import ParserObjC
import FeedParser
class HTMLLinkTests: XCTestCase {
func testSixColorsPerformance() {
// 0.003 sec on my 2012 iMac
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
self.measure {
let _ = RSHTMLLinkParser.htmlLinks(with: d)
}
}
func testSixColorsLink() {
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
let links = RSHTMLLinkParser.htmlLinks(with: d)
let linkToFind = "https://www.theincomparable.com/theincomparable/290/index.php"
let textToFind = "this weeks episode of The Incomparable"
var found = false
for oneLink in links {
if let urlString = oneLink.urlString, let text = oneLink.text, urlString == linkToFind, text == textToFind {
found = true
}
}
XCTAssertTrue(found)
XCTAssertEqual(links.count, 131)
}
}
//class HTMLLinkTests: XCTestCase {
//
// func testSixColorsPerformance() {
//
// // 0.003 sec on my 2012 iMac
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
// self.measure {
// let _ = RSHTMLLinkParser.htmlLinks(with: d)
// }
// }
//
// func testSixColorsLink() {
//
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
// let links = RSHTMLLinkParser.htmlLinks(with: d)
//
// let linkToFind = "https://www.theincomparable.com/theincomparable/290/index.php"
// let textToFind = "this weeks episode of The Incomparable"
//
// var found = false
// for oneLink in links {
// if let urlString = oneLink.urlString, let text = oneLink.text, urlString == linkToFind, text == textToFind {
// found = true
// }
// }
//
// XCTAssertTrue(found)
// XCTAssertEqual(links.count, 131)
// }
//
//}

View File

@ -7,148 +7,147 @@
//
import XCTest
import Parser
import ParserObjC
import FeedParser
class HTMLMetadataTests: XCTestCase {
func testDaringFireball() {
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
XCTAssertEqual(metadata.favicons.first?.urlString, "http://daringfireball.net/graphics/favicon.ico?v=005")
XCTAssertEqual(metadata.feedLinks.count, 1)
let feedLink = metadata.feedLinks.first!
XCTAssertNil(feedLink.title)
XCTAssertEqual(feedLink.type, "application/atom+xml")
XCTAssertEqual(feedLink.urlString, "http://daringfireball.net/feeds/main")
}
func testDaringFireballPerformance() {
// 0.002 sec on my 2012 iMac
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
self.measure {
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
}
}
func testFurbo() {
let d = parserData("furbo", "html", "http://furbo.org/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
XCTAssertEqual(metadata.favicons.first?.urlString, "http://furbo.org/favicon.ico")
XCTAssertEqual(metadata.feedLinks.count, 1)
let feedLink = metadata.feedLinks.first!
XCTAssertEqual(feedLink.title, "Iconfactory News Feed")
XCTAssertEqual(feedLink.type, "application/rss+xml")
}
func testFurboPerformance() {
// 0.001 sec on my 2012 iMac
let d = parserData("furbo", "html", "http://furbo.org/")
self.measure {
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
}
}
func testInessential() {
let d = parserData("inessential", "html", "http://inessential.com/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
XCTAssertNil(metadata.favicons.first?.urlString)
XCTAssertEqual(metadata.feedLinks.count, 1)
let feedLink = metadata.feedLinks.first!
XCTAssertEqual(feedLink.title, "RSS")
XCTAssertEqual(feedLink.type, "application/rss+xml")
XCTAssertEqual(feedLink.urlString, "http://inessential.com/xml/rss.xml")
XCTAssertEqual(metadata.appleTouchIcons.count, 0);
}
func testInessentialPerformance() {
// 0.001 sec on my 2012 iMac
let d = parserData("inessential", "html", "http://inessential.com/")
self.measure {
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
}
}
func testCocoPerformance() {
// 0.004 sec on my 2012 iMac
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
self.measure {
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
}
}
func testSixColors() {
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
XCTAssertEqual(metadata.favicons.first?.urlString, "https://sixcolors.com/images/favicon.ico")
XCTAssertEqual(metadata.feedLinks.count, 1);
let feedLink = metadata.feedLinks.first!
XCTAssertEqual(feedLink.title, "RSS");
XCTAssertEqual(feedLink.type, "application/rss+xml");
XCTAssertEqual(feedLink.urlString, "http://feedpress.me/sixcolors");
XCTAssertEqual(metadata.appleTouchIcons.count, 6);
let icon = metadata.appleTouchIcons[3];
XCTAssertEqual(icon.rel, "apple-touch-icon");
XCTAssertEqual(icon.sizes, "120x120");
XCTAssertEqual(icon.urlString, "https://sixcolors.com/apple-touch-icon-120.png");
}
func testSixColorsPerformance() {
// 0.002 sec on my 2012 iMac
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
self.measure {
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
}
}
func testCocoOGImage() {
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
let openGraphData = metadata.openGraphProperties
let image = openGraphData.images.first!
XCTAssert(image.url == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
}
func testCocoTwitterImage() {
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
let twitterData = metadata.twitterProperties
let imageURL = twitterData.imageURL!
XCTAssert(imageURL == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
}
func testYouTube() {
// YouTube is a special case the feed links appear after the head section, in the body section.
let d = parserData("YouTubeTheVolvoRocks", "html", "https://www.youtube.com/user/TheVolvorocks")
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
XCTAssertEqual(metadata.feedLinks.count, 1);
let feedLink = metadata.feedLinks.first!
XCTAssertEqual(feedLink.title, "RSS");
XCTAssertEqual(feedLink.type, "application/rss+xml");
XCTAssertEqual(feedLink.urlString, "https://www.youtube.com/feeds/videos.xml?channel_id=UCct7QF2jcWRY6dhXWMSq9LQ");
}
}
//class HTMLMetadataTests: XCTestCase {
//
// func testDaringFireball() {
//
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
//
// XCTAssertEqual(metadata.favicons.first?.urlString, "http://daringfireball.net/graphics/favicon.ico?v=005")
//
// XCTAssertEqual(metadata.feedLinks.count, 1)
//
// let feedLink = metadata.feedLinks.first!
// XCTAssertNil(feedLink.title)
// XCTAssertEqual(feedLink.type, "application/atom+xml")
// XCTAssertEqual(feedLink.urlString, "http://daringfireball.net/feeds/main")
// }
//
// func testDaringFireballPerformance() {
//
// // 0.002 sec on my 2012 iMac
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
// self.measure {
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
// }
// }
//
// func testFurbo() {
//
// let d = parserData("furbo", "html", "http://furbo.org/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
//
// XCTAssertEqual(metadata.favicons.first?.urlString, "http://furbo.org/favicon.ico")
//
// XCTAssertEqual(metadata.feedLinks.count, 1)
//
// let feedLink = metadata.feedLinks.first!
// XCTAssertEqual(feedLink.title, "Iconfactory News Feed")
// XCTAssertEqual(feedLink.type, "application/rss+xml")
// }
//
// func testFurboPerformance() {
//
// // 0.001 sec on my 2012 iMac
// let d = parserData("furbo", "html", "http://furbo.org/")
// self.measure {
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
// }
// }
//
// func testInessential() {
//
// let d = parserData("inessential", "html", "http://inessential.com/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
//
// XCTAssertNil(metadata.favicons.first?.urlString)
//
// XCTAssertEqual(metadata.feedLinks.count, 1)
// let feedLink = metadata.feedLinks.first!
// XCTAssertEqual(feedLink.title, "RSS")
// XCTAssertEqual(feedLink.type, "application/rss+xml")
// XCTAssertEqual(feedLink.urlString, "http://inessential.com/xml/rss.xml")
//
// XCTAssertEqual(metadata.appleTouchIcons.count, 0);
// }
//
// func testInessentialPerformance() {
//
// // 0.001 sec on my 2012 iMac
// let d = parserData("inessential", "html", "http://inessential.com/")
// self.measure {
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
// }
// }
//
// func testCocoPerformance() {
//
// // 0.004 sec on my 2012 iMac
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
// self.measure {
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
// }
// }
//
// func testSixColors() {
//
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
//
// XCTAssertEqual(metadata.favicons.first?.urlString, "https://sixcolors.com/images/favicon.ico")
//
// XCTAssertEqual(metadata.feedLinks.count, 1);
// let feedLink = metadata.feedLinks.first!
// XCTAssertEqual(feedLink.title, "RSS");
// XCTAssertEqual(feedLink.type, "application/rss+xml");
// XCTAssertEqual(feedLink.urlString, "http://feedpress.me/sixcolors");
//
// XCTAssertEqual(metadata.appleTouchIcons.count, 6);
// let icon = metadata.appleTouchIcons[3];
// XCTAssertEqual(icon.rel, "apple-touch-icon");
// XCTAssertEqual(icon.sizes, "120x120");
// XCTAssertEqual(icon.urlString, "https://sixcolors.com/apple-touch-icon-120.png");
// }
//
// func testSixColorsPerformance() {
//
// // 0.002 sec on my 2012 iMac
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
// self.measure {
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
// }
// }
//
// func testCocoOGImage() {
//
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
// let openGraphData = metadata.openGraphProperties
// let image = openGraphData.images.first!
// XCTAssert(image.url == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
// }
//
// func testCocoTwitterImage() {
//
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
// let twitterData = metadata.twitterProperties
// let imageURL = twitterData.imageURL!
// XCTAssert(imageURL == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
// }
//
// func testYouTube() {
// // YouTube is a special case the feed links appear after the head section, in the body section.
// let d = parserData("YouTubeTheVolvoRocks", "html", "https://www.youtube.com/user/TheVolvorocks")
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
//
// XCTAssertEqual(metadata.feedLinks.count, 1);
// let feedLink = metadata.feedLinks.first!
// XCTAssertEqual(feedLink.title, "RSS");
// XCTAssertEqual(feedLink.type, "application/rss+xml");
// XCTAssertEqual(feedLink.urlString, "https://www.youtube.com/feeds/videos.xml?channel_id=UCct7QF2jcWRY6dhXWMSq9LQ");
// }
//}

View File

@ -7,118 +7,118 @@
//
import XCTest
import Parser
import FeedParser
class JSONFeedParserTests: XCTestCase {
func testInessentialPerformance() {
// 0.001 sec on my 2012 iMac.
let d = parserData("inessential", "json", "http://inessential.com/")
self.measure {
let _ = try! FeedParser.parseSync(d)
}
}
func testDaringFireballPerformance() {
// 0.009 sec on my 2012 iMac.
let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
self.measure {
let _ = try! FeedParser.parseSync(d)
}
}
func testGettingFaviconAndIconURLs() async {
let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssert(parsedFeed.faviconURL == "https://daringfireball.net/graphics/favicon-64.png")
XCTAssert(parsedFeed.iconURL == "https://daringfireball.net/graphics/apple-touch-icon.png")
}
func testAllThis() async {
let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 12)
}
func testCurt() async {
let d = parserData("curt", "json", "http://curtclifton.net/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 26)
var didFindTwitterQuitterArticle = false
for article in parsedFeed.items {
if article.title == "Twitter Quitter" {
didFindTwitterQuitterArticle = true
XCTAssertTrue(article.contentHTML!.hasPrefix("<p>I&#8217;ve decided to close my Twitter account. William Van Hecke <a href=\"https://tinyletter.com/fet/letters/microcosmographia-xlxi-reasons-to-stay-on-twitter\">makes a convincing case</a>"))
}
}
XCTAssertTrue(didFindTwitterQuitterArticle)
}
func testPixelEnvy() async {
let d = parserData("pxlnv", "json", "http://pxlnv.com/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 20)
}
func testRose() async {
let d = parserData("rose", "json", "http://www.rosemaryorchard.com/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 84)
}
func test3960() async {
let d = parserData("3960", "json", "http://journal.3960.org/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 20)
XCTAssertEqual(parsedFeed.language, "de-DE")
for item in parsedFeed.items {
XCTAssertEqual(item.language, "de-DE")
}
}
func testAuthors() async {
let d = parserData("authors", "json", "https://example.com/")
let parsedFeed = try! await FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 4)
let rootAuthors = Set([
ParsedAuthor(name: "Root Author 1", url: nil, avatarURL: nil, emailAddress: nil),
ParsedAuthor(name: "Root Author 2", url: nil, avatarURL: nil, emailAddress: nil)
])
let itemAuthors = Set([
ParsedAuthor(name: "Item Author 1", url: nil, avatarURL: nil, emailAddress: nil),
ParsedAuthor(name: "Item Author 2", url: nil, avatarURL: nil, emailAddress: nil)
])
let legacyItemAuthors = Set([
ParsedAuthor(name: "Legacy Item Author", url: nil, avatarURL: nil, emailAddress: nil)
])
XCTAssertEqual(parsedFeed.authors?.count, 2)
XCTAssertEqual(parsedFeed.authors, rootAuthors)
let noAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item without authors" }!
XCTAssertEqual(noAuthorsItem.authors, nil)
let legacyAuthorItem = parsedFeed.items.first { $0.uniqueID == "Item with legacy author" }!
XCTAssertEqual(legacyAuthorItem.authors, legacyItemAuthors)
let modernAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with modern authors" }!
XCTAssertEqual(modernAuthorsItem.authors, itemAuthors)
let bothAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with both" }!
XCTAssertEqual(bothAuthorsItem.authors, itemAuthors)
}
}
//class JSONFeedParserTests: XCTestCase {
//
// func testInessentialPerformance() {
//
// // 0.001 sec on my 2012 iMac.
// let d = parserData("inessential", "json", "http://inessential.com/")
// self.measure {
// let _ = try! FeedParser.parseSync(d)
// }
// }
//
// func testDaringFireballPerformance() {
//
// // 0.009 sec on my 2012 iMac.
// let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
// self.measure {
// let _ = try! FeedParser.parseSync(d)
// }
// }
//
// func testGettingFaviconAndIconURLs() async {
//
// let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// XCTAssert(parsedFeed.faviconURL == "https://daringfireball.net/graphics/favicon-64.png")
// XCTAssert(parsedFeed.iconURL == "https://daringfireball.net/graphics/apple-touch-icon.png")
// }
//
// func testAllThis() async {
//
// let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// XCTAssertEqual(parsedFeed.items.count, 12)
// }
//
// func testCurt() async {
//
// let d = parserData("curt", "json", "http://curtclifton.net/")
// let parsedFeed = try! await FeedParser.parse(d)!
//
// XCTAssertEqual(parsedFeed.items.count, 26)
//
// var didFindTwitterQuitterArticle = false
// for article in parsedFeed.items {
// if article.title == "Twitter Quitter" {
// didFindTwitterQuitterArticle = true
// XCTAssertTrue(article.contentHTML!.hasPrefix("<p>I&#8217;ve decided to close my Twitter account. William Van Hecke <a href=\"https://tinyletter.com/fet/letters/microcosmographia-xlxi-reasons-to-stay-on-twitter\">makes a convincing case</a>"))
// }
// }
//
// XCTAssertTrue(didFindTwitterQuitterArticle)
// }
//
// func testPixelEnvy() async {
//
// let d = parserData("pxlnv", "json", "http://pxlnv.com/")
// let parsedFeed = try! await FeedParser.parse(d)!
// XCTAssertEqual(parsedFeed.items.count, 20)
//
// }
//
// func testRose() async {
// let d = parserData("rose", "json", "http://www.rosemaryorchard.com/")
// let parsedFeed = try! await FeedParser.parse(d)!
// XCTAssertEqual(parsedFeed.items.count, 84)
// }
//
// func test3960() async {
// let d = parserData("3960", "json", "http://journal.3960.org/")
// let parsedFeed = try! await FeedParser.parse(d)!
// XCTAssertEqual(parsedFeed.items.count, 20)
// XCTAssertEqual(parsedFeed.language, "de-DE")
//
// for item in parsedFeed.items {
// XCTAssertEqual(item.language, "de-DE")
// }
// }
//
// func testAuthors() async {
// let d = parserData("authors", "json", "https://example.com/")
// let parsedFeed = try! await FeedParser.parse(d)!
// XCTAssertEqual(parsedFeed.items.count, 4)
//
// let rootAuthors = Set([
// ParsedAuthor(name: "Root Author 1", url: nil, avatarURL: nil, emailAddress: nil),
// ParsedAuthor(name: "Root Author 2", url: nil, avatarURL: nil, emailAddress: nil)
// ])
// let itemAuthors = Set([
// ParsedAuthor(name: "Item Author 1", url: nil, avatarURL: nil, emailAddress: nil),
// ParsedAuthor(name: "Item Author 2", url: nil, avatarURL: nil, emailAddress: nil)
// ])
// let legacyItemAuthors = Set([
// ParsedAuthor(name: "Legacy Item Author", url: nil, avatarURL: nil, emailAddress: nil)
// ])
//
// XCTAssertEqual(parsedFeed.authors?.count, 2)
// XCTAssertEqual(parsedFeed.authors, rootAuthors)
//
// let noAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item without authors" }!
// XCTAssertEqual(noAuthorsItem.authors, nil)
//
// let legacyAuthorItem = parsedFeed.items.first { $0.uniqueID == "Item with legacy author" }!
// XCTAssertEqual(legacyAuthorItem.authors, legacyItemAuthors)
//
// let modernAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with modern authors" }!
// XCTAssertEqual(modernAuthorsItem.authors, itemAuthors)
//
// let bothAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with both" }!
// XCTAssertEqual(bothAuthorsItem.authors, itemAuthors)
// }
//}

View File

@ -1,5 +1,5 @@
import XCTest
@testable import Parser
import FeedParser
final class ParserTests: XCTestCase {
func testExample() throws {

View File

@ -7,22 +7,22 @@
//
import XCTest
import Parser
import FeedParser
class RSSInJSONParserTests: XCTestCase {
func testScriptingNewsPerformance() {
// 0.003 sec on my 2012 iMac.
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
self.measure {
let _ = try! FeedParser.parseSync(d)
}
}
func testFeedLanguage() {
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
let parsedFeed = try! FeedParser.parseSync(d)!
XCTAssertEqual(parsedFeed.language, "en-us")
}
}
//class RSSInJSONParserTests: XCTestCase {
//
// func testScriptingNewsPerformance() {
//
// // 0.003 sec on my 2012 iMac.
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
// self.measure {
// let _ = try! FeedParser.parseSync(d)
// }
// }
//
// func testFeedLanguage() {
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
// let parsedFeed = try! FeedParser.parseSync(d)!
// XCTAssertEqual(parsedFeed.language, "en-us")
// }
//}

View File

@ -7,7 +7,7 @@
//
import XCTest
import Parser
import FeedParser
class RSSParserTests: XCTestCase {
@ -17,7 +17,7 @@ class RSSParserTests: XCTestCase {
// 0.002 2022 Mac Studio
let d = parserData("scriptingNews", "rss", "http://scripting.com/")
self.measure {
let _ = try! FeedParser.parseSync(d)
let _ = try! FeedParser.parse(d)
}
}
@ -27,7 +27,7 @@ class RSSParserTests: XCTestCase {
// 0.001 2022 Mac Studio
let d = parserData("KatieFloyd", "rss", "http://katiefloyd.com/")
self.measure {
let _ = try! FeedParser.parseSync(d)
let _ = try! FeedParser.parse(d)
}
}
@ -37,7 +37,7 @@ class RSSParserTests: XCTestCase {
// 0.0004 2022 Mac Studio
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
self.measure {
let _ = try! FeedParser.parseSync(d)
let _ = try! FeedParser.parse(d)
}
}
@ -47,21 +47,23 @@ class RSSParserTests: XCTestCase {
// 0.0006 2022 Mac Studio
let d = parserData("manton", "rss", "http://manton.org/")
self.measure {
let _ = try! FeedParser.parseSync(d)
let _ = try! FeedParser.parse(d)
}
}
func testNatashaTheRobot() async {
let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.items.count, 10)
}
func testTheOmniShowAttachments() async {
let d = parserData("theomnishow", "rss", "https://theomnishow.omnigroup.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotNil(article.attachments)
@ -78,7 +80,9 @@ class RSSParserTests: XCTestCase {
func testTheOmniShowUniqueIDs() async {
let d = parserData("theomnishow", "rss", "https://theomnishow.omnigroup.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotNil(article.uniqueID)
@ -91,7 +95,7 @@ class RSSParserTests: XCTestCase {
// Macworlds feed doesnt have guids, so they should be calculated unique IDs.
let d = parserData("macworld", "rss", "https://www.macworld.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
for article in parsedFeed.items {
XCTAssertNotNil(article.uniqueID)
@ -104,7 +108,9 @@ class RSSParserTests: XCTestCase {
// Macworld uses names instead of email addresses (despite the RSS spec saying they should be email addresses).
let d = parserData("macworld", "rss", "https://www.macworld.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
@ -123,7 +129,9 @@ class RSSParserTests: XCTestCase {
// detect this situation, and every article in the feed should have a permalink.
let d = parserData("monkeydom", "rss", "https://coding.monkeydom.de/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNil(article.url)
@ -136,7 +144,9 @@ class RSSParserTests: XCTestCase {
// https://github.com/brentsimmons/NetNewsWire/issues/529
let d = parserData("atp", "rss", "http://atp.fm/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotNil(article.contentHTML)
@ -145,7 +155,10 @@ class RSSParserTests: XCTestCase {
func testFeedKnownToHaveGuidsThatArentPermalinks() async {
let d = parserData("livemint", "xml", "https://www.livemint.com/rss/news")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNil(article.url)
}
@ -155,7 +168,10 @@ class RSSParserTests: XCTestCase {
// This feed uses atom authors, and we dont want author/title to be used as item/title.
// https://github.com/brentsimmons/NetNewsWire/issues/943
let d = parserData("cloudblog", "rss", "https://cloudblog.withgoogle.com/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotEqual(article.title, "Product Manager, Office of the CTO")
XCTAssertNotEqual(article.title, "Developer Programs Engineer")
@ -167,26 +183,29 @@ class RSSParserTests: XCTestCase {
// This invalid feed has <image> elements inside <item>s.
// 17 Jan 2021 bug report were not parsing titles in this feed.
let d = parserData("aktuality", "rss", "https://www.aktuality.sk/")
let parsedFeed = try! await FeedParser.parse(d)!
for article in parsedFeed.items {
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertTrue(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotNil(article.title)
}
}
func testFeedLanguage() async {
let d = parserData("manton", "rss", "http://manton.org/")
let parsedFeed = try! await FeedParser.parse(d)!
let parsedFeed = try! FeedParser.parse(d)!
XCTAssertEqual(parsedFeed.language, "en-US")
}
// func testFeedWithGB2312Encoding() {
// // This feed has an encoding we dont run into very often.
// // https://github.com/Ranchero-Software/NetNewsWire/issues/1477
// let d = parserData("kc0011", "rss", "http://kc0011.net/")
// let parsedFeed = try! FeedParser.parse(d)!
// XCTAssert(parsedFeed.items.count > 0)
// for article in parsedFeed.items {
// XCTAssertNotNil(article.contentHTML)
// }
// }
func testFeedWithGB2312Encoding() {
// This feed has an encoding we dont run into very often.
// https://github.com/Ranchero-Software/NetNewsWire/issues/1477
let d = parserData("kc0011", "rss", "http://kc0011.net/")
let parsedFeed = try! FeedParser.parse(d)!
XCTAssert(parsedFeed.items.count > 0)
for article in parsedFeed.items {
XCTAssertNotNil(article.contentHTML)
}
}
}