diff --git a/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift index 125c83532..2e60b7dad 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift @@ -40,11 +40,11 @@ public struct FeedParser { case .rss: let feed = RSSParser.parsedFeed(with: parserData) - return RSSFeedTransformer.parsedFeed(with: feed) + return RSSFeedTransformer.parsedFeed(with: feed, feedType: .rss) case .atom: let feed = AtomParser.parsedFeed(with: parserData) - return RSSFeedTransformer.parsedFeed(with: feed) + return RSSFeedTransformer.parsedFeed(with: feed, feedType: .atom) case .unknown, .notAFeed: return nil diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift index b0b93a6e3..297470b85 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift @@ -35,6 +35,6 @@ final class RSSAuthor { func isEmpty() -> Bool { - name != nil || url != nil || avatarURL != nil || emailAddress != nil + name == nil && url == nil && avatarURL == nil && emailAddress == nil } } diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSFeedTransformer.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSFeedTransformer.swift index 4c14907f1..4264a12f5 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSFeedTransformer.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSFeedTransformer.swift @@ -11,10 +11,10 @@ import Foundation struct RSSFeedTransformer { /// Turn an internal RSSFeed into a public ParsedFeed. - static func parsedFeed(with rssFeed: RSSFeed) -> ParsedFeed { + static func parsedFeed(with feed: RSSFeed, feedType: FeedType) -> ParsedFeed { - let items = parsedItems(rssFeed.articles) - return ParsedFeed(type: .rss, title: rssFeed.title, homePageURL: rssFeed.link, feedURL: rssFeed.urlString, language: rssFeed.language, feedDescription: nil, nextURL: nil, iconURL: nil, faviconURL: nil, authors: nil, expired: false, hubs: nil, items: items) + let items = parsedItems(feed.articles) + return ParsedFeed(type: feedType, title: feed.title, homePageURL: feed.link, feedURL: feed.urlString, language: feed.language, feedDescription: nil, nextURL: nil, iconURL: nil, faviconURL: nil, authors: nil, expired: false, hubs: nil, items: items) } } diff --git a/Modules/Parser/Tests/FeedParserTests/AtomParserTests.swift b/Modules/Parser/Tests/FeedParserTests/AtomParserTests.swift index 71647f10f..3a83ba994 100644 --- a/Modules/Parser/Tests/FeedParserTests/AtomParserTests.swift +++ b/Modules/Parser/Tests/FeedParserTests/AtomParserTests.swift @@ -9,99 +9,99 @@ import XCTest import FeedParser -//class AtomParserTests: XCTestCase { -// -// func testDaringFireballPerformance() { -// -// // 0.009 sec on my 2012 iMac. -// let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s 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/") //It’s 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 they’re 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/") //It’s actually an Atom feed + self.measure { + let _ = try! FeedParser.parse(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.parse(d) + } + } + + func testGettingHomePageLink() { + + let d = parserData("allthis", "atom", "http://leancrew.com/all-this") + let parsedFeed = try! FeedParser.parse(d)! + + XCTAssertTrue(parsedFeed.homePageURL == "http://leancrew.com/all-this") + } + + func testDaringFireball() { + + let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s actually an Atom feed + let parsedFeed = try! 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() { + + // Thanks to Marco for finding me some Atom podcast feeds. Apparently they’re super-rare. + + let d = parserData("4fsodonline", "atom", "http://4fsodonline.blogspot.com/") + let parsedFeed = try! 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() { + + // Another from Marco. + + let d = parserData("expertopinionent", "atom", "http://expertopinionent.typepad.com/my-blog/") + let parsedFeed = try! 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") + } + } +}