diff --git a/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift b/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift index bd89c2823b..f731beb7a3 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift +++ b/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift @@ -740,11 +740,11 @@ public class OWSLinkPreviewManager: NSObject { Logger.error("Invalid image URL.") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } - guard let imageFileExtension = fileExtension(forImageUrl: imageUrlString) else { + guard let imageFileExtension = type(of: self).fileExtension(forImageUrl: imageUrlString) else { Logger.error("Image URL has unknown or invalid file extension: \(imageUrlString).") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } - guard let imageMimeType = mimetype(forImageFileExtension: imageFileExtension) else { + guard let imageMimeType = type(of: self).mimetype(forImageFileExtension: imageFileExtension) else { Logger.error("Image URL has unknown or invalid content type: \(imageUrl).") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } @@ -798,7 +798,7 @@ public class OWSLinkPreviewManager: NSObject { return OWSLinkPreviewContents(title: title, imageUrl: imageUrlString) } - func fileExtension(forImageUrl urlString: String) -> String? { + class func fileExtension(forImageUrl urlString: String) -> String? { guard let imageUrl = URL(string: urlString) else { Logger.error("Could not parse image URL.") return nil @@ -811,7 +811,7 @@ public class OWSLinkPreviewManager: NSObject { return imageFileExtension } - func mimetype(forImageFileExtension imageFileExtension: String) -> String? { + class func mimetype(forImageFileExtension imageFileExtension: String) -> String? { guard imageFileExtension.count > 0 else { return nil } diff --git a/SignalServiceKit/tests/Messages/OWSLinkPreviewTest.swift b/SignalServiceKit/tests/Messages/OWSLinkPreviewTest.swift index 97ce56fb78..d04c58d3f7 100644 --- a/SignalServiceKit/tests/Messages/OWSLinkPreviewTest.swift +++ b/SignalServiceKit/tests/Messages/OWSLinkPreviewTest.swift @@ -95,87 +95,87 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { } func testIsValidLinkUrl() { - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.youtube.com/watch?v=tP-Ipsat90c")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://youtube.com/watch?v=tP-Ipsat90c")) + Assert(validPreviewLink: "https://www.youtube.com/watch?v=tP-Ipsat90c") + Assert(validPreviewLink: "https://youtube.com/watch?v=tP-Ipsat90c") // Case shouldn't matter. - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://WWW.YOUTUBE.COM/watch?v=tP-Ipsat90c")) + Assert(validPreviewLink: "https://WWW.YOUTUBE.COM/watch?v=tP-Ipsat90c") // Don't allow arbitrary subdomains. - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://some.random.subdomain.youtube.com/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewMedia: "https://some.random.subdomain.youtube.com/watch?v=tP-Ipsat90c") // Don't allow HTTP, only HTTPS - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("http://youtube.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("mailto://youtube.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("ftp://youtube.com/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewLink: "http://youtube.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "mailto://youtube.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "ftp://youtube.com/watch?v=tP-Ipsat90c") // Don't allow similar domains. - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://xyoutube.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://youtubex.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://youtube.comx/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://www.xyoutube.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://www.youtubex.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://www.youtube.comx/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewLink: "https://xyoutube.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "https://youtubex.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "https://youtube.comx/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "https://www.xyoutube.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "https://www.youtubex.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewLink: "https://www.youtube.comx/watch?v=tP-Ipsat90c") // Don't allow media domains. - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg")) + Assert(invalidPreviewLink: "https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg") // Allow all whitelisted domains. - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.youtube.com/watch?v=tP-Ipsat90c")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://youtu.be/tP-Ipsat90c")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.reddit.com/r/androiddev/comments/a7gctz/androidx_release_notes_this_is_the_first_release/")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.reddit.com/r/WhitePeopleTwitter/comments/a7j3mm/why/")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/KFCL8fm")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/FMdwTiV")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_web_button_share_sheet")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_share_sheet&igshid=94c7ihqjfmbm")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/igHOwDM")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://pinterest.com/something")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.pinterest.com/something")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://pin.it/something")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.pinterest.com/ohjoy/recipes/")) + Assert(validPreviewLink: "https://www.youtube.com/watch?v=tP-Ipsat90c") + Assert(validPreviewLink: "https://youtu.be/tP-Ipsat90c") + Assert(validPreviewLink: "https://www.reddit.com/r/androiddev/comments/a7gctz/androidx_release_notes_this_is_the_first_release/") + Assert(validPreviewLink: "https://www.reddit.com/r/WhitePeopleTwitter/comments/a7j3mm/why/") + Assert(validPreviewLink: "https://imgur.com/gallery/KFCL8fm") + Assert(validPreviewLink: "https://imgur.com/gallery/FMdwTiV") + Assert(validPreviewLink: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_web_button_share_sheet") + Assert(validPreviewLink: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_share_sheet&igshid=94c7ihqjfmbm") + Assert(validPreviewLink: "https://imgur.com/gallery/igHOwDM") + Assert(validPreviewLink: "https://pinterest.com/something") + Assert(validPreviewLink: "https://www.pinterest.com/something") + Assert(validPreviewLink: "https://pin.it/something") + Assert(validPreviewLink: "https://www.pinterest.com/ohjoy/recipes/") // Strip trailing commas. - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/igHOwDM,")) + Assert(validPreviewLink: "https://imgur.com/gallery/igHOwDM,") // Ignore URLs with an empty path. - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://imgur.com")) - XCTAssertFalse(OWSLinkPreview.isValidLinkUrl("https://imgur.com/")) - XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/X")) + Assert(invalidPreviewLink: "https://imgur.com") + Assert(invalidPreviewLink: "https://imgur.com/") + Assert(validPreviewLink: "https://imgur.com/X") } func testIsValidMediaUrl() { // Only allow domains on the media whitelist. - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://www.youtube.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://youtube.com/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewMedia: "https://www.youtube.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://youtube.com/watch?v=tP-Ipsat90c") // Allow arbitrary subdomains. - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://ytimg.com/something")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://something.ytimg.com/something")) + Assert(validPreviewMedia: "https://ytimg.com/something") + Assert(validPreviewMedia: "https://something.ytimg.com/something") // Don't allow HTTP, only HTTPS - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("http://ytimg.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("mailto://ytimg.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("ftp://ytimg.com/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewMedia: "http://ytimg.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "mailto://ytimg.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "ftp://ytimg.com/watch?v=tP-Ipsat90c") // Don't allow similar domains. - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://xytimg.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://youtubex.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://ytimg.comx/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://www.xytimg.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://www.ytimgx.com/watch?v=tP-Ipsat90c")) - XCTAssertFalse(OWSLinkPreview.isValidMediaUrl("https://www.ytimg.comx/watch?v=tP-Ipsat90c")) + Assert(invalidPreviewMedia: "https://xytimg.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://youtubex.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://ytimg.comx/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://www.xytimg.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://www.ytimgx.com/watch?v=tP-Ipsat90c") + Assert(invalidPreviewMedia: "https://www.ytimg.comx/watch?v=tP-Ipsat90c") // Allow media domains. - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://external-preview.redd.it/j5lhdY0huShdzyrbSEdKzOb09BKhNreyEZOLDu1UzBA.jpg?auto=webp&s=2cb8bdb5ac5b54fc9514719030c0c9f08a03f684")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://preview.redd.it/ehakvm9vx5521.jpg?auto=webp&s=925fb2d8776ca7102b944ab00e0615ae20c1bd5a")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://i.imgur.com/Y3wjlwY.jpg?fb")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://i.imgur.com/Vot3iHh.jpg?fbplay")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://i.imgur.com/PYiyLv1.jpg?fbplay")) - XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://pinimg.com/something")) + Assert(validPreviewMedia: "https://i.ytimg.com/vi/tP-Ipsat90c/maxresdefault.jpg") + Assert(validPreviewMedia: "https://external-preview.redd.it/j5lhdY0huShdzyrbSEdKzOb09BKhNreyEZOLDu1UzBA.jpg?auto=webp&s=2cb8bdb5ac5b54fc9514719030c0c9f08a03f684") + Assert(validPreviewMedia: "https://preview.redd.it/ehakvm9vx5521.jpg?auto=webp&s=925fb2d8776ca7102b944ab00e0615ae20c1bd5a") + Assert(validPreviewMedia: "https://i.imgur.com/Y3wjlwY.jpg?fb") + Assert(validPreviewMedia: "https://i.imgur.com/Vot3iHh.jpg?fbplay") + Assert(validPreviewMedia: "https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com") + Assert(validPreviewMedia: "https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com") + Assert(validPreviewMedia: "https://i.imgur.com/PYiyLv1.jpg?fbplay") + Assert(validPreviewMedia: "https://pinimg.com/something") } func testPreviewUrlForMessageBodyText() { @@ -196,28 +196,28 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { } func testUtils() { - XCTAssertNil(OWSLinkPreview.fileExtension(forImageUrl: "")) - XCTAssertNil(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename")) - XCTAssertNil(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename.")) + XCTAssertNil(OWSLinkPreviewManager.fileExtension(forImageUrl: "")) + XCTAssertNil(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename")) + XCTAssertNil(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename.")) - XCTAssertEqual(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename.jpg"), "jpg") - XCTAssertEqual(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename.gif"), "gif") - XCTAssertEqual(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename.png"), "png") - XCTAssertEqual(OWSLinkPreview.fileExtension(forImageUrl: "https://www.some.host/path/imagename.boink"), "boink") + XCTAssertEqual(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename.jpg"), "jpg") + XCTAssertEqual(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename.gif"), "gif") + XCTAssertEqual(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename.png"), "png") + XCTAssertEqual(OWSLinkPreviewManager.fileExtension(forImageUrl: "https://www.some.host/path/imagename.boink"), "boink") - XCTAssertNil(OWSLinkPreview.mimetype(forImageFileExtension: "")) - XCTAssertNil(OWSLinkPreview.mimetype(forImageFileExtension: "boink")) - XCTAssertNil(OWSLinkPreview.mimetype(forImageFileExtension: "tiff")) - XCTAssertNil(OWSLinkPreview.mimetype(forImageFileExtension: "gif")) + XCTAssertNil(OWSLinkPreviewManager.mimetype(forImageFileExtension: "")) + XCTAssertNil(OWSLinkPreviewManager.mimetype(forImageFileExtension: "boink")) + XCTAssertNil(OWSLinkPreviewManager.mimetype(forImageFileExtension: "tiff")) + XCTAssertNil(OWSLinkPreviewManager.mimetype(forImageFileExtension: "gif")) - XCTAssertEqual(OWSLinkPreview.mimetype(forImageFileExtension: "jpg"), OWSMimeTypeImageJpeg) - XCTAssertEqual(OWSLinkPreview.mimetype(forImageFileExtension: "png"), OWSMimeTypeImagePng) + XCTAssertEqual(OWSLinkPreviewManager.mimetype(forImageFileExtension: "jpg"), OWSMimeTypeImageJpeg) + XCTAssertEqual(OWSLinkPreviewManager.mimetype(forImageFileExtension: "png"), OWSMimeTypeImagePng) } func testLinkDownloadAndParsing() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.tryToBuildPreviewInfo(previewUrl: "https://www.youtube.com/watch?v=tP-Ipsat90c") + linkPreviewManager.tryToBuildPreviewInfo(previewUrl: "https://www.youtube.com/watch?v=tP-Ipsat90c") .done { (draft: OWSLinkPreviewDraft) in XCTAssertNotNil(draft) @@ -238,7 +238,7 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { let linkText = "" let linkData = linkText.data(using: .utf8)! - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertNil(content.title) @@ -250,7 +250,7 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { "") let linkData = linkText.data(using: .utf8)! - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Randomness is Random - Numberphile") @@ -260,9 +260,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData1() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.youtube.com/watch?v=tP-Ipsat90c") + linkPreviewManager.downloadLink(url: "https://www.youtube.com/watch?v=tP-Ipsat90c") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Randomness is Random - Numberphile") @@ -281,9 +281,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData2() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://youtu.be/tP-Ipsat90c") + linkPreviewManager.downloadLink(url: "https://youtu.be/tP-Ipsat90c") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Randomness is Random - Numberphile") @@ -302,9 +302,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData3() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.reddit.com/r/androiddev/comments/a7gctz/androidx_release_notes_this_is_the_first_release/") + linkPreviewManager.downloadLink(url: "https://www.reddit.com/r/androiddev/comments/a7gctz/androidx_release_notes_this_is_the_first_release/") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "r/androiddev - AndroidX release notes | This is the first release of SavedState") @@ -323,9 +323,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData4() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.reddit.com/r/WhitePeopleTwitter/comments/a7j3mm/why/") + linkPreviewManager.downloadLink(url: "https://www.reddit.com/r/WhitePeopleTwitter/comments/a7j3mm/why/") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "r/WhitePeopleTwitter - Why") @@ -344,9 +344,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData5() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://imgur.com/gallery/KFCL8fm") + linkPreviewManager.downloadLink(url: "https://imgur.com/gallery/KFCL8fm") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertNil(content.title) @@ -365,9 +365,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData6() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://imgur.com/gallery/FMdwTiV") + linkPreviewManager.downloadLink(url: "https://imgur.com/gallery/FMdwTiV") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Freddy would be proud!") @@ -386,9 +386,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData7() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_web_button_share_sheet") + linkPreviewManager.downloadLink(url: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_web_button_share_sheet") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Walter \"MFPallytime\" on Instagram: “Lol gg”") @@ -413,9 +413,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData8() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_share_sheet&igshid=94c7ihqjfmbm") + linkPreviewManager.downloadLink(url: "https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_share_sheet&igshid=94c7ihqjfmbm") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Walter \"MFPallytime\" on Instagram: “Lol gg”") @@ -424,7 +424,7 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { // It seems like some parts of the URL are stable, so we can pattern match, but if this continues to be brittle we may choose // to remove it or stub the network response XCTAssertMatch(expectedPattern: "^https://.*.cdninstagram.com/.*/47690175_2275988962411653_1145978227188801192_n.jpg\\?.*$", - actualText: content.imageUrl!) + actualText: content.imageUrl!) expectation.fulfill() }.catch { (error) in @@ -439,9 +439,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData9() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://imgur.com/gallery/igHOwDM") + linkPreviewManager.downloadLink(url: "https://imgur.com/gallery/igHOwDM") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Sheet dance") @@ -460,9 +460,9 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { func testLinkParsingWithRealData10() { let expectation = self.expectation(description: "link download and parsing") - OWSLinkPreview.downloadLink(url: "https://www.pinterest.com/ohjoy/recipes/") + linkPreviewManager.downloadLink(url: "https://www.pinterest.com/ohjoy/recipes/") .done { (linkData) in - let content = try! OWSLinkPreview.parse(linkData: linkData) + let content = try! self.linkPreviewManager.parse(linkData: linkData) XCTAssertNotNil(content) XCTAssertEqual(content.title, "Recipes") @@ -576,8 +576,45 @@ class OWSLinkPreviewTest: SSKBaseTestSwift { selectedRange: NSRange(location: 3, length: 0)) } + var linkPreviewManager: OWSLinkPreviewManager { + return SSKEnvironment.shared.linkPreviewManager + } + private func Assert(bodyText: String, extractsLink link: String?, selectedRange: NSRange? = nil, file: StaticString = #file, line: UInt = #line) { - let actual = OWSLinkPreview.previewUrl(forMessageBodyText: bodyText, selectedRange: selectedRange) + let actual = linkPreviewManager.previewUrl(forMessageBodyText: bodyText, selectedRange: selectedRange) XCTAssertEqual(actual, link, file: file, line: line) } + + private func Assert(validPreviewLink urlString: String, file: StaticString = #file, line: UInt = #line) { + guard let url = URL(string: urlString) else { + XCTFail("unparsable url", file: file, line: line) + return + } + XCTAssertTrue(OWSLinkPreviewManager.isValidLink(url: url), file: file, line: line) + } + + private func Assert(invalidPreviewLink urlString: String, file: StaticString = #file, line: UInt = #line) { + guard let url = URL(string: urlString) else { + XCTFail("unparsable url", file: file, line: line) + return + } + XCTAssertFalse(OWSLinkPreviewManager.isValidLink(url: url), file: file, line: line) + } + + private func Assert(validPreviewMedia urlString: String, file: StaticString = #file, line: UInt = #line) { + guard let url = URL(string: urlString) else { + XCTFail("unparsable url", file: file, line: line) + return + } + XCTAssertTrue(OWSLinkPreviewManager.isValidMedia(url: url), file: file, line: line) + } + + private func Assert(invalidPreviewMedia urlString: String, file: StaticString = #file, line: UInt = #line) { + guard let url = URL(string: urlString) else { + XCTFail("unparsable url", file: file, line: line) + return + } + XCTAssertFalse(OWSLinkPreviewManager.isValidMedia(url: url), file: file, line: line) + } + }