Question:
I'm doing an api test, which I pass a json it validates if everything is ok:
my base class:
# -*- coding: utf-8 -*-
# base.py
import os
import unittest
from app import initialize
from mock import mock
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from app import database
os.environ = {
my_variavels:
}
test_app = Flask(__name__)
test_app.config.from_object('app.config.TestingConfig')
database.AppRepository.db = SQLAlchemy(test_app)
class TestCase(unittest.TestCase):
mock = mock
user = initialize.web_app.test_client()
I believe that in this base file, it should have the teardown, Setup etc functions..
json_gardener = {"id": "1",
"name": "Jamme"}
And I have the following function that makes the post in this case:
def test_post_gardener(self):
response = self.user.post('/gardeners', headers={'VALIDATION': 'XXXX'}, data=self.json_gardener)
self.assertEqual(response.status_code, 201)
So far, everything is ok, it works perfectly, but when I run it the second time, obviously it will show that the id already exists in the bank and it will give an error.
My question is, is there a way to upload a database to test and when it finishes running it dismount?
Answer:
According to Flask's own documentation there is a tempfile
class that can be used for this as a database instance in the test class.
import os
import flaskr
import unittest
import tempfile
class FlaskrTestCase(unittest.TestCase):
def setUp(self):
self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
flaskr.app.config['TESTING'] = True
self.app = flaskr.app.test_client()
with flaskr.app.app_context():
flaskr.init_db()
def tearDown(self):
os.close(self.db_fd)
os.unlink(flaskr.app.config['DATABASE'])
def test_empty_db(self):
rv = self.app.get('/')
assert b'No entries here so far' in rv.data
def login(self, username, password):
return self.app.post('/login', data=dict(
username=username,
password=password
), follow_redirects=True)
def logout(self):
return self.app.get('/logout', follow_redirects=True)
def test_login_logout(self):
rv = self.login('admin', 'default')
assert b'You were logged in' in rv.data
rv = self.logout()
assert b'You were logged out' in rv.data
rv = self.login('adminx', 'default')
assert b'Invalid username' in rv.data
rv = self.login('admin', 'defaultx')
assert b'Invalid password' in rv.data
if __name__ == '__main__':
unittest.main()
Source: http://flask.pocoo.org/docs/0.12/testing/