78 lines
2.8 KiB
Swift
78 lines
2.8 KiB
Swift
import SwiftUI
|
|
import XCTest
|
|
@testable import MacTools
|
|
@testable import CalendarPlugin
|
|
|
|
@MainActor
|
|
final class CalendarPluginIntegrationTests: XCTestCase {
|
|
private let suiteName = "CalendarPluginIntegrationTests"
|
|
|
|
override func tearDown() {
|
|
UserDefaults(suiteName: suiteName)?.removePersistentDomain(forName: suiteName)
|
|
super.tearDown()
|
|
}
|
|
|
|
func testCalendarPluginAppearsOnlyInComponentPanelAtFullWidth() {
|
|
let defaults = UserDefaults(suiteName: suiteName)!
|
|
defaults.removePersistentDomain(forName: suiteName)
|
|
let host = PluginHost(
|
|
plugins: [CalendarPlugin()],
|
|
shortcutStore: ShortcutStore(userDefaults: defaults),
|
|
pluginDisplayPreferencesStore: PluginDisplayPreferencesStore(userDefaults: defaults),
|
|
globalShortcutManager: GlobalShortcutManager()
|
|
)
|
|
|
|
XCTAssertTrue(host.panelItems.isEmpty)
|
|
XCTAssertEqual(host.componentItems.map(\.id), ["calendar"])
|
|
XCTAssertEqual(host.componentItems.first?.span.width, 4)
|
|
XCTAssertEqual(host.componentItems.first?.span.height, 37)
|
|
XCTAssertEqual(host.permissionCards.map(\.permissionID), ["calendar-events", "calendar-automation"])
|
|
XCTAssertEqual(host.pluginConfigurationItems.map(\.id), ["calendar"])
|
|
XCTAssertEqual(host.pluginConfigurationItems.first?.permissionCards.map(\.permissionID), [
|
|
"calendar-events",
|
|
"calendar-automation"
|
|
])
|
|
}
|
|
|
|
func testCalendarPermissionActionRequestsEventAccess() async {
|
|
let service = MockCalendarPermissionService(
|
|
authorization: .notDetermined,
|
|
requestResult: .fullAccess
|
|
)
|
|
let plugin = CalendarPlugin(eventService: service)
|
|
let stateChanged = expectation(description: "calendar permission state changed")
|
|
plugin.onStateChange = {
|
|
stateChanged.fulfill()
|
|
}
|
|
|
|
plugin.handlePermissionAction(id: "calendar-events")
|
|
|
|
await fulfillment(of: [stateChanged], timeout: 1)
|
|
XCTAssertEqual(service.requestAccessCallCount, 1)
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
private final class MockCalendarPermissionService: CalendarEventServicing {
|
|
var authorization: CalendarEventAuthorization
|
|
private let requestResult: CalendarEventAuthorization
|
|
private(set) var requestAccessCallCount = 0
|
|
|
|
init(authorization: CalendarEventAuthorization, requestResult: CalendarEventAuthorization) {
|
|
self.authorization = authorization
|
|
self.requestResult = requestResult
|
|
}
|
|
|
|
func requestAccess() async -> CalendarEventAuthorization {
|
|
requestAccessCallCount += 1
|
|
authorization = requestResult
|
|
return requestResult
|
|
}
|
|
|
|
func events(from startDate: Date, to endDate: Date) async throws -> [CalendarEventInput] {
|
|
[]
|
|
}
|
|
|
|
func openSystemCalendar(at date: Date) {}
|
|
}
|