Files
synology-api-python/tests/__init__.py

297 lines
12 KiB
Python

"""Library tests."""
from json import JSONDecodeError
from urllib.parse import urlencode
from requests.exceptions import ConnectionError as ConnError
from requests.exceptions import RequestException
from requests.exceptions import SSLError
from .api_data.dsm_5 import DSM_5_API_INFO
from .api_data.dsm_5 import DSM_5_AUTH_LOGIN
from .api_data.dsm_5 import DSM_5_AUTH_LOGIN_2SA
from .api_data.dsm_5 import DSM_5_AUTH_LOGIN_2SA_OTP
from .api_data.dsm_5 import DSM_5_CORE_UTILIZATION
from .api_data.dsm_5 import DSM_5_DSM_INFORMATION
from .api_data.dsm_5 import DSM_5_DSM_NETWORK
from .api_data.dsm_5 import DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL
from .api_data.dsm_6 import DSM_6_API_INFO
from .api_data.dsm_6 import DSM_6_API_INFO_SURVEILLANCE_STATION
from .api_data.dsm_6 import DSM_6_AUTH_LOGIN
from .api_data.dsm_6 import DSM_6_AUTH_LOGIN_2SA
from .api_data.dsm_6 import DSM_6_AUTH_LOGIN_2SA_OTP
from .api_data.dsm_6 import DSM_6_CORE_SECURITY
from .api_data.dsm_6 import DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE
from .api_data.dsm_6 import DSM_6_CORE_SHARE
from .api_data.dsm_6 import DSM_6_CORE_SYSTEM_DS918_PLUS
from .api_data.dsm_6 import DSM_6_CORE_UPGRADE_TRUE
from .api_data.dsm_6 import DSM_6_CORE_UTILIZATION
from .api_data.dsm_6 import DSM_6_CORE_UTILIZATION_ERROR_1055
from .api_data.dsm_6 import DSM_6_DOWNLOAD_STATION_INFO_CONFIG
from .api_data.dsm_6 import DSM_6_DOWNLOAD_STATION_INFO_INFO
from .api_data.dsm_6 import DSM_6_DOWNLOAD_STATION_STAT_INFO
from .api_data.dsm_6 import DSM_6_DOWNLOAD_STATION_TASK_LIST
from .api_data.dsm_6 import DSM_6_DSM_INFORMATION
from .api_data.dsm_6 import DSM_6_DSM_NETWORK_2LAN_1PPPOE
from .api_data.dsm_6 import (
DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION,
)
from .api_data.dsm_6 import DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL
from .api_data.dsm_6 import DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS
from .api_data.dsm_6 import DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_CAMERA_LIST
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO
from .api_data.dsm_6 import DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH
from .const import DEVICE_TOKEN
from .const import ERROR_AUTH_INVALID_CREDENTIALS
from .const import ERROR_AUTH_MAX_TRIES
from .const import ERROR_AUTH_OTP_AUTHENTICATE_FAILED
from .const import ERROR_INSUFFICIENT_USER_PRIVILEGE
from synology_dsm import SynologyDSM
from synology_dsm.api.core.security import SynoCoreSecurity
from synology_dsm.api.core.share import SynoCoreShare
from synology_dsm.api.core.system import SynoCoreSystem
from synology_dsm.api.core.upgrade import SynoCoreUpgrade
from synology_dsm.api.core.utilization import SynoCoreUtilization
from synology_dsm.api.download_station import SynoDownloadStation
from synology_dsm.api.dsm.information import SynoDSMInformation
from synology_dsm.api.dsm.network import SynoDSMNetwork
from synology_dsm.api.storage.storage import SynoStorage
from synology_dsm.api.surveillance_station import SynoSurveillanceStation
from synology_dsm.const import API_AUTH
from synology_dsm.const import API_INFO
from synology_dsm.exceptions import SynologyDSMRequestException
API_SWITCHER = {
5: {
"API_INFO": DSM_5_API_INFO,
"AUTH_LOGIN": DSM_5_AUTH_LOGIN,
"AUTH_LOGIN_2SA": DSM_5_AUTH_LOGIN_2SA,
"AUTH_LOGIN_2SA_OTP": DSM_5_AUTH_LOGIN_2SA_OTP,
"DSM_INFORMATION": DSM_5_DSM_INFORMATION,
"DSM_NETWORK": DSM_5_DSM_NETWORK,
"CORE_UTILIZATION": DSM_5_CORE_UTILIZATION,
"STORAGE_STORAGE": {
"RAID": DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL,
},
},
6: {
"API_INFO": DSM_6_API_INFO,
"AUTH_LOGIN": DSM_6_AUTH_LOGIN,
"AUTH_LOGIN_2SA": DSM_6_AUTH_LOGIN_2SA,
"AUTH_LOGIN_2SA_OTP": DSM_6_AUTH_LOGIN_2SA_OTP,
"DSM_INFORMATION": DSM_6_DSM_INFORMATION,
"DSM_NETWORK": DSM_6_DSM_NETWORK_2LAN_1PPPOE,
"CORE_SECURITY": DSM_6_CORE_SECURITY,
"CORE_SHARE": DSM_6_CORE_SHARE,
"CORE_SYSTEM": DSM_6_CORE_SYSTEM_DS918_PLUS,
"CORE_UTILIZATION": DSM_6_CORE_UTILIZATION,
"CORE_UPGRADE": DSM_6_CORE_UPGRADE_TRUE,
"STORAGE_STORAGE": {
"RAID": DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL,
"SHR1": DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS,
"SHR2": DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL,
"SHR2_EXPANSION": DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION, # noqa: B950
},
},
}
VALID_HOST = "nas.mywebsite.me"
VALID_PORT = "443"
VALID_HTTPS = True
VALID_VERIFY_SSL = True
VALID_USER = "valid_user"
VALID_USER_2SA = "valid_user_2sa"
VALID_PASSWORD = "valid_password"
VALID_OTP = "123456"
USER_MAX_TRY = "user_max"
class SynologyDSMMock(SynologyDSM):
"""Mocked SynologyDSM."""
API_URI = "api="
def __init__(
self,
dsm_ip,
dsm_port,
username,
password,
use_https=False,
verify_ssl=False,
timeout=None,
device_token=None,
debugmode=False,
):
"""Constructor method."""
SynologyDSM.__init__(
self,
dsm_ip,
dsm_port,
username,
password,
use_https,
verify_ssl,
timeout,
device_token,
debugmode,
)
self.verify_ssl = verify_ssl
self.dsm_version = 6 # 5 or 6
self.disks_redundancy = "RAID" # RAID or SHR[number][_EXPANSION]
self.error = False
self.with_surveillance = False
def _execute_request(self, method, url, params, **kwargs):
url += urlencode(params or {})
if "no_internet" in url:
raise SynologyDSMRequestException(
ConnError(
"<urllib3.connection.VerifiedHTTPSConnection object at "
"0x106c1f250>: Failed to establish a new connection: "
"[Errno 8] nodename nor servname provided, or not known"
)
)
if VALID_HOST not in url:
raise SynologyDSMRequestException(
ConnError(
"<urllib3.connection.HTTPConnection object at 0x10d6f8090>:"
" Failed to establish a new connection: [Errno 8] nodename "
"nor servname provided, or not known"
)
)
if VALID_PORT not in url and "https" not in url:
raise SynologyDSMRequestException(
JSONDecodeError("Expecting value", "<html>document</html>", 0)
)
if VALID_PORT not in url:
raise SynologyDSMRequestException(
SSLError(
"[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1076)"
)
)
if "https" not in url:
raise SynologyDSMRequestException(RequestException("Bad request"))
if not self.verify_ssl:
raise SynologyDSMRequestException(
SSLError(f"hostname '192.168.0.35' doesn't match '{VALID_HOST}'")
)
if API_INFO in url:
if self.with_surveillance:
return DSM_6_API_INFO_SURVEILLANCE_STATION
return API_SWITCHER[self.dsm_version]["API_INFO"]
if API_AUTH in url:
if VALID_USER_2SA in url and VALID_PASSWORD in url:
if "otp_code" not in url and "device_id" not in url:
return API_SWITCHER[self.dsm_version]["AUTH_LOGIN_2SA"]
if "device_id" in url and DEVICE_TOKEN in url:
return API_SWITCHER[self.dsm_version]["AUTH_LOGIN"]
if "otp_code" in url:
if VALID_OTP in url:
return API_SWITCHER[self.dsm_version]["AUTH_LOGIN_2SA_OTP"]
return ERROR_AUTH_OTP_AUTHENTICATE_FAILED
if VALID_USER in url and VALID_PASSWORD in url:
return API_SWITCHER[self.dsm_version]["AUTH_LOGIN"]
if USER_MAX_TRY in url:
return ERROR_AUTH_MAX_TRIES
return ERROR_AUTH_INVALID_CREDENTIALS
if self.API_URI in url:
if not self._session_id:
return ERROR_INSUFFICIENT_USER_PRIVILEGE
if SynoCoreSecurity.API_KEY in url:
if self.error:
return DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE
return API_SWITCHER[self.dsm_version]["CORE_SECURITY"]
if SynoCoreShare.API_KEY in url:
return API_SWITCHER[self.dsm_version]["CORE_SHARE"]
if SynoCoreSystem.API_KEY in url:
if SynoCoreUtilization.API_KEY in url:
if self.error:
return DSM_6_CORE_UTILIZATION_ERROR_1055
return API_SWITCHER[self.dsm_version]["CORE_UTILIZATION"]
return API_SWITCHER[self.dsm_version]["CORE_SYSTEM"]
if SynoCoreUpgrade.API_KEY in url:
return API_SWITCHER[self.dsm_version]["CORE_UPGRADE"]
if SynoDSMInformation.API_KEY in url:
return API_SWITCHER[self.dsm_version]["DSM_INFORMATION"]
if SynoDSMNetwork.API_KEY in url:
return API_SWITCHER[self.dsm_version]["DSM_NETWORK"]
if SynoDownloadStation.INFO_API_KEY in url:
if "GetInfo" in url:
return DSM_6_DOWNLOAD_STATION_INFO_INFO
if "GetConfig" in url:
return DSM_6_DOWNLOAD_STATION_INFO_CONFIG
if SynoDownloadStation.STAT_API_KEY in url:
if "GetInfo" in url:
return DSM_6_DOWNLOAD_STATION_STAT_INFO
if SynoDownloadStation.TASK_API_KEY in url:
if "List" in url:
return DSM_6_DOWNLOAD_STATION_TASK_LIST
if SynoStorage.API_KEY in url:
return API_SWITCHER[self.dsm_version]["STORAGE_STORAGE"][
self.disks_redundancy
]
if SynoSurveillanceStation.CAMERA_API_KEY in url:
if "GetLiveViewPath" in url:
return DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH
if "List" in url:
assert params["version"] == 7
return DSM_6_SURVEILLANCE_STATION_CAMERA_LIST
if "MDParamSave" in url:
return DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE
if "MotionEnum" in url:
return DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM
if SynoSurveillanceStation.HOME_MODE_API_KEY in url:
if "GetInfo" in url:
return DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO
if "Switch" in url:
return DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH
if (
"SYNO.FileStation.Upload" in url
and "upload" in url
and "file_already_exists" in kwargs["files"]["file"]
):
return {"error": {"code": 1805}, "success": False}
if (
"SYNO.DownloadStation2.Task" in url
and "create" in url
and "test_not_exists" in url
):
return {"error": {"code": 408}, "success": False}
return {"success": False}
return None