jeancochrane / jeancochrane/pytest-flask-sqlalchemy

Postgres error "SAVEPOINT can only be used in transaction blocks" when used with live_server

Open
#17 7 comments 2 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
253
Forks
45
PR merge metrics
No merged PRs in 30d

Description

I have tests, that I would like to run with [live_server](https://pytest-flask.readthedocs.io/en/latest/features.html#live-server-application-live-server) from pytest-flask package.

I thought it works ok, but only for single request. [Full repo](https://github.com/citizen-stig/flask-pytest-samples) with working example, [failing test](https://github.com/citizen-stig/flask-pytest-samples/blob/master/tests/test_live_server.py)

Here are some pieces of the code:
```python
# models.py
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)

# view
@blog.route('/categories')
def list_categories():
return '
'.join(str(x.id) + ': ' + x.name for x in models.Category.query)
```

factories from conftest.py
```python
@pytest.fixture(scope='function')
def base_factory(db_session):
class BaseFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
abstract = True
sqlalchemy_session = db_session
sqlalchemy_session_persistence = 'flush'
return BaseFactory

@pytest.fixture(scope='function')
def category_factory(base_factory):
class CategoryFactory(base_factory):
class Meta:
model = models.Category
name = factory.Sequence(lambda n: u'Category %d' % n)
return CategoryFactory
```

Test itself:
```python
from flask import url_for
import requests

from demo_app import models

def test_list_categories(live_server, category_factory):
categories = category_factory.create_batch(5)

assert models.Category.query.count() == 5

url = url_for('blog.list_categories', _external=True)

response_1 = requests.get(url)

assert response_1.status_code == 200
data_1 = response_1.content.decode('utf-8')
for category in categories:
assert category.name in data_1

assert models.Category.query.count() == 5

response_2 = requests.get(url)

assert response_2.status_code == 200
data_2 = response_2.content.decode('utf-8')
print(data_2)
for category in categories:
assert category.name in data_2
```

I'm getting error on line `assert models.Category.query.count() == 5`, or if I comment it out, `data_2` data returned by the server is empty.

The error:
```
self =
cursor =
statement = 'SAVEPOINT sa_savepoint_23', parameters = {}
context =

def do_execute(self, cursor, statement, parameters, context=None):
> cursor.execute(statement, parameters)
E sqlalchemy.exc.InternalError: (psycopg2.errors.NoActiveSqlTransaction) SAVEPOINT can only be used in transaction blocks
E
E [SQL: SAVEPOINT sa_savepoint_23]
E (Background on this error at: http://sqlalche.me/e/2j85)
```

**[Full stack trace](https://pastebin.com/5KLMCkcX)**

Could you please help me, I don't know where to start to investigate this.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.