"""Library tests.""" from pyicloud import base from pyicloud.exceptions import PyiCloudFailedLoginException from pyicloud.services.findmyiphone import FindMyiPhoneServiceManager, AppleDevice AUTHENTICATED_USER = "authenticated_user" REQUIRES_2SA_USER = "requires_2sa_user" VALID_USERS = [AUTHENTICATED_USER, REQUIRES_2SA_USER] class PyiCloudServiceMock(base.PyiCloudService): """Mocked PyiCloudService.""" def __init__( self, apple_id, password=None, cookie_directory=None, verify=True, client_id=None, with_family=True, ): base.PyiCloudService.__init__( self, apple_id, password, cookie_directory, verify, client_id, with_family ) base.FindMyiPhoneServiceManager = FindMyiPhoneServiceManagerMock def authenticate(self): if ( not self.user.get("apple_id") or self.user.get("apple_id") not in VALID_USERS ): raise PyiCloudFailedLoginException( "Invalid email/password combination.", None ) if not self.user.get("password") or self.user.get("password") != "valid_pass": raise PyiCloudFailedLoginException( "Invalid email/password combination.", None ) self.params.update({"dsid": "ID"}) self._webservices = { "account": {"url": "account_url",}, "findme": {"url": "findme_url",}, "calendar": {"url": "calendar_url",}, "contacts": {"url": "contacts_url",}, "reminders": {"url": "reminders_url",}, } @property def requires_2sa(self): return self.user["apple_id"] is REQUIRES_2SA_USER @property def trusted_devices(self): return [ { "deviceType": "SMS", "areaCode": "", "phoneNumber": "*******58", "deviceId": "1", } ] def send_verification_code(self, device): return device def validate_verification_code(self, device, code): if not device or code != 0: self.user["apple_id"] = AUTHENTICATED_USER self.authenticate() return not self.requires_2sa IPHONE_DEVICE_ID = "X1x/X&x=" IPHONE_DEVICE = AppleDevice( { "msg": { "strobe": False, "userText": False, "playSound": True, "vibrate": True, "createTimestamp": 1568031021347, "statusCode": "200", }, "canWipeAfterLock": True, "baUUID": "", "wipeInProgress": False, "lostModeEnabled": False, "activationLocked": True, "passcodeLength": 6, "deviceStatus": "200", "deviceColor": "1-6-0", "features": { "MSG": True, "LOC": True, "LLC": False, "CLK": False, "TEU": True, "LMG": False, "SND": True, "CLT": False, "LKL": False, "SVP": False, "LST": True, "LKM": False, "WMG": True, "SPN": False, "XRM": False, "PIN": False, "LCK": True, "REM": False, "MCS": False, "CWP": False, "KEY": False, "KPD": False, "WIP": True, }, "lowPowerMode": True, "rawDeviceModel": "iPhone11,8", "id": IPHONE_DEVICE_ID, "remoteLock": None, "isLocating": True, "modelDisplayName": "iPhone", "lostTimestamp": "", "batteryLevel": 0.47999998927116394, "mesg": None, "locationEnabled": True, "lockedTimestamp": None, "locFoundEnabled": False, "snd": {"createTimestamp": 1568031021347, "statusCode": "200"}, "fmlyShare": False, "lostDevice": { "stopLostMode": False, "emailUpdates": False, "userText": True, "sound": False, "ownerNbr": "", "text": "", "createTimestamp": 1558383841233, "statusCode": "2204", }, "lostModeCapable": True, "wipedTimestamp": None, "deviceDisplayName": "iPhone XR", "prsId": None, "audioChannels": [], "locationCapable": True, "batteryStatus": "NotCharging", "trackingInfo": None, "name": "Quentin's iPhone", "isMac": False, "thisDevice": False, "deviceClass": "iPhone", "location": { "isOld": False, "isInaccurate": False, "altitude": 0.0, "positionType": "GPS", "latitude": 46.012345678, "floorLevel": 0, "horizontalAccuracy": 12.012345678, "locationType": "", "timeStamp": 1568827039692, "locationFinished": False, "verticalAccuracy": 0.0, "longitude": 5.012345678, }, "deviceModel": "iphoneXR-1-6-0", "maxMsgChar": 160, "darkWake": False, "remoteWipe": None, }, None, None, None, ) DEVICES = { IPHONE_DEVICE_ID: IPHONE_DEVICE, } class FindMyiPhoneServiceManagerMock(FindMyiPhoneServiceManager): """Mocked FindMyiPhoneServiceManager.""" def __init__(self, service_root, session, params, with_family=False): FindMyiPhoneServiceManager.__init__( self, service_root, session, params, with_family ) def refresh_client(self): self._devices = DEVICES