mirror of
https://github.com/home-assistant/iOS.git
synced 2026-06-18 11:15:36 -05:00
## Summary Allows attachments to be loaded on-the-fly in the content extension if they are not present. ## Link to pull request in Documentation repository Documentation: home-assistant/companion.home-assistant#510 ## Any other notes - Adds `lazy` as an option to the `attachment` dictionary. When true, this prevents the attachment from being downloaded except when displayed in the content extension. This is similar, but not identical, to hide-thumbnail. Hiding the thumbnail still uses the internal storage of the notifications which are limited to e.g. 50mb. However, we'd still want to pre-load those attachments even if the thumbnail is hidden. - Retries non-lazy attachments which failed due to a network error when the content extension opens.
177 lines
5.7 KiB
Swift
177 lines
5.7 KiB
Swift
import CoreServices
|
|
import Foundation
|
|
@testable import Shared
|
|
import XCTest
|
|
|
|
class NotificationAttachmentParserURLTests: XCTestCase {
|
|
private typealias URLError = NotificationAttachmentParserURL.URLError
|
|
|
|
private var parser: NotificationAttachmentParserURL!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
|
|
parser = NotificationAttachmentParserURL()
|
|
}
|
|
|
|
func testNoAttachment() {
|
|
let content = UNMutableNotificationContent()
|
|
let promise = parser.attachmentInfo(from: content)
|
|
XCTAssertEqual(promise.wait(), .missing)
|
|
}
|
|
|
|
func testAttachmentNoURL() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [String: Any]()
|
|
let promise = parser.attachmentInfo(from: content)
|
|
XCTAssertEqual(promise.wait(), .rejected(URLError.noURL))
|
|
}
|
|
|
|
func testInvalidURL() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "",
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
XCTAssertEqual(promise.wait(), .rejected(URLError.invalidURL))
|
|
}
|
|
|
|
func testRelativeAttachmentURL() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, nil)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
|
|
func testAbsoluteAttachmentURL() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "http://google.com/media/local/file.png",
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "http://google.com/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, false)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, nil)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
|
|
func testContentType() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
"content-type": "png",
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, kUTTypePNG)
|
|
XCTAssertEqual(result.hideThumbnail, nil)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
|
|
func testAttachmentHidden() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
"hide-thumbnail": true,
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, true)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
|
|
func testAttachmentNotHidden() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
"hide-thumbnail": false,
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, false)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
|
|
func testLazyTrue() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
"lazy": true,
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, nil)
|
|
XCTAssertEqual(result.lazy, true)
|
|
}
|
|
|
|
func testLazyFalse() {
|
|
let content = UNMutableNotificationContent()
|
|
content.userInfo["attachment"] = [
|
|
"url": "/media/local/file.png",
|
|
"lazy": false,
|
|
]
|
|
let promise = parser.attachmentInfo(from: content)
|
|
|
|
guard let result = promise.wait().attachmentInfo else {
|
|
XCTFail("not an attachment")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(result.url, URL(string: "/media/local/file.png"))
|
|
XCTAssertEqual(result.needsAuth, true)
|
|
XCTAssertEqual(result.typeHint, nil)
|
|
XCTAssertEqual(result.hideThumbnail, nil)
|
|
XCTAssertEqual(result.lazy, false)
|
|
}
|
|
}
|