def checkResponseStatus(response):
    """
    Vérifie si le code status passé est un code de réussite ou pas (réussite = 0)
    Lève une exception selon le type d'erreur

    :param response: la réponse de l'appel à l'API
    :return: True si le code est 0, levée d'exception sinon
    :raises TypeError: Exception levée si le paramètre n'est pas un OrderedDict et si il ne possède pas un champs type avec la valeur integer
    """
    try:
        status = utils.changeToInt(response["status"])
    except TypeError:
        raise ServiceException(response["status"], response["message"])

    if status != 0:
        # On essaie de déterminer les erreurs temporaires versus définitives, à partir du contenu de response["message"]
        if re.search(
                '(unable to get connection|Invalid token|Accès refusé|Une erreur système bloque votre requête|LDAP error|system failure|unable to create entry|unable to create account)',
                response["message"]):
            raise TmpServiceException(response["status"], response["message"])
        elif re.search(
                '(no such account|no such domain|no such distribution list|no such cos)',
                response["message"]):
            raise NotFoundException(response["status"], response["message"])
        else:
            raise ServiceException(response["status"], response["message"])

    return True
        def token(self, domain):
            """Getter du Token

                Arguments : Aucun

                Retour :
                    string : token pour connexion à l'API

                Exception:
                    BSSConnexion en cas d'Erreur lors de la récupération du token

                Example d'utilisation :
                    >>>con = BSSConnexion("domain.com","6b7ead4bd425836e8cf0079cd6c1a05acc127acd07c8ee4b61023e19250e929c")
                    >>>token = con.token
                    >>>try:
                    ... print(token) #doctest: +ELLIPSIS
                    ...except BSSConnexionException as err:
                    ... print("BSS Erreur: {0}".format(err))
                    ...
                Description :
                    Le token ayant une durée de vie de 5min on le regénère si il est plus vieux que 4min30s
                    Si l'ecart entre le timestamp actuel et le timestamp de l'obtention du dernier token est de moins de 270 secondes (4min30s)
                    on renvoie le token actuel. Au delà on génère un nouveau token
            """
            if isinstance(domain, str):
                if utils.checkIsDomain(domain):

                    self._domain = domain
                    """Le domaine sur lequel on souhaite travailler"""
                    if domain not in self._key:
                        raise DomainException(domain + " : Domaine non initialisé")
                    actualTimestamp = round(time())
                    if (actualTimestamp - self._timestampOfLastToken[domain]) < int( self._ttl * .9 ):
                        return self._token[domain]
                    else:
                        self._timestampOfLastToken[domain] = actualTimestamp
                        msg = domain + "|" + str(actualTimestamp)
                        preAuth = hmac.new(self._key[domain].encode("utf-8"), msg.encode("utf-8"), hashlib.sha1).hexdigest()
                        data = {
                            "domain": domain,
                            "timestamp": str(round(time())),
                            "preauth": preAuth
                        }
                        response = postBSS(self._url + "/Auth", data)
                        status_code = utils.changeToInt(response["status"])
                        message = response["message"]
                        if status_code == 0:
                            self._token[domain] = response["token"]
                        else:
                            raise BSSConnexionException(status_code, message)
                        return self._token[domain]
                else:
                    raise DomainException(domain+" n'est pas un nom de domain valide")
            else:
                raise TypeError
 def __init__(self, code, message):
     self.code = utils.changeToInt(code)
     self.msg = str(utils.changeToInt(code)) + " : " + message
def test_changeToInt_casException():
    with pytest.raises(TypeError):
        test_int = OrderedDict()
        test_int["type"] = "string"
        test_int["content"] = "1"
        changeToInt(test_int)
def test_changeToInt_casTrueInteger():
    test_int = OrderedDict()
    test_int["type"] = "integer"
    test_int["content"] = "1"
    assert isinstance(changeToInt(test_int), int)