Skip to content
Snippets Groups Projects
Commit ad39b1b2 authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

Merge branch 'feature/messenger-auth-callbacks' into 'development'

Register auth callbacks with XXMessengerClient

See merge request elixxir/elixxir-dapps-sdk-swift!41
parents b8f37ca1 ad53c562
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!41Register auth callbacks with XXMessengerClient
Showing
with 198 additions and 3 deletions
...@@ -27,6 +27,9 @@ let messenger: Messenger = .live(environment) ...@@ -27,6 +27,9 @@ let messenger: Messenger = .live(environment)
Example: Example:
```swift ```swift
// allow cancellation of auth callbacks registration:
var authCallbacksCancellable: Cancellable?
func start(messenger: Messenger) throws { func start(messenger: Messenger) throws {
// check if messenger is loaded: // check if messenger is loaded:
if messenger.isLoaded() == false { if messenger.isLoaded() == false {
...@@ -42,6 +45,13 @@ func start(messenger: Messenger) throws { ...@@ -42,6 +45,13 @@ func start(messenger: Messenger) throws {
// start messenger's network follower: // start messenger's network follower:
try messenger.start() try messenger.start()
// register auth callbacks before connecting:
authCallbacksCancellable = messenger.registerAuthCallbacks(
AuthCallbacks(handle: { callback in
// implement auth callbacks handling
})
)
// check if messenger is connected: // check if messenger is connected:
if messenger.isConnected() == false { if messenger.isConnected() == false {
// start end-to-end connection: // start end-to-end connection:
......
...@@ -21,6 +21,7 @@ extension MessengerConnect { ...@@ -21,6 +21,7 @@ extension MessengerConnect {
} }
env.e2e.set(try env.login( env.e2e.set(try env.login(
cMixId: cMix.getId(), cMixId: cMix.getId(),
authCallbacks: env.authCallbacks.registered(),
identity: try cMix.makeLegacyReceptionIdentity(), identity: try cMix.makeLegacyReceptionIdentity(),
e2eParamsJSON: env.getE2EParams() e2eParamsJSON: env.getE2EParams()
)) ))
......
import XXClient
import XCTestDynamicOverlay
public struct MessengerRegisterAuthCallbacks {
public var run: (AuthCallbacks) -> Cancellable
public func callAsFunction(_ authCallbacks: AuthCallbacks) -> Cancellable {
run(authCallbacks)
}
}
extension MessengerRegisterAuthCallbacks {
public static func live(_ env: MessengerEnvironment) -> MessengerRegisterAuthCallbacks {
MessengerRegisterAuthCallbacks { callback in
env.authCallbacks.register(callback)
}
}
}
extension MessengerRegisterAuthCallbacks {
public static let unimplemented = MessengerRegisterAuthCallbacks(
run: XCTUnimplemented("\(Self.self)")
)
}
...@@ -8,6 +8,7 @@ public struct Messenger { ...@@ -8,6 +8,7 @@ public struct Messenger {
public var create: MessengerCreate public var create: MessengerCreate
public var isLoaded: MessengerIsLoaded public var isLoaded: MessengerIsLoaded
public var load: MessengerLoad public var load: MessengerLoad
public var registerAuthCallbacks: MessengerRegisterAuthCallbacks
public var start: MessengerStart public var start: MessengerStart
public var isConnected: MessengerIsConnected public var isConnected: MessengerIsConnected
public var connect: MessengerConnect public var connect: MessengerConnect
...@@ -29,6 +30,7 @@ extension Messenger { ...@@ -29,6 +30,7 @@ extension Messenger {
create: .live(env), create: .live(env),
isLoaded: .live(env), isLoaded: .live(env),
load: .live(env), load: .live(env),
registerAuthCallbacks: .live(env),
start: .live(env), start: .live(env),
isConnected: .live(env), isConnected: .live(env),
connect: .live(env), connect: .live(env),
...@@ -51,6 +53,7 @@ extension Messenger { ...@@ -51,6 +53,7 @@ extension Messenger {
create: .unimplemented, create: .unimplemented,
isLoaded: .unimplemented, isLoaded: .unimplemented,
load: .unimplemented, load: .unimplemented,
registerAuthCallbacks: .unimplemented,
start: .unimplemented, start: .unimplemented,
isConnected: .unimplemented, isConnected: .unimplemented,
connect: .unimplemented, connect: .unimplemented,
......
...@@ -3,6 +3,7 @@ import XXClient ...@@ -3,6 +3,7 @@ import XXClient
import XCTestDynamicOverlay import XCTestDynamicOverlay
public struct MessengerEnvironment { public struct MessengerEnvironment {
public var authCallbacks: AuthCallbacksRegistry
public var cMix: Stored<CMix?> public var cMix: Stored<CMix?>
public var downloadNDF: DownloadAndVerifySignedNdf public var downloadNDF: DownloadAndVerifySignedNdf
public var e2e: Stored<E2E?> public var e2e: Stored<E2E?>
...@@ -34,6 +35,7 @@ extension MessengerEnvironment { ...@@ -34,6 +35,7 @@ extension MessengerEnvironment {
public static func live() -> MessengerEnvironment { public static func live() -> MessengerEnvironment {
MessengerEnvironment( MessengerEnvironment(
authCallbacks: .live(),
cMix: .inMemory(), cMix: .inMemory(),
downloadNDF: .live, downloadNDF: .live,
e2e: .inMemory(), e2e: .inMemory(),
...@@ -60,6 +62,7 @@ extension MessengerEnvironment { ...@@ -60,6 +62,7 @@ extension MessengerEnvironment {
extension MessengerEnvironment { extension MessengerEnvironment {
public static let unimplemented = MessengerEnvironment( public static let unimplemented = MessengerEnvironment(
authCallbacks: .unimplemented,
cMix: .unimplemented(), cMix: .unimplemented(),
downloadNDF: .unimplemented, downloadNDF: .unimplemented,
e2e: .unimplemented(), e2e: .unimplemented(),
......
import XXClient
import XCTestDynamicOverlay
import Foundation
public struct AuthCallbacksRegistry {
public var register: (AuthCallbacks) -> Cancellable
public var registered: () -> AuthCallbacks
}
extension AuthCallbacksRegistry {
public static func live() -> AuthCallbacksRegistry {
class Registry {
var authCallbacks: [UUID: AuthCallbacks] = [:]
}
let registry = Registry()
return AuthCallbacksRegistry(
register: { authCallbacks in
let id = UUID()
registry.authCallbacks[id] = authCallbacks
return Cancellable { registry.authCallbacks[id] = nil }
},
registered: {
AuthCallbacks { callback in
registry.authCallbacks.values.forEach { $0.handle(callback) }
}
}
)
}
}
extension AuthCallbacksRegistry {
public static let unimplemented = AuthCallbacksRegistry(
register: XCTUnimplemented("\(Self.self).register", placeholder: Cancellable {}),
registered: XCTUnimplemented("\(Self.self).registered", placeholder: AuthCallbacks { _ in })
)
}
...@@ -8,13 +8,14 @@ final class MessengerConnectTests: XCTestCase { ...@@ -8,13 +8,14 @@ final class MessengerConnectTests: XCTestCase {
struct DidLogIn: Equatable { struct DidLogIn: Equatable {
var ephemeral: Bool var ephemeral: Bool
var cMixId: Int var cMixId: Int
var authCallbacksProvided: Bool
var identity: ReceptionIdentity var identity: ReceptionIdentity
var e2eParamsJSON: Data var e2eParamsJSON: Data
} }
var didLogIn: [DidLogIn] = [] var didLogIn: [DidLogIn] = []
var didLogInWithAuthCallbacks: [AuthCallbacks?] = []
var didSetE2E: [E2E?] = [] var didSetE2E: [E2E?] = []
var didHandleAuthCallbacks: [AuthCallbacks.Callback] = []
let cMixId = 1234 let cMixId = 1234
let receptionId = ReceptionIdentity.stub let receptionId = ReceptionIdentity.stub
...@@ -29,14 +30,19 @@ final class MessengerConnectTests: XCTestCase { ...@@ -29,14 +30,19 @@ final class MessengerConnectTests: XCTestCase {
} }
env.e2e.set = { didSetE2E.append($0) } env.e2e.set = { didSetE2E.append($0) }
env.getE2EParams.run = { e2eParams } env.getE2EParams.run = { e2eParams }
env.authCallbacks.registered = {
AuthCallbacks { callback in
didHandleAuthCallbacks.append(callback)
}
}
env.login.run = { ephemeral, cMixId, authCallbacks, identity, e2eParamsJSON in env.login.run = { ephemeral, cMixId, authCallbacks, identity, e2eParamsJSON in
didLogIn.append(.init( didLogIn.append(.init(
ephemeral: ephemeral, ephemeral: ephemeral,
cMixId: cMixId, cMixId: cMixId,
authCallbacksProvided: authCallbacks != nil,
identity: identity, identity: identity,
e2eParamsJSON: e2eParamsJSON e2eParamsJSON: e2eParamsJSON
)) ))
didLogInWithAuthCallbacks.append(authCallbacks)
return .unimplemented return .unimplemented
} }
let connect: MessengerConnect = .live(env) let connect: MessengerConnect = .live(env)
...@@ -47,12 +53,19 @@ final class MessengerConnectTests: XCTestCase { ...@@ -47,12 +53,19 @@ final class MessengerConnectTests: XCTestCase {
DidLogIn( DidLogIn(
ephemeral: false, ephemeral: false,
cMixId: 1234, cMixId: 1234,
authCallbacksProvided: false,
identity: .stub, identity: .stub,
e2eParamsJSON: e2eParams e2eParamsJSON: e2eParams
) )
]) ])
XCTAssertEqual(didLogInWithAuthCallbacks.compactMap { $0 }.count, 1)
XCTAssertEqual(didSetE2E.compactMap { $0 }.count, 1) XCTAssertEqual(didSetE2E.compactMap { $0 }.count, 1)
didLogInWithAuthCallbacks.forEach { authCallbacks in
[AuthCallbacks.Callback].stubs.forEach { callback in
authCallbacks?.handle(callback)
}
}
XCTAssertNoDifference(didHandleAuthCallbacks, .stubs)
} }
func testConnectWithoutCMix() { func testConnectWithoutCMix() {
...@@ -79,6 +92,7 @@ final class MessengerConnectTests: XCTestCase { ...@@ -79,6 +92,7 @@ final class MessengerConnectTests: XCTestCase {
cMix.makeLegacyReceptionIdentity.run = { throw error } cMix.makeLegacyReceptionIdentity.run = { throw error }
return cMix return cMix
} }
env.authCallbacks.registered = { .unimplemented }
let connect: MessengerConnect = .live(env) let connect: MessengerConnect = .live(env)
XCTAssertThrowsError(try connect()) { err in XCTAssertThrowsError(try connect()) { err in
...@@ -97,6 +111,7 @@ final class MessengerConnectTests: XCTestCase { ...@@ -97,6 +111,7 @@ final class MessengerConnectTests: XCTestCase {
cMix.makeLegacyReceptionIdentity.run = { .stub } cMix.makeLegacyReceptionIdentity.run = { .stub }
return cMix return cMix
} }
env.authCallbacks.registered = { .unimplemented }
env.getE2EParams.run = { "e2e-params".data(using: .utf8)! } env.getE2EParams.run = { "e2e-params".data(using: .utf8)! }
env.login.run = { _, _, _, _, _ in throw error } env.login.run = { _, _, _, _, _ in throw error }
let connect: MessengerConnect = .live(env) let connect: MessengerConnect = .live(env)
......
import XCTest
import XXClient
@testable import XXMessengerClient
import CustomDump
final class MessengerRegisterAuthCallbacksTests: XCTestCase {
func testRegisterAuthCallbacks() {
var registeredAuthCallbacks: [AuthCallbacks] = []
var didHandleCallbacks: [AuthCallbacks.Callback] = []
var didCancelRegisteredAuthCallbacks = 0
var env: MessengerEnvironment = .unimplemented
env.authCallbacks.register = { authCallbacks in
registeredAuthCallbacks.append(authCallbacks)
return Cancellable { didCancelRegisteredAuthCallbacks += 1 }
}
let registerAuthCallbacks: MessengerRegisterAuthCallbacks = .live(env)
let cancellable = registerAuthCallbacks(AuthCallbacks { callback in
didHandleCallbacks.append(callback)
})
XCTAssertEqual(registeredAuthCallbacks.count, 1)
registeredAuthCallbacks.forEach { authCallbacks in
[AuthCallbacks.Callback].stubs.forEach { callback in
authCallbacks.handle(callback)
}
}
XCTAssertNoDifference(didHandleCallbacks, .stubs)
cancellable.cancel()
XCTAssertEqual(didCancelRegisteredAuthCallbacks, 1)
}
}
import XXClient
extension Array where Element == AuthCallbacks.Callback {
static let stubs: [AuthCallbacks.Callback] = [
.confirm(
contact: "contact-1".data(using: .utf8)!,
receptionId: "reception-id-1".data(using: .utf8)!,
ephemeralId: 1,
roundId: 1
),
.request(
contact: "contact-2".data(using: .utf8)!,
receptionId: "reception-id-2".data(using: .utf8)!,
ephemeralId: 2,
roundId: 2
),
.reset(
contact: "contact-3".data(using: .utf8)!,
receptionId: "reception-id-3".data(using: .utf8)!,
ephemeralId: 3,
roundId: 3
),
]
}
import XCTest
import XXClient
@testable import XXMessengerClient
import CustomDump
final class AuthCallbacksRegistryTests: XCTestCase {
func testRegistry() {
var firstAuthCallbacksDidHandle: [AuthCallbacks.Callback] = []
var secondAuthCallbacksDidHandle: [AuthCallbacks.Callback] = []
let firstAuthCallbacks = AuthCallbacks { callback in
firstAuthCallbacksDidHandle.append(callback)
}
let secondAuthCallbacks = AuthCallbacks { callback in
secondAuthCallbacksDidHandle.append(callback)
}
let messengerAuthCallbacks: AuthCallbacksRegistry = .live()
let registeredAuthCallbacks = messengerAuthCallbacks.registered()
let firstAuthCallbacksCancellable = messengerAuthCallbacks.register(firstAuthCallbacks)
let secondAuthCallbacksCancellable = messengerAuthCallbacks.register(secondAuthCallbacks)
let firstCallback = [AuthCallbacks.Callback].stubs[0]
registeredAuthCallbacks.handle(firstCallback)
XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback])
XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback])
firstAuthCallbacksCancellable.cancel()
let secondCallback = [AuthCallbacks.Callback].stubs[1]
registeredAuthCallbacks.handle(secondCallback)
XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback])
XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback, secondCallback])
secondAuthCallbacksCancellable.cancel()
let thirdCallback = [AuthCallbacks.Callback].stubs[2]
registeredAuthCallbacks.handle(thirdCallback)
XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback])
XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback, secondCallback])
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment