Signal-iOS/SignalServiceKit/tests/Network/HTMLMetadataTests.swift
Michelle Linington 1405e46e62 IOS-823: Add description/date to link preview model
Updates the proto definition to add a preview description and date
field. Date and description metadata from fetched content will be sent
over the wire. We can't render it locally yet, but at least this will
allow supporting recipients to display the content.

Also, made some minor changes to HTMLMetadata to better handle article
publish/modified date tags.
2020-09-03 18:19:20 -07:00

145 lines
5.7 KiB
Swift

//
// Copyright (c) 2020 Open Whisper Systems. All rights reserved.
//
import Foundation
import XCTest
@testable import SignalServiceKit
class HTMLMetadataTests: SSKBaseTestSwift {
func testEmptyBody() {
let empty = HTMLMetadata.construct(parsing: "")
XCTAssertEqual(empty, HTMLMetadata())
}
func testParseTitleTags() {
let testSet: [String: String] = [
"<title>Simple</title>": "Simple",
"\nhello\n\t<title>Two Lines</title>\n\nblahhhh": "Two Lines",
"<title>Title1</title><title>Title2</title>": "Title1",
" \n\t < title \n>Oddly spaced< /title >": "Oddly spaced",
"<title>&quotEntities&quot</title>": "\"Entities\""
]
testSet.forEach { test, expectedResult in
XCTAssertEqual(
HTMLMetadata.construct(parsing: test),
HTMLMetadata(titleTag: expectedResult)
)
}
}
func testParseFaviconUrlString() {
let testSet: [String: String?] = [
"<link rel=\"icon\" href=\"test.ico\"></link>": "test.ico",
"< link rel=\" shortcut icon \" href=\"spacedddd\" />": "spacedddd",
"<link rel=\"apple-touch-icon\" href=\"incorrect tag\">": nil,
"""
<link rel=\"icon\" href=\"first\">
<link rel=\"icon\" href=\"second\">
<link rel=\"icon\" href=\"third\">
""": "first",
"<link href=\"href first\" rel=\"icon\">": "href first"
]
testSet.forEach { test, expectedResult in
XCTAssertEqual(
HTMLMetadata.construct(parsing: test),
HTMLMetadata(faviconUrlString: expectedResult)
)
}
}
func testParseMetaDescription() {
let testSet: [String: String?] = [
"<meta name=\"description\" content=\"DescriptionText\" />": "DescriptionText",
"< meta name = \"description\" \n\n\n content=\"Spaced Description\" />": "Spaced Description",
"<meta name=\"description\" content=\"DescriptionText\" /><meta name=\"description\" content=\"Repeat\" />": "DescriptionText",
"<meta property=\"description\" content=\"DescriptionText\" />": nil
]
testSet.forEach { test, expectedResult in
XCTAssertEqual(
HTMLMetadata.construct(parsing: test),
HTMLMetadata(description: expectedResult)
)
}
}
func testParseOpengraphTitle() {
let testSet: [String: String?] = [
"<meta property=\"og:title\" content=\"TestTitle\">": "TestTitle",
"<meta content=\"FlippedTitle\" property=\"og:title\">": "FlippedTitle",
"<meta garbage1\t=\ngarbage property=\"og:title\" garbage2 = garbage content=\"TitleWithGarbage\" garbage3=garbage kafdjadk>": "TitleWithGarbage",
"<meta property=\"og:title\" content=\"Title\"><meta property=\"og:title\" content=\"Repeat\">": "Title"
]
testSet.forEach { test, expectedResult in
XCTAssertEqual(
HTMLMetadata.construct(parsing: test),
HTMLMetadata(ogTitle: expectedResult)
)
}
}
func testParseOneOfEach_Simple() {
let testHTML = """
<title>TitleString</title>
<link rel="icon" href="FaviconString" />
<meta name="description" content="DescriptionString" />
<meta property="og:title" content="OpengraphTitle" />
<meta property="og:description" content="OpengraphDescription" />
<meta property="og:image" content="ImageURL" />
<meta property="og:image:url" content="FallbackImageURL" />
<meta property="og:published_time" content="PublishedDate" />
<meta property="article:published_time" content="ArticlePublishedDate" />
<meta property="og:modified_time" content="ModifiedDate" />
<meta property="article:modified_time" content="ArticleModifiedDate" />
"""
let testMetadata = HTMLMetadata.construct(parsing: testHTML)
XCTAssertEqual(testMetadata, HTMLMetadata(
titleTag: "TitleString",
faviconUrlString: "FaviconString",
description: "DescriptionString",
ogTitle: "OpengraphTitle",
ogDescription: "OpengraphDescription",
ogImageUrlString: "ImageURL",
ogPublishDateString: "PublishedDate",
articlePublishDateString: "ArticlePublishedDate",
ogModifiedDateString: "ModifiedDate",
articleModifiedDateString: "ArticleModifiedDate"
))
}
func testParseFallbackImage() {
let testHTML = """
<title>TitleString</title>
<link rel="icon" href="FaviconString" />
<meta name="description" content="DescriptionString" />
<meta property="og:image:url" content="FallbackImageURL" />
"""
let testMetadata = HTMLMetadata.construct(parsing: testHTML)
XCTAssertEqual(testMetadata, HTMLMetadata(
titleTag: "TitleString",
faviconUrlString: "FaviconString",
description: "DescriptionString",
ogImageUrlString: "FallbackImageURL"
))
}
func testLinkDataParsing() {
let linkText = ("<meta property=\"og:title\" content=\"Randomness is Random - Numberphile\">" +
"<meta property=\"og:image\" content=\"https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg\">")
let content = HTMLMetadata.construct(parsing: linkText)
XCTAssertNotNil(content)
XCTAssertEqual(content.ogTitle, "Randomness is Random - Numberphile")
XCTAssertEqual(content.ogImageUrlString, "https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg")
}
}