Flask Unittest for Post Method

10,740

Here an example which can help you to understand. Our application - app.py:

import httplib
import json

from flask import Flask, request, Response

app = Flask(__name__)


@app.route('/', methods=['POST'])
def main():
   url = request.form.get('return_url')
   # just example. will return value of sent return_url
   return Response(
      response=json.dumps({'return_url': url}),
      status=httplib.OK,
      mimetype='application/json'
   )

Our tests - test_api.py:

import json
import unittest

from app import app
# set our application to testing mode
app.testing = True


class TestApi(unittest.TestCase):

    def test_main(self):
        with app.test_client() as client:
            # send data as POST form to endpoint
            sent = {'return_url': 'my_test_url'}
            result = client.post(
                '/',
                data=sent
            )
            # check result from server with expected data
            self.assertEqual(
                result.data,
                json.dumps(sent)
            )

How to run:

python -m unittest discover -p path_to_test_api.py

Result:

----------------------------------------------------------------------
Ran 1 test in 0.009s

OK

Hope it helps.

Share:
10,740
Tuan Pham
Author by

Tuan Pham

Struggle with school's assignments at day. Work hard as a programmer at night for web and mobile development. Robotics, physics, and astronomy as hobbies. Believe in doing just what have been being given is doing nothing.

Updated on June 17, 2022

Comments

  • Tuan Pham
    Tuan Pham almost 2 years

    I am writing a Flask unit test for a function that would return a render template. I tried few ways but it seems not working. Here is the function:

    @app.route('/', methods=['POST'])
    @lti(request='initial', error=error, app=app)
    def chooser(lti=lti):
       return_url = request.form.get('launch_presentation_return_url', '#')
       return render_template(
           'chooser.html'
       )
    

    Few ways that I have been trying:

    # 1st way    
    rv = self.app.post('/')
    self.assertTrue('Choose an Icon to Insert' in rv.get_data(as_text=True))
    # Error
    self.assertTrue('Choose an Icon to Insert' in rv.get_data(as_text=True))
    AssertionError: False is not true
    
    
    # 2nd way    
    rv = self.app.post('/chooser.html')
    assert '<h1>Choose an Icon to Insert</h1>' in rv.data
    # Error
    assert 'Choose an Icon to Insert' in rv.data
    AssertionError
    

    chooser.html

     <body>
        <h1>Choose an Icon to Insert</h1>
     </body>
    

    Thanks for all your helps.