From 3bb9887513f400833e37b8e99a97e868d5efac0c Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 25 Jun 2017 18:11:38 -0700 Subject: [PATCH] Add HTML tests to RSParser. --- Frameworks/RSParser/README.md | 2 +- .../RSParser.xcodeproj/project.pbxproj | 8 ++ .../RSParserTests/HTMLLinkTests.swift | 42 +++++++ .../RSParserTests/HTMLMetadataTests.swift | 114 ++++++++++++++++++ 4 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 Frameworks/RSParser/RSParserTests/HTMLLinkTests.swift create mode 100644 Frameworks/RSParser/RSParserTests/HTMLMetadataTests.swift diff --git a/Frameworks/RSParser/README.md b/Frameworks/RSParser/README.md index 7a530aa12..a8262b380 100644 --- a/Frameworks/RSParser/README.md +++ b/Frameworks/RSParser/README.md @@ -1,6 +1,6 @@ # RSParser -(Note: I haven’t written tests yet. It’s possible that none of this works.) +(Note: Tests are still incomplete. It’s possible that none of this works.) (Also note: this framework is intended to supersede my [RSXML](https://github.com/brentsimmons/RSXML) framework. Use this one instead. Well, once it’s working, that is.) diff --git a/Frameworks/RSParser/RSParser.xcodeproj/project.pbxproj b/Frameworks/RSParser/RSParser.xcodeproj/project.pbxproj index 017229d13..396ecb1a0 100644 --- a/Frameworks/RSParser/RSParser.xcodeproj/project.pbxproj +++ b/Frameworks/RSParser/RSParser.xcodeproj/project.pbxproj @@ -69,6 +69,8 @@ 849A03DE1F00837A00122600 /* FeedParserTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03DD1F00837A00122600 /* FeedParserTypeTests.swift */; }; 849A03E01F0088F600122600 /* OPMLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03DF1F0088F600122600 /* OPMLTests.swift */; }; 849A03E21F00902C00122600 /* RSDateParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E11F00902C00122600 /* RSDateParserTests.m */; }; + 849A03E41F00912100122600 /* HTMLMetadataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E31F00912100122600 /* HTMLMetadataTests.swift */; }; + 849A03E61F00952400122600 /* HTMLLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E51F00952400122600 /* HTMLLinkTests.swift */; }; 84D81BDC1EFA28E700652332 /* RSParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D81BDA1EFA28E700652332 /* RSParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84D81BDE1EFA2B7D00652332 /* ParsedFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D81BDD1EFA2B7D00652332 /* ParsedFeed.swift */; }; 84D81BE01EFA2BAE00652332 /* FeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D81BDF1EFA2BAE00652332 /* FeedType.swift */; }; @@ -153,6 +155,8 @@ 849A03DD1F00837A00122600 /* FeedParserTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedParserTypeTests.swift; sourceTree = ""; }; 849A03DF1F0088F600122600 /* OPMLTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OPMLTests.swift; sourceTree = ""; }; 849A03E11F00902C00122600 /* RSDateParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSDateParserTests.m; sourceTree = ""; }; + 849A03E31F00912100122600 /* HTMLMetadataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLMetadataTests.swift; sourceTree = ""; }; + 849A03E51F00952400122600 /* HTMLLinkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLLinkTests.swift; sourceTree = ""; }; 84D81BD91EFA28E700652332 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 84D81BDA1EFA28E700652332 /* RSParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSParser.h; sourceTree = ""; }; 84D81BDD1EFA2B7D00652332 /* ParsedFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ParsedFeed.swift; path = Feeds/ParsedFeed.swift; sourceTree = ""; }; @@ -357,6 +361,8 @@ 849A03DD1F00837A00122600 /* FeedParserTypeTests.swift */, 849A03DF1F0088F600122600 /* OPMLTests.swift */, 849A03E11F00902C00122600 /* RSDateParserTests.m */, + 849A03E31F00912100122600 /* HTMLMetadataTests.swift */, + 849A03E51F00952400122600 /* HTMLLinkTests.swift */, 849A03C41F0081EA00122600 /* Resources */, 84FF5F941EFA285800C15A01 /* Info.plist */, ); @@ -545,8 +551,10 @@ buildActionMask = 2147483647; files = ( 849A03E01F0088F600122600 /* OPMLTests.swift in Sources */, + 849A03E61F00952400122600 /* HTMLLinkTests.swift in Sources */, 849A03E21F00902C00122600 /* RSDateParserTests.m in Sources */, 849A03DE1F00837A00122600 /* FeedParserTypeTests.swift in Sources */, + 849A03E41F00912100122600 /* HTMLMetadataTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Frameworks/RSParser/RSParserTests/HTMLLinkTests.swift b/Frameworks/RSParser/RSParserTests/HTMLLinkTests.swift new file mode 100644 index 000000000..545a669b6 --- /dev/null +++ b/Frameworks/RSParser/RSParserTests/HTMLLinkTests.swift @@ -0,0 +1,42 @@ +// +// HTMLLinkTests.swift +// RSParser +// +// Created by Brent Simmons on 6/25/17. +// Copyright © 2017 Ranchero Software, LLC. All rights reserved. +// + +import XCTest +import RSParser + +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 week’s 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) + } + +} diff --git a/Frameworks/RSParser/RSParserTests/HTMLMetadataTests.swift b/Frameworks/RSParser/RSParserTests/HTMLMetadataTests.swift new file mode 100644 index 000000000..8c9d15e21 --- /dev/null +++ b/Frameworks/RSParser/RSParserTests/HTMLMetadataTests.swift @@ -0,0 +1,114 @@ +// +// HTMLMetadataTests.swift +// RSParser +// +// Created by Brent Simmons on 6/25/17. +// Copyright © 2017 Ranchero Software, LLC. All rights reserved. +// + +import XCTest +import RSParser + +class HTMLMetadataTests: XCTestCase { + + func testDaringFireball() { + + let d = parserData("DaringFireball", "html", "http://daringfireball.net/") + let metadata = RSHTMLMetadataParser.htmlMetadata(with: d) + + XCTAssertEqual(metadata.faviconLink, "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.faviconLink, "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.faviconLink) + + 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 testSixColors() { + + let d = parserData("sixcolors", "html", "http://sixcolors.com/") + let metadata = RSHTMLMetadataParser.htmlMetadata(with: d) + + XCTAssertEqual(metadata.faviconLink, "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) + } + } +}