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 }