//
//  HTMLMetadataTests.swift
//  Parser
//
//  Created by Brent Simmons on 6/25/17.
//  Copyright © 2017 Ranchero Software, LLC. All rights reserved.
//

import XCTest
import Parser

final class HTMLMetadataTests: XCTestCase {

	func testDaringFireball() {

		let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
		let metadata = HTMLMetadataParser.metadata(with: d)

		XCTAssertEqual(metadata.favicons?.first?.urlString, "http://daringfireball.net/graphics/favicon.ico?v=005")

		XCTAssertEqual(metadata.feedLinks?.count, 1)

		let feedLink: HTMLMetadataFeedLink = (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 _ = HTMLMetadataParser.metadata(with: d)
		}
	}

	func testFurbo() {

		let d = parserData("furbo", "html", "http://furbo.org/")
		let metadata = HTMLMetadataParser.metadata(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 _ = HTMLMetadataParser.metadata(with: d)
		}
	}

	func testInessential() {

		let d = parserData("inessential", "html", "http://inessential.com/")
		let metadata = HTMLMetadataParser.metadata(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, 0);
	}

	func testInessentialPerformance() {

		// 0.001 sec on my 2012 iMac
		let d = parserData("inessential", "html", "http://inessential.com/")
		self.measure {
			let _ = HTMLMetadataParser.metadata(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 _ = HTMLMetadataParser.metadata(with: d)
		}
	}

	func testSixColors() {

		let d = parserData("sixcolors", "html", "http://sixcolors.com/")
		let metadata = HTMLMetadataParser.metadata(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 _ = HTMLMetadataParser.metadata(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 = HTMLMetadataParser.metadata(with: d)
		let openGraphData = metadata.openGraphProperties!
		let image = openGraphData.image!
		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 = HTMLMetadataParser.metadata(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 = HTMLMetadataParser.metadata(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");
	}
}