apple_kit

Apple-native services for Radroots iOS and macOS apps
git clone https://radroots.dev/git/apple_kit.git
Log | Files | Refs | README | LICENSE

RadrootsExternalActionsTests.swift (3370B)


      1 import Foundation
      2 import Testing
      3 
      4 @testable import RadrootsKit
      5 
      6 @Test func webDestinationAcceptsOnlyHttpsUrlsWithHosts() throws {
      7     let destination = try RadrootsExternalActionDestination.web(" https://radroots.org/field ")
      8 
      9     #expect(destination.kind == .web)
     10     #expect(destination.url?.absoluteString == "https://radroots.org/field")
     11 
     12     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     13         _ = try RadrootsExternalActionDestination.web("http://radroots.org")
     14     }
     15     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     16         _ = try RadrootsExternalActionDestination.web("wss://radroots.org")
     17     }
     18     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     19         _ = try RadrootsExternalActionDestination.web("https:///missing-host")
     20     }
     21     #expect(throws: RadrootsExternalActionError.invalidRequest) {
     22         _ = try RadrootsExternalActionDestination.web("https://radroots.org/a b")
     23     }
     24 }
     25 
     26 @Test func nostrDestinationAllowsPublicIdentifiersAndRejectsSecrets() throws {
     27     let destination = try RadrootsExternalActionDestination.nostr("nostr:NPUB1qqqqqq")
     28 
     29     #expect(destination.kind == .nostr)
     30     #expect(destination.url?.absoluteString == "nostr:npub1qqqqqq")
     31 
     32     _ = try RadrootsExternalActionDestination.nostr("nostr:nprofile1qqqqqq")
     33     _ = try RadrootsExternalActionDestination.nostr("nostr:note1qqqqqq")
     34     _ = try RadrootsExternalActionDestination.nostr("nostr:nevent1qqqqqq")
     35     _ = try RadrootsExternalActionDestination.nostr("nostr:naddr1qqqqqq")
     36     _ = try RadrootsExternalActionDestination.nostr("nostr:nrelay1qqqqqq")
     37 
     38     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     39         _ = try RadrootsExternalActionDestination.nostr("nostr:nsec1qqqqqq")
     40     }
     41     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     42         _ = try RadrootsExternalActionDestination.nostr("nostr:relay1qqqqqq")
     43     }
     44     #expect(throws: RadrootsExternalActionError.invalidRequest) {
     45         _ = try RadrootsExternalActionDestination.nostr("nostr:npub1qq q")
     46     }
     47 }
     48 
     49 @Test func appleMapsDestinationBuildsSafeMapsUrls() throws {
     50     let coordinate = try RadrootsLocationCoordinate(latitude: 49.2827, longitude: -123.1207)
     51     let destination = try RadrootsExternalActionDestination.appleMaps(
     52         coordinate: coordinate,
     53         label: "Field Site"
     54     )
     55 
     56     #expect(destination.kind == .appleMaps)
     57     #expect(destination.url?.scheme == "https")
     58     #expect(destination.url?.host == "maps.apple.com")
     59     #expect(destination.url?.absoluteString.contains("ll=49.2827,-123.1207") == true)
     60     #expect(destination.url?.absoluteString.contains("q=Field%20Site") == true)
     61 
     62     _ = try RadrootsExternalActionDestination.appleMaps("https://maps.apple.com/?q=Field")
     63 
     64     #expect(throws: RadrootsExternalActionError.blockedByPolicy) {
     65         _ = try RadrootsExternalActionDestination.appleMaps("https://example.com/maps")
     66     }
     67 }
     68 
     69 @Test func externalActionRequestPreservesDestination() throws {
     70     let destination = try RadrootsExternalActionDestination.web("https://radroots.org")
     71     let request = RadrootsExternalActionRequest(destination: destination)
     72     let capability = RadrootsExternalActionCapability(destination: destination, canOpen: true)
     73 
     74     #expect(request.destination == destination)
     75     #expect(capability.destination == destination)
     76     #expect(capability.canOpen)
     77 }