I use py.test to test my Flask application, but I get IntegrityError because I create the same model in two different tests.
I am using postgreSQL 9.3.5 and Flask-SQLAlchemy 1.0.
EDIT I ββupdated my sessoin fixture with Jeremy Allen's answer and it fixed a lot of errors. However, it seems that when I use the user device, I still get IntegrityErrors
Mistake
E IntegrityError: (IntegrityError) duplicate key value violates unique constraint "ix_users_email" E DETAIL: Key (email)=(not_used@example.com) already exists. E 'INSERT INTO users (email, username, name, role_id, company_id, password_hash, confirmed, member_since, last_seen) VALUES (%(email)s, %(username)s, %(name)s, %(role_id)s, %(company_id)s, %(password_hash)s, %(confirmed)s, %(member_since)s, %(last_seen)s) RETURNING users.id' {'username': 'not_used', 'confirmed': True, 'name': 'To be Removed', 'member_since': datetime.datetime(2014, 10, 29, 19, 19, 41, 7929), 'company_id': None, 'role_id': 3, 'last_seen': datetime.datetime(2014, 10, 29, 19, 19, 41, 7941), 'email': 'not_used@example.com', 'password_hash': 'pbkdf2:sha1:1000$cXUh6GbJ$6f38242871cff5e4cce4c1dc49a62c4aea4ba1f3'}
conftest.py
@pytest.yield_fixture(scope='session') def app(): app = create_app('testing') app.config['SERVER_NAME'] = 'example.com:1234' ctx = app.app_context() ctx.push() app.response_class = TestResponse app.test_client_class = TestClient yield app ctx.pop() @pytest.fixture(scope='session') def db(app): _db.drop_all() _db.create_all() Permission.insert_initial() Role.insert_initial() Technology.insert_initial() Product.insert_initial() Actor.insert_initial() Industry.insert_initial() DeliveryCategory.insert_initial() DeliveryMethod.insert_initial() user = User(email='admin@example.com', username='admin', confirmed=True, password='admin', name='Admin') user.role = Role.query.filter_by(name='Administrator').first() _db.session.add(user) _db.session.commit() return _db @pytest.yield_fixture(scope='function') def session(db): db.session.begin_nested() yield db.session db.session.rollback() @pytest.yield_fixture(scope='function') def user(session): yield session.query(User).filter_by(email='admin@example.com').first() @pytest.yield_fixture(scope='function') def client(app, user): client = app.test_client() client.auth = 'Basic ' + b64encode((user.email + ':' + 'admin').encode('utf-8')).decode('utf-8') yield client
Tests that don't work
def test_edit_agenda_add_company_rep_without_company(session, client, user): user2 = User(name='To be Removed', password='not_used', username='not_used', confirmed=True, email='not_used@example.com', role=Role.query.filter_by(name='User').first()) agenda = Agenda(name='Invalid Company Rep', creator=user) session.add(agenda) session.commit() response = client.jput('/api/v1.0/agendas/%s' % agenda.id, data={ 'company_representative': user2.id } ) assert response.status_code == 200 def test_edit_agenda_add_user_already_in_agenda(session, client, user): user2 = User(name='To be Removed', password='not_used', username='not_used', confirmed=True, email='not_used@example.com', role=Role.query.filter_by(name='User').first()) agenda = Agenda(name='Invalid Company Rep', creator=user) agenda.users.append(user2) session.add(agenda) session.commit() response = client.jput('/api/v1.0/agendas/%s' % agenda.id, data={ 'users': [user2.id] } ) assert response.status_code == 200
Tests that pass
def test_get_agenda_modules_where_agenda_that_does_not_exist(session, app): # Create admin user with permission to create models user = User(email='admin2@example.com', username='admin2', confirmed=True, password='admin2') user.role = Role.query.filter_by(name='Administrator').first() session.add(user) session.commit() client = app.test_client() client.auth = 'Basic ' + b64encode( (user.email + ':' + 'admin2').encode('utf-8')).decode('utf-8') response = client.jget('/api/v1.0/agenda-modules/%s/%s' % (5, 4)) assert response.status_code == 404 def test_get_agenda_modules_agenda_modules_does_not_exist(session, app): agenda = Agenda(name='Is tired in the AM') session.add(agenda) # Create admin user with permission to create models user = User(email='admin2@example.com', username='admin2', confirmed=True, password='admin2') user.role = Role.query.filter_by(name='Administrator').first() session.add(user) session.commit() client = app.test_client() client.auth = 'Basic ' + b64encode( (user.email + ':' + 'admin2').encode('utf-8')).decode('utf-8') response = client.jget('/api/v1.0/agenda-modules/%s/%s' % (agenda.id, 4)) assert response.status_code == 400 assert response.jdata['message'] == 'AgendaModule does not exist.'