#if AUTH_VERIFICATION_MOCK import Foundation final class AuthVerificationMock { static let shared = AuthVerificationMock() final class Session { fileprivate let token: String fileprivate var preference: (isAdultContentVisible: Bool, contentType: ContentType)? fileprivate init(token: String) { self.token = token } } private let lock = NSLock() private var loginSession: Session? private init() {} func confirm(request: AuthVerifyRequest, requestToken: String) -> Data? { lock.lock() defer { lock.unlock() } guard let session = currentSession(for: requestToken) else { return nil } session.preference = (request.isAdultContentVisible, request.isAdultContentVisible ? request.contentType : .ALL) return Data(#"{"success":true,"data":{"gender":0}}"#.utf8) } func session(for requestToken: String) -> Session? { lock.lock() defer { lock.unlock() } return currentSession(for: requestToken) } func resetSession(_ changes: () -> Void) { lock.lock() defer { lock.unlock() } loginSession = nil changes() } func overlayMemberResponse(_ data: Data, statusCode: Int, requestToken: String, session: Session?, as type: Member.Type) -> Data { lock.lock() defer { lock.unlock() } guard isActive(session, requestToken: requestToken), let preference = session?.preference, (200..<300).contains(statusCode), let decoded = try? JSONDecoder().decode(ApiResponse.self, from: data), decoded.success, decoded.data != nil, var envelope = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any], var member = envelope["data"] as? [String: Any] else { return data } member["isAuth"] = true member["isAdultContentVisible"] = preference.isAdultContentVisible member["contentType"] = preference.contentType.rawValue envelope["data"] = member return (try? JSONSerialization.data(withJSONObject: envelope)) ?? data } func updateContentPreference(from data: Data, statusCode: Int, requestToken: String, session: Session?) { lock.lock() defer { lock.unlock() } guard isActive(session, requestToken: requestToken), let session = session, session.preference != nil, (200..<300).contains(statusCode), let decoded = try? JSONDecoder().decode(ApiResponse.self, from: data), decoded.success, let preference = decoded.data else { return } session.preference = (preference.isAdultContentVisible, preference.isAdultContentVisible ? preference.contentType : .ALL) } private func currentSession(for requestToken: String) -> Session? { guard !requestToken.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty, requestToken == UserDefaults.string(forKey: .token) else { return nil } if loginSession?.token != requestToken { loginSession = Session(token: requestToken) } return loginSession } private func isActive(_ session: Session?, requestToken: String) -> Bool { guard let session = session, session === loginSession else { return false } return session.token == requestToken && requestToken == UserDefaults.string(forKey: .token) } } #endif