Projet

Général

Profil

Bug #20809

wscall: AttributeError: 'Response' object has no attribute 'status'

Ajouté par Thomas Noël il y a plus de 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
19 décembre 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Exception:
  type = '<type 'exceptions.AttributeError'>', value = ''Response' object has no attribute 'status''

Stack trace (most recent call first):
  File "/usr/lib/python2.7/dist-packages/wcs/wf/wscall.py", line 367, in action_on_error
   365                 summary = ''
   366                 if response:
>  367                     summary = '%s %s' % (response.status, response.reason)
   368                 try:
   369                     raise Exception(summary)

  locals:
     formdata = <...>
     summary = ''
     self = <wcs.wf.wscall.WebserviceCallStatusItem object at 0x7f458d8f8e90>
     action = ':pass'
     exc_info = None
     data = '{"reason":"already cancelled","err":1}'
     response = <Response [200]>

Fichiers

Révisions associées

Révision eb7a8abf (diff)
Ajouté par Thomas Noël il y a plus de 6 ans

wscall: fix record/notify on app errors, use status_code instead of status (#20809)

Historique

#1

Mis à jour par Thomas Noël il y a plus de 6 ans

  • Assigné à mis à Thomas Noël
#2

Mis à jour par Thomas Noël il y a plus de 6 ans

On ne l'aurait pas vu parce que le FakeResponse dans tests/utilities.py n'a pas les attributs d'une réponse quixote (status à la place de status_code, reason à la place de reason_phrase, data à la place de body, etc) ?

#3

Mis à jour par Thomas Noël il y a plus de 6 ans

POC (je continuerai ce soir éventuellement)

diff --git a/tests/utilities.py b/tests/utilities.py
index db3e859c..d88451f8 100644
--- a/tests/utilities.py
+++ b/tests/utilities.py
@@ -290,8 +290,8 @@ class HttpRequestsMocking(object):

         class FakeResponse(object):
             def __init__(self, status, data, headers):
-                self.status = status
-                self.reason = 'whatever'
+                self.status_code = status
+                self.reason_phrase = 'whatever'
                 self.data = data
                 self.headers = headers or {}
                 self.length = len(data or '')

Crash du test :

wcs/wf/wscall.py:317: in perform
    self.action_on_error(self.action_on_app_error, formdata, response, data=data)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <wcs.wf.wscall.WebserviceCallStatusItem object at 0x7f366491d250>, action = ':stop', formdata = <Baz 'baz #1-1' id:1>
response = <utilities.FakeResponse object at 0x7f366491d110>, data = '{"data": "", "err": 1}', exc_info = None

    def action_on_error(self, action, formdata, response=None, data=None, exc_info=None):
        if action in (':pass', ':stop') and (self.notify_on_errors or self.record_errors):
            if exc_info:
                summary = traceback.format_exception_only(exc_info[0], exc_info[1])[-1]
            else:
                summary = ''
                if response:
>                   summary = '%s %s' % (response.status, response.reason)
E                   AttributeError: 'FakeResponse' object has no attribute 'status'

wcs/wf/wscall.py:367: AttributeError
#4

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Ce serait vraiment difficile de refaire quelque chose à base de httmock ? J'avoue je n'ai pas bien regardé les différences.

#5

Mis à jour par Thomas Noël il y a plus de 6 ans

Benjamin Dauvergne a écrit :

Ce serait vraiment difficile de refaire quelque chose à base de httmock ? J'avoue je n'ai pas bien regardé les différences.

Sans doute qu'on pourrait revoir le principe des tests pour y éviter de mocker comme utils::HttpRequestsMocking. Mais dans cette attente, voici un patch qui corrige le code, et qui corrige le test (qui plante sans la correction du code).

#6

Mis à jour par Frédéric Péters il y a plus de 6 ans

De requests, j'obtiens les attributs status_code (bien) mais aussi reason (et pas reason_phrase). (tu écris "réponse quixote" mais à cet endroit c'est une réponse de python-requests).

~~

Sans doute qu'on pourrait revoir le principe des tests

Tout à fait.

#7

Mis à jour par Thomas Noël il y a plus de 6 ans

Mélangeage de pinceau. Je propose quand même ce mini-patch qu'on peut voir comme un "hotfix", en attendant de revoir la façon de tester requests via quelque chose de plus bas niveau.

#8

Mis à jour par Frédéric Péters il y a plus de 6 ans

Ok avec ça.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Ma remarque c'était surtout pour ne pas se retrouver avec une autre différence qui laisse passer des bugs à travers la requête mais ok aussi pour la correction actuelle.

#10

Mis à jour par Thomas Noël il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit eb7a8abf9645274b9c5644c59753220f5e2c392e
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Wed Dec 20 01:14:32 2017 +0100

    wscall: fix record/notify on app errors, use status_code instead of status (#20809)

#11

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF