Question

J'ai un ballon d'essai d'intégration, soutenu par une 1-nœud mongodb qui échoue au hasard:

pytest/test_webapi.py:59: in test_register_test
>           assert res.status_code == 302
E           assert <Response streamed [404 NOT FOUND]>.status_code == 302

L'échec de taux est d'environ 50%.

Test test_webapi.py recherche donc:

def test_register_user(self):
    res = self.client.get("/logout")

    class MySMTPServer(smtpd.SMTPServer):
        mails = []
        def process_message(self, peer, mailfrom, rcpttos, data):
            self.mails.append((rcpttos[0], data))

    server = MySMTPServer(('localhost', 12345), None)

    t = threading.Thread(target=asyncore.loop, args=(1,))
    t.start()
    time.sleep(.1)

    try:
        res = self.client.post("/register", data=self.registration)
        assert res.status_code == 200

        mail, hash = server.mails[0]

        self.conn.fsync()
        time.sleep(.1)

        res = self.client.get('/activate/' + hash)
        assert res.status_code == 302
    finally:
        server.close()

Pertinentes Flacon méthodes de webapi.py:

@app.route("/register", methods=["POST"])
def register_user():
    mail = flask.request.form['mail']
    user = flask.request.form["user"]
    pw = flask.request.form["pass"]

    hash = users.register(user, pw, mail=mail)
    return flask.jsonify({'_id': None}) # XXX

@app.route('/activate/<hash>', methods=['GET'])
def activate_user(hash):
    key = users.activate(hash=hash)
    if not key:
        flask.abort(404)
    return flask.redirect("/")

...sont soutenus par des méthodes d'action:

make_key = lambda : base64.encodestring(os.urandom(32)).strip()

def register(self, user, pw, **kw):
    hash = self.make_key()
    user = self.new(user, pw, activation=hash, **kw)
    self._send_mail(**user)
    return hash

def activate(self, hash):
    user = self.users.find_one({'activation': hash})
    if not user:
        return None
    key = self.make_key()
    activation = {
        '$unset': {'activation': 1},
        '$set': {'status': 'active', 'key': key} }
    self.users.update({'_id': user['_id']}, activation)
    return user

...où l'auto.les utilisateurs est une collection de mongodb.

auto.new() persiste l'entité à l'aide de coffre-fort=True.

Fait intéressant, plusieurs autres tests de faire les mêmes choses ne semblent jamais à rencontrer ce problème.

J'avais pensé que ce serait suffisant pour s'assurer que l'objet persistant serait visible par les autres threads dans le pymongo pool de connexion.Quelle est la partie de la mongodb/pymongo la documentation que je dois le lire plus attentivement?Ou est-il un peu bizarre interaction avec asyncore?

Était-ce utile?

La solution

(porté à partir des commentaires thread)

Dans le contexte des tests, est le data juste valeur la chaîne base64 de la clé d'activation?base64 contient des lettres et des chiffres, mais aussi les "+" et "/", qui sera interprété par URL analyseurs (en particulier les "/").

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top