apple_kit

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

RadrootsPermissionLocationTesting.swift (3884B)


      1 import Foundation
      2 import RadrootsKit
      3 
      4 public actor RadrootsInMemoryPermissionStatusProvider: RadrootsPermissionStatusProvider {
      5     private var statuses: [RadrootsPermissionKind: RadrootsPermissionStatus]
      6     private var observedAt: Date
      7     private let defaultStatus: RadrootsPermissionStatus
      8 
      9     public init(
     10         statuses: [RadrootsPermissionKind: RadrootsPermissionStatus] = [:],
     11         defaultStatus: RadrootsPermissionStatus = .notDetermined,
     12         observedAt: Date = Date(timeIntervalSince1970: 0)
     13     ) {
     14         self.statuses = statuses
     15         self.defaultStatus = defaultStatus
     16         self.observedAt = observedAt
     17     }
     18 
     19     public func setStatus(_ status: RadrootsPermissionStatus, for kind: RadrootsPermissionKind, observedAt: Date? = nil) {
     20         statuses[kind] = status
     21         if let observedAt {
     22             self.observedAt = observedAt
     23         }
     24     }
     25 
     26     public func snapshot(for kind: RadrootsPermissionKind) async throws -> RadrootsPermissionSnapshot {
     27         RadrootsPermissionSnapshot(
     28             kind: kind,
     29             status: statuses[kind] ?? defaultStatus,
     30             observedAt: observedAt
     31         )
     32     }
     33 }
     34 
     35 public actor RadrootsFakeLocationServices: RadrootsLocationServices {
     36     private var availability: RadrootsLocationServicesAvailability
     37     private var authorizationAfterRequest: RadrootsLocationAuthorization
     38     private var currentLocationOutcome: Result<RadrootsLocationReading, RadrootsLocationServicesError>
     39     private var requestAuthorizationCountValue: Int
     40     private var currentLocationRequestCountValue: Int
     41 
     42     public init(
     43         availability: RadrootsLocationServicesAvailability = RadrootsLocationServicesAvailability(
     44             locationServicesEnabled: true,
     45             authorization: .notDetermined
     46         ),
     47         authorizationAfterRequest: RadrootsLocationAuthorization = .authorizedWhenInUse,
     48         currentLocationOutcome: Result<RadrootsLocationReading, RadrootsLocationServicesError>
     49     ) {
     50         self.availability = availability
     51         self.authorizationAfterRequest = authorizationAfterRequest
     52         self.currentLocationOutcome = currentLocationOutcome
     53         self.requestAuthorizationCountValue = 0
     54         self.currentLocationRequestCountValue = 0
     55     }
     56 
     57     public func setAvailability(_ availability: RadrootsLocationServicesAvailability) {
     58         self.availability = availability
     59     }
     60 
     61     public func setAuthorizationAfterRequest(_ authorization: RadrootsLocationAuthorization) {
     62         self.authorizationAfterRequest = authorization
     63     }
     64 
     65     public func setCurrentLocationOutcome(_ outcome: Result<RadrootsLocationReading, RadrootsLocationServicesError>) {
     66         currentLocationOutcome = outcome
     67     }
     68 
     69     public func currentAvailability() async -> RadrootsLocationServicesAvailability {
     70         availability
     71     }
     72 
     73     public func requestWhenInUseAuthorization() async throws -> RadrootsLocationAuthorization {
     74         requestAuthorizationCountValue += 1
     75         availability = RadrootsLocationServicesAvailability(
     76             locationServicesEnabled: availability.locationServicesEnabled,
     77             authorization: authorizationAfterRequest
     78         )
     79         return authorizationAfterRequest
     80     }
     81 
     82     public func currentLocation(_ request: RadrootsCurrentLocationRequest) async throws -> RadrootsCurrentLocationResult {
     83         currentLocationRequestCountValue += 1
     84         switch currentLocationOutcome {
     85         case .success(let reading):
     86             return try RadrootsCurrentLocationResult(
     87                 reading: reading,
     88                 authorization: availability.authorization
     89             )
     90         case .failure(let error):
     91             throw error
     92         }
     93     }
     94 
     95     public var requestAuthorizationCount: Int {
     96         requestAuthorizationCountValue
     97     }
     98 
     99     public var currentLocationRequestCount: Int {
    100         currentLocationRequestCountValue
    101     }
    102 }