forked from Pylons/pyramid
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6326c7c
commit 3623f35
Showing
11 changed files
with
273 additions
and
83 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
[pytest] | ||
addopts = --strict | ||
addopts = --strict-markers | ||
|
||
testpaths = | ||
sqla_demo | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
### | ||
# app configuration | ||
# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html | ||
### | ||
|
||
[app:main] | ||
use = egg:sqla_demo | ||
|
||
pyramid.reload_templates = false | ||
pyramid.debug_authorization = false | ||
pyramid.debug_notfound = false | ||
pyramid.debug_routematch = false | ||
pyramid.default_locale_name = en | ||
|
||
sqlalchemy.url = sqlite:///%(here)s/testing.sqlite | ||
|
||
retry.attempts = 3 | ||
|
||
[pshell] | ||
setup = sqla_demo.pshell.setup | ||
|
||
### | ||
# wsgi server configuration | ||
### | ||
|
||
[alembic] | ||
# path to migration scripts | ||
script_location = sqla_demo/alembic | ||
file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s | ||
# file_template = %%(rev)s_%%(slug)s | ||
|
||
[server:main] | ||
use = egg:waitress#main | ||
listen = localhost:6543 | ||
|
||
### | ||
# logging configuration | ||
# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html | ||
### | ||
|
||
[loggers] | ||
keys = root, sqla_demo, sqlalchemy, alembic | ||
|
||
[handlers] | ||
keys = console | ||
|
||
[formatters] | ||
keys = generic | ||
|
||
[logger_root] | ||
level = INFO | ||
handlers = console | ||
|
||
[logger_sqla_demo] | ||
level = DEBUG | ||
handlers = | ||
qualname = sqla_demo | ||
|
||
[logger_sqlalchemy] | ||
level = WARN | ||
handlers = | ||
qualname = sqlalchemy.engine | ||
# "level = INFO" logs SQL queries. | ||
# "level = DEBUG" logs SQL queries and results. | ||
# "level = WARN" logs neither. (Recommended for production systems.) | ||
|
||
[logger_alembic] | ||
level = WARN | ||
handlers = | ||
qualname = alembic | ||
|
||
[handler_console] | ||
class = StreamHandler | ||
args = (sys.stderr,) | ||
level = NOTSET | ||
formatter = generic | ||
|
||
[formatter_generic] | ||
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
import alembic | ||
import alembic.config | ||
import alembic.command | ||
import os | ||
from pyramid.paster import get_appsettings | ||
from pyramid.scripting import prepare | ||
from pyramid.testing import DummyRequest, testConfig | ||
import pytest | ||
import transaction | ||
import webtest | ||
|
||
from sqla_demo import main | ||
from sqla_demo import models | ||
from sqla_demo.models.meta import Base | ||
|
||
|
||
def pytest_addoption(parser): | ||
parser.addoption('--ini', action='store', metavar='INI_FILE') | ||
|
||
@pytest.fixture(scope='session') | ||
def ini_file(request): | ||
# potentially grab this path from a pytest option | ||
return os.path.abspath(request.config.option.ini or 'testing.ini') | ||
|
||
@pytest.fixture(scope='session') | ||
def app_settings(ini_file): | ||
return get_appsettings(ini_file) | ||
|
||
@pytest.fixture(scope='session') | ||
def dbengine(app_settings, ini_file): | ||
engine = models.get_engine(app_settings) | ||
|
||
alembic_cfg = alembic.config.Config(ini_file) | ||
Base.metadata.drop_all(bind=engine) | ||
alembic.command.stamp(alembic_cfg, None, purge=True) | ||
|
||
# run migrations to initialize the database | ||
# depending on how we want to initialize the database from scratch | ||
# we could alternatively call: | ||
# Base.metadata.create_all(bind=engine) | ||
# alembic.command.stamp(alembic_cfg, "head") | ||
alembic.command.upgrade(alembic_cfg, "head") | ||
|
||
yield engine | ||
|
||
Base.metadata.drop_all(bind=engine) | ||
alembic.command.stamp(alembic_cfg, None, purge=True) | ||
|
||
@pytest.fixture(scope='session') | ||
def app(app_settings, dbengine): | ||
return main({}, dbengine=dbengine, **app_settings) | ||
|
||
@pytest.fixture | ||
def tm(): | ||
tm = transaction.TransactionManager(explicit=True) | ||
tm.begin() | ||
tm.doom() | ||
|
||
yield tm | ||
|
||
tm.abort() | ||
|
||
@pytest.fixture | ||
def dbsession(app, tm): | ||
session_factory = app.registry['dbsession_factory'] | ||
return models.get_tm_session(session_factory, tm) | ||
|
||
@pytest.fixture | ||
def testapp(app, tm, dbsession): | ||
# override request.dbsession and request.tm with our own | ||
# externally-controlled values that are shared across requests but aborted | ||
# at the end | ||
testapp = webtest.TestApp(app, extra_environ={ | ||
'HTTP_HOST': 'example.com', | ||
'tm.active': True, | ||
'tm.manager': tm, | ||
'app.dbsession': dbsession, | ||
}) | ||
|
||
return testapp | ||
|
||
@pytest.fixture | ||
def app_request(app, tm, dbsession): | ||
""" | ||
A real request. | ||
This request is almost identical to a real request but it has some | ||
drawbacks in tests as it's harder to mock data and is heavier. | ||
""" | ||
with prepare(registry=app.registry) as env: | ||
request = env['request'] | ||
request.host = 'example.com' | ||
|
||
# without this, request.dbsession will be joined to the same transaction | ||
# manager but it will be using a different sqlalchemy.orm.Session using | ||
# a separate database transaction | ||
request.dbsession = dbsession | ||
request.tm = tm | ||
|
||
yield request | ||
|
||
@pytest.fixture | ||
def dummy_request(tm, dbsession): | ||
""" | ||
A lightweight dummy request. | ||
This request is ultra-lightweight and should be used only when the request | ||
itself is not a large focus in the call-stack. It is much easier to mock | ||
and control side-effects using this object, however: | ||
- It does not have request extensions applied. | ||
- Threadlocals are not properly pushed. | ||
""" | ||
request = DummyRequest() | ||
request.host = 'example.com' | ||
request.dbsession = dbsession | ||
request.tm = tm | ||
|
||
return request | ||
|
||
@pytest.fixture | ||
def dummy_config(dummy_request): | ||
""" | ||
A dummy :class:`pyramid.config.Configurator` object. This allows for | ||
mock configuration, including configuration for ``dummy_request``, as well | ||
as pushing the appropriate threadlocals. | ||
""" | ||
with testConfig(request=dummy_request) as config: | ||
yield config |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from sqla_demo import models | ||
|
||
def test_my_view_success(testapp, dbsession): | ||
model = models.MyModel(name='one', value=55) | ||
dbsession.add(model) | ||
dbsession.flush() | ||
|
||
res = testapp.get('/', status=200) | ||
assert res.body | ||
|
||
def test_notfound(testapp): | ||
res = testapp.get('/badurl', status=404) | ||
assert res.status_code == 404 |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.