Browse Source

Remove dependency on nose (port to pytest)

I am a maintainer of Python packages in openSUSE, and I am on my crusade
of eliminating nose1 from our distribution. When I look at its
repository on https://github.com/nose-devs/nose, the last release 1.3.7
was on 2 Jun 2015, and even the last commit on the master branch was on
4 Mar 2016.
master
Matěj Cepl 2 years ago
parent
commit
b4ebb11c0c
No known key found for this signature in database GPG Key ID: 79205802880BC9D8
  1. 4
      README.rst
  2. 106
      flask_admin/tests/fileadmin/test_fileadmin.py
  3. 2
      flask_admin/tests/fileadmin/test_fileadmin_azure.py
  4. 93
      flask_admin/tests/geoa/test_basic.py
  5. 2
      flask_admin/tests/mongoengine/__init__.py
  6. 551
      flask_admin/tests/mongoengine/test_basic.py
  7. 622
      flask_admin/tests/peeweemodel/test_basic.py
  8. 44
      flask_admin/tests/pymongo/test_basic.py
  9. 1170
      flask_admin/tests/sqla/test_basic.py
  10. 46
      flask_admin/tests/sqla/test_form_rules.py
  11. 78
      flask_admin/tests/sqla/test_inlineform.py
  12. 56
      flask_admin/tests/sqla/test_multi_pk.py
  13. 56
      flask_admin/tests/sqla/test_postgres.py
  14. 5
      flask_admin/tests/sqla/test_translation.py
  15. 186
      flask_admin/tests/test_base.py
  16. 103
      flask_admin/tests/test_form_upload.py
  17. 316
      flask_admin/tests/test_model.py
  18. 16
      flask_admin/tests/test_tools.py
  19. 6
      setup.cfg
  20. 4
      setup.py

4
README.rst

@ -88,12 +88,12 @@ Or alternatively, you can download the repository and install manually by doing:
Tests
-----
Test are run with *nose*. If you are not familiar with this package you can get some more info from `their website <https://nose.readthedocs.io/>`_.
Test are run with *pytest*. If you are not familiar with this package you can get some more info from `their website <https://pytest.org/>`_.
To run the tests, from the project directory, simply::
pip install -r requirements-dev.txt
nosetests
pytest
You should see output similar to::

106
flask_admin/tests/fileadmin/test_fileadmin.py

@ -2,8 +2,6 @@ import os
import os.path as op
import unittest
from nose.tools import eq_, ok_
from flask_admin.contrib import fileadmin
from flask_admin import Admin
from flask import Flask
@ -45,98 +43,98 @@ class Base:
# index
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy.txt' in rv.data.decode('utf-8')
# edit
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'dummy.txt' in rv.data.decode('utf-8')
rv = client.post('/admin/myfileadmin/edit/?path=dummy.txt',
data=dict(content='new_string'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
ok_('new_string' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'dummy.txt' in rv.data.decode('utf-8')
assert 'new_string' in rv.data.decode('utf-8')
# rename
rv = client.get('/admin/myfileadmin/rename/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'dummy.txt' in rv.data.decode('utf-8')
rv = client.post('/admin/myfileadmin/rename/?path=dummy.txt',
data=dict(name='dummy_renamed.txt',
path='dummy.txt'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
ok_('path=dummy.txt' not in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8')
assert 'path=dummy.txt' not in rv.data.decode('utf-8')
# upload
rv = client.get('/admin/myfileadmin/upload/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/myfileadmin/upload/',
data=dict(upload=(StringIO(""), 'dummy.txt')))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy.txt' in rv.data.decode('utf-8')
assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8')
# delete
rv = client.post('/admin/myfileadmin/delete/',
data=dict(path='dummy_renamed.txt'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy_renamed.txt' not in rv.data.decode('utf-8'))
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy_renamed.txt' not in rv.data.decode('utf-8')
assert 'path=dummy.txt' in rv.data.decode('utf-8')
# mkdir
rv = client.get('/admin/myfileadmin/mkdir/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/myfileadmin/mkdir/',
data=dict(name='dummy_dir'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
ok_('path=dummy_dir' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy.txt' in rv.data.decode('utf-8')
assert 'path=dummy_dir' in rv.data.decode('utf-8')
# rename - directory
rv = client.get('/admin/myfileadmin/rename/?path=dummy_dir')
eq_(rv.status_code, 200)
ok_('dummy_dir' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'dummy_dir' in rv.data.decode('utf-8')
rv = client.post('/admin/myfileadmin/rename/?path=dummy_dir',
data=dict(name='dummy_renamed_dir',
path='dummy_dir'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy_renamed_dir' in rv.data.decode('utf-8'))
ok_('path=dummy_dir' not in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy_renamed_dir' in rv.data.decode('utf-8')
assert 'path=dummy_dir' not in rv.data.decode('utf-8')
# delete - directory
rv = client.post('/admin/myfileadmin/delete/',
data=dict(path='dummy_renamed_dir'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy_renamed_dir' not in rv.data.decode('utf-8'))
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8')
assert 'path=dummy.txt' in rv.data.decode('utf-8')
def test_modal_edit(self):
# bootstrap 2 - test edit_modal
@ -170,15 +168,15 @@ class Base:
# bootstrap 2 - ensure modal window is added when edit_modal is
# enabled
rv = client_bs2.get('/admin/edit_modal_on/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('fa_modal_window' in data)
assert 'fa_modal_window' in data
# bootstrap 2 - test edit modal disabled
rv = client_bs2.get('/admin/edit_modal_off/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('fa_modal_window' not in data)
assert 'fa_modal_window' not in data
# bootstrap 3
app_bs3 = Flask(__name__)
@ -192,15 +190,15 @@ class Base:
# bootstrap 3 - ensure modal window is added when edit_modal is
# enabled
rv = client_bs3.get('/admin/edit_modal_on/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('fa_modal_window' in data)
assert 'fa_modal_window' in data
# bootstrap 3 - test modal disabled
rv = client_bs3.get('/admin/edit_modal_off/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('fa_modal_window' not in data)
assert 'fa_modal_window' not in data
class LocalFileAdminTests(Base.FileAdminTests):
@ -230,14 +228,14 @@ class LocalFileAdminTests(Base.FileAdminTests):
fp.write('test')
rv = client.get('/admin/myfileadmin/?sort=bogus')
eq_(rv.status_code, 200)
ok_(rv.data.decode('utf-8').find('path=dummy2.txt') <
rv.data.decode('utf-8').find('path=dummy.txt'))
assert rv.status_code == 200
assert rv.data.decode('utf-8').find('path=dummy2.txt') < \
rv.data.decode('utf-8').find('path=dummy.txt')
rv = client.get('/admin/myfileadmin/?sort=name')
eq_(rv.status_code, 200)
ok_(rv.data.decode('utf-8').find('path=dummy.txt') <
rv.data.decode('utf-8').find('path=dummy2.txt'))
assert rv.status_code == 200
assert rv.data.decode('utf-8').find('path=dummy.txt') < \
rv.data.decode('utf-8').find('path=dummy2.txt')
try:
# clean up
os.remove(op.join(self._test_files_root, 'dummy2.txt'))

2
flask_admin/tests/fileadmin/test_fileadmin_azure.py

@ -2,7 +2,7 @@ import os.path as op
from os import getenv
from uuid import uuid4
from nose import SkipTest
from unittest import SkipTest
from flask_admin.contrib.fileadmin import azure

93
flask_admin/tests/geoa/test_basic.py

@ -6,7 +6,6 @@ from flask_admin.contrib.geoa import ModelView
from flask_admin.contrib.geoa.fields import GeoJSONField
from geoalchemy2 import Geometry
from geoalchemy2.shape import to_shape
from nose.tools import eq_, ok_
from . import setup
@ -38,27 +37,27 @@ def test_model():
view = ModelView(GeoModel, db.session)
admin.add_view(view)
eq_(view.model, GeoModel)
eq_(view._primary_key, 'id')
assert view.model == GeoModel
assert view._primary_key == 'id'
# Verify form
eq_(view._create_form_class.point.field_class, GeoJSONField)
eq_(view._create_form_class.point.kwargs['geometry_type'], "POINT")
eq_(view._create_form_class.line.field_class, GeoJSONField)
eq_(view._create_form_class.line.kwargs['geometry_type'], "LINESTRING")
eq_(view._create_form_class.polygon.field_class, GeoJSONField)
eq_(view._create_form_class.polygon.kwargs['geometry_type'], "POLYGON")
eq_(view._create_form_class.multi.field_class, GeoJSONField)
eq_(view._create_form_class.multi.kwargs['geometry_type'], "MULTIPOINT")
assert view._create_form_class.point.field_class == GeoJSONField
assert view._create_form_class.point.kwargs['geometry_type'] == "POINT"
assert view._create_form_class.line.field_class == GeoJSONField
assert view._create_form_class.line.kwargs['geometry_type'] == "LINESTRING"
assert view._create_form_class.polygon.field_class == GeoJSONField
assert view._create_form_class.polygon.kwargs['geometry_type'] == "POLYGON"
assert view._create_form_class.multi.field_class == GeoJSONField
assert view._create_form_class.multi.kwargs['geometry_type'] == "MULTIPOINT"
# Make some test clients
client = app.test_client()
rv = client.get('/admin/geomodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.get('/admin/geomodel/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/geomodel/new/', data={
"name": "test1",
@ -68,63 +67,63 @@ def test_model():
' [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]}'),
"multi": '{"type": "MultiPoint", "coordinates": [[100.0, 0.0], [101.0, 1.0]]}',
})
eq_(rv.status_code, 302)
assert rv.status_code == 302
model = db.session.query(GeoModel).first()
eq_(model.name, "test1")
eq_(to_shape(model.point).geom_type, "Point")
eq_(list(to_shape(model.point).coords), [(125.8, 10.0)])
eq_(to_shape(model.line).geom_type, "LineString")
eq_(list(to_shape(model.line).coords), [(50.2345, 94.2), (50.21, 94.87)])
eq_(to_shape(model.polygon).geom_type, "Polygon")
assert model.name == "test1"
assert to_shape(model.point).geom_type == "Point"
assert list(to_shape(model.point).coords) == [(125.8, 10.0])
assert to_shape(model.line).geom_type == "LineString"
assert list(to_shape(model.line).coords) == [(50.2345, 94.2, (50.21, 94.87)])
assert to_shape(model.polygon).geom_type == "Polygon"
eq_(list(to_shape(model.polygon).exterior.coords),
[(100.0, 0.0), (101.0, 0.0), (101.0, 1.0), (100.0, 1.0), (100.0, 0.0)])
eq_(to_shape(model.multi).geom_type, "MultiPoint")
eq_(len(to_shape(model.multi).geoms), 2)
eq_(list(to_shape(model.multi).geoms[0].coords), [(100.0, 0.0)])
eq_(list(to_shape(model.multi).geoms[1].coords), [(101.0, 1.0)])
assert to_shape(model.multi).geom_type == "MultiPoint"
assert len(to_shape(model.multi).geoms) == 2
assert list(to_shape(model.multi).geoms[0].coords) == [(100.0, 0.0])
assert list(to_shape(model.multi).geoms[1].coords) == [(101.0, 1.0])
rv = client.get('/admin/geomodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
html = rv.data.decode('utf-8')
pattern = r'(.|\n)+({.*"type": ?"Point".*})</textarea>(.|\n)+'
group = re.match(pattern, html).group(2)
p = json.loads(group)
eq_(p['coordinates'][0], 125.8)
eq_(p['coordinates'][1], 10.0)
assert p['coordinates'][0] == 125.8
assert p['coordinates'][1] == 10.0
url = '/admin/geomodel/edit/?id=%s' % model.id
rv = client.get(url)
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_(r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}</textarea>' in data or
r'{&#34;type&#34;:&#34;MultiPoint&#34;,&#34;coordinates&#34;:[[100,0],[101,1]]}' in data)
assert (r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}</textarea>' in data or
r'{&#34;type&#34;:&#34;MultiPoint&#34;,&#34;coordinates&#34;:[[100,0],[101,1]]}' in data)
# rv = client.post(url, data={
# "name": "edited",
# "point": '{"type": "Point", "coordinates": [99.9, 10.5]}',
# "line": '', # set to NULL in the database
# })
# eq_(rv.status_code, 302)
# assert rv.status_code == 302
#
# model = db.session.query(GeoModel).first()
# eq_(model.name, "edited")
# eq_(to_shape(model.point).geom_type, "Point")
# eq_(list(to_shape(model.point).coords), [(99.9, 10.5)])
# eq_(to_shape(model.line), None)
# eq_(to_shape(model.polygon).geom_type, "Polygon")
# assert model.name == "edited"
# assert to_shape(model.point).geom_type == "Point"
# assert list(to_shape(model.point).coords) == [(99.9, 10.5])
# assert to_shape(model.line) == None
# assert to_shape(model.polygon).geom_type == "Polygon"
# eq_(list(to_shape(model.polygon).exterior.coords),
# [(100.0, 0.0), (101.0, 0.0), (101.0, 1.0), (100.0, 1.0), (100.0, 0.0)])
# eq_(to_shape(model.multi).geom_type, "MultiPoint")
# eq_(len(to_shape(model.multi).geoms), 2)
# eq_(list(to_shape(model.multi).geoms[0].coords), [(100.0, 0.0)])
# eq_(list(to_shape(model.multi).geoms[1].coords), [(101.0, 1.0)])
# assert to_shape(model.multi).geom_type == "MultiPoint"
# assert len(to_shape(model.multi).geoms) == 2
# assert list(to_shape(model.multi).geoms[0].coords) == [(100.0, 0.0])
# assert list(to_shape(model.multi).geoms[1].coords) == [(101.0, 1.0])
url = '/admin/geomodel/delete/?id=%s' % model.id
rv = client.post(url)
eq_(rv.status_code, 302)
eq_(db.session.query(GeoModel).count(), 0)
assert rv.status_code == 302
assert db.session.query(GeoModel).count() == 0
def test_none():
@ -143,14 +142,14 @@ def test_none():
rv = client.post('/admin/geomodel/new/', data={
"name": "test1",
})
eq_(rv.status_code, 302)
assert rv.status_code == 302
model = db.session.query(GeoModel).first()
url = '/admin/geomodel/edit/?id=%s' % model.id
rv = client.get(url)
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_(r' name="point"></textarea>' in data or
' name="point">\n</textarea>' in data or
' name="point">\r\n</textarea>' in data)
assert (r' name="point"></textarea>' in data or
' name="point">\n</textarea>' in data or
' name="point">\r\n</textarea>' in data)

2
flask_admin/tests/mongoengine/__init__.py

@ -1,4 +1,4 @@
from nose.plugins.skip import SkipTest
from unittest import SkipTest
from wtforms import __version__ as wtforms_version
if int(wtforms_version[0]) < 2:

551
flask_admin/tests/mongoengine/test_basic.py
File diff suppressed because it is too large
View File

622
flask_admin/tests/peeweemodel/test_basic.py
File diff suppressed because it is too large
View File

44
flask_admin/tests/pymongo/test_basic.py

@ -1,5 +1,3 @@
from nose.tools import eq_, ok_
from wtforms import form, fields
from flask_admin.contrib.pymongo import ModelView
@ -30,54 +28,54 @@ def test_model():
# Drop existing data (if any)
db.test.delete_many({})
eq_(view.name, 'Test')
eq_(view.endpoint, 'testview')
assert view.name == 'Test'
assert view.endpoint == 'testview'
ok_('test1' in view._sortable_columns)
ok_('test2' in view._sortable_columns)
assert 'test1' in view._sortable_columns
assert 'test2' in view._sortable_columns
ok_(view._create_form_class is not None)
ok_(view._edit_form_class is not None)
eq_(view._search_supported, False)
eq_(view._filters, None)
assert view._create_form_class is not None
assert view._edit_form_class is not None
assert not view._search_supported
assert view._filters is None
# Make some test clients
client = app.test_client()
rv = client.get('/admin/testview/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.get('/admin/testview/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/testview/new/',
data=dict(test1='test1large', test2='test2'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
model = db.test.find()[0]
print(model)
eq_(model['test1'], 'test1large')
eq_(model['test2'], 'test2')
assert model['test1'] == 'test1large'
assert model['test2'] == 'test2'
rv = client.get('/admin/testview/')
eq_(rv.status_code, 200)
ok_('test1large' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert 'test1large' in rv.data.decode('utf-8')
url = '/admin/testview/edit/?id=%s' % model['_id']
rv = client.get(url)
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post(url,
data=dict(test1='test1small', test2='test2large'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
print(db.test.find()[0])
model = db.test.find()[0]
eq_(model['test1'], 'test1small')
eq_(model['test2'], 'test2large')
assert model['test1'] == 'test1small'
assert model['test2'] == 'test2large'
url = '/admin/testview/delete/?id=%s' % model['_id']
rv = client.post(url)
eq_(rv.status_code, 302)
eq_(db.test.count(), 0)
assert rv.status_code == 302
assert db.test.count() == 0

1170
flask_admin/tests/sqla/test_basic.py
File diff suppressed because it is too large
View File

46
flask_admin/tests/sqla/test_form_rules.py

@ -1,5 +1,3 @@
from nose.tools import eq_, ok_
from . import setup
from .test_basic import CustomModelView, create_models
@ -19,16 +17,16 @@ def test_form_rules():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
pos1 = data.find('Test1')
pos2 = data.find('Test2')
pos3 = data.find('Test3')
pos4 = data.find('Test4')
ok_(pos1 > pos2)
ok_(pos4 > pos1)
ok_(pos3 == -1)
assert pos1 > pos2
assert pos4 > pos1
assert pos3 == -1
def test_rule_macro():
@ -46,11 +44,11 @@ def test_rule_macro():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('Value = foobar' in data)
ok_('Hello another_test' in data)
assert 'Value = foobar' in data
assert 'Hello another_test' in data
def test_rule_container():
@ -67,16 +65,16 @@ def test_rule_container():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
pos1 = data.find('<wrapper>')
pos2 = data.find('another_test')
pos3 = data.find('</wrapper>')
ok_(pos1 != -1)
ok_(pos2 != -1)
ok_(pos3 != -1)
ok_(pos1 < pos2 < pos3)
assert pos1 != -1
assert pos2 != -1
assert pos3 != -1
assert pos1 < pos2 < pos3
def test_rule_header():
@ -92,10 +90,10 @@ def test_rule_header():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('<h3>hello</h3>' in data)
assert '<h3>hello</h3>' in data
def test_rule_field_set():
@ -111,17 +109,17 @@ def test_rule_field_set():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('<h3>header</h3>' in data)
assert '<h3>header</h3>' in data
pos1 = data.find('Test1')
pos2 = data.find('Test2')
pos3 = data.find('Test3')
pos4 = data.find('Test4')
ok_(pos1 > pos2)
ok_(pos4 > pos1)
ok_(pos3 == -1)
assert pos1 > pos2
assert pos4 > pos1
assert pos3 == -1
def test_rule_inlinefieldlist():
@ -138,7 +136,7 @@ def test_rule_inlinefieldlist():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
def test_inline_model_rules():
@ -154,7 +152,7 @@ def test_inline_model_rules():
client = app.test_client()
rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('int_field' not in data)
assert 'int_field' not in data

78
flask_admin/tests/sqla/test_inlineform.py

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
from nose.tools import eq_, ok_
from wtforms import fields
from flask_admin import form
@ -42,35 +40,35 @@ def test_inline_form():
admin.add_view(view)
# Basic tests
ok_(view._create_form_class is not None)
ok_(view._edit_form_class is not None)
eq_(view.endpoint, 'user')
assert view._create_form_class is not None
assert view._edit_form_class is not None
assert view.endpoint == 'user'
# Verify form
eq_(view._create_form_class.name.field_class, fields.StringField)
eq_(view._create_form_class.info.field_class, InlineModelFormList)
assert view._create_form_class.name.field_class == fields.StringField
assert view._create_form_class.info.field_class == InlineModelFormList
rv = client.get('/admin/user/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.get('/admin/user/new/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
# Create
rv = client.post('/admin/user/new/', data=dict(name=u'äõüxyz'))
eq_(rv.status_code, 302)
eq_(User.query.count(), 1)
eq_(UserInfo.query.count(), 0)
assert rv.status_code == 302
assert User.query.count() == 1
assert UserInfo.query.count() == 0
data = {'name': u'fbar', 'info-0-key': 'foo', 'info-0-val': 'bar'}
rv = client.post('/admin/user/new/', data=data)
eq_(rv.status_code, 302)
eq_(User.query.count(), 2)
eq_(UserInfo.query.count(), 1)
assert rv.status_code == 302
assert User.query.count() == 2
assert UserInfo.query.count() == 1
# Edit
rv = client.get('/admin/user/edit/?id=2')
eq_(rv.status_code, 200)
assert rv.status_code == 200
# Edit - update
data = {
'name': u'barfoo',
@ -79,8 +77,8 @@ def test_inline_form():
'info-0-val': u'yyy',
}
rv = client.post('/admin/user/edit/?id=2', data=data)
eq_(UserInfo.query.count(), 1)
eq_(UserInfo.query.one().key, u'xxx')
assert UserInfo.query.count() == 1
assert UserInfo.query.one().key == u'xxx'
# Edit - add & delete
data = {
@ -94,20 +92,20 @@ def test_inline_form():
'info-1-val': u'foo',
}
rv = client.post('/admin/user/edit/?id=2', data=data)
eq_(rv.status_code, 302)
eq_(User.query.count(), 2)
eq_(User.query.get(2).name, u'barf')
eq_(UserInfo.query.count(), 1)
eq_(UserInfo.query.one().key, u'bar')
assert rv.status_code == 302
assert User.query.count() == 2
assert User.query.get(2).name == u'barf'
assert UserInfo.query.count() == 1
assert UserInfo.query.one().key == u'bar'
# Delete
rv = client.post('/admin/user/delete/?id=2')
eq_(rv.status_code, 302)
eq_(User.query.count(), 1)
assert rv.status_code == 302
assert User.query.count() == 1
rv = client.post('/admin/user/delete/?id=1')
eq_(rv.status_code, 302)
eq_(User.query.count(), 0)
eq_(UserInfo.query.count(), 0)
assert rv.status_code == 302
assert User.query.count() == 0
assert UserInfo.query.count() == 0
def test_inline_form_required():
@ -145,17 +143,17 @@ def test_inline_form_required():
# Create
rv = client.post('/admin/user/new/', data=dict(name=u'no-email'))
eq_(rv.status_code, 200)
eq_(User.query.count(), 0)
assert rv.status_code == 200
assert User.query.count() == 0
data = {
'name': 'hasEmail',
'emails-0-email': 'foo@bar.com',
}
rv = client.post('/admin/user/new/', data=data)
eq_(rv.status_code, 302)
eq_(User.query.count(), 1)
eq_(UserEmail.query.count(), 1)
assert rv.status_code == 302
assert User.query.count() == 1
assert UserEmail.query.count() == 1
def test_inline_form_ajax_fk():
@ -208,10 +206,10 @@ def test_inline_form_ajax_fk():
form = view.create_form()
user_info_form = form.info.unbound_field.args[0]
loader = user_info_form.tag.args[0]
eq_(loader.name, 'userinfo-tag')
eq_(loader.model, Tag)
assert loader.name == 'userinfo-tag'
assert loader.model == Tag
ok_('userinfo-tag' in view._form_ajax_refs)
assert 'userinfo-tag' in view._form_ajax_refs
def test_inline_form_self():
@ -232,7 +230,7 @@ def test_inline_form_self():
parent = Tree()
child = Tree(parent=parent)
form = view.edit_form(child)
eq_(form.parent.data, parent)
assert form.parent.data == parent
def test_inline_form_base_class():
@ -286,6 +284,6 @@ def test_inline_form_base_class():
'emails-0-email': '',
}
rv = client.post('/admin/user/new/', data=data)
eq_(rv.status_code, 200)
eq_(User.query.count(), 0)
ok_(b'success!' in rv.data, rv.data)
assert rv.status_code == 200
assert User.query.count() == 0
assert b'success!' in rv.data, rv.data

56
flask_admin/tests/sqla/test_multi_pk.py

@ -1,5 +1,3 @@
from nose.tools import eq_, ok_
from . import setup
from .test_basic import CustomModelView
@ -24,25 +22,25 @@ def test_multiple_pk():
client = app.test_client()
rv = client.get('/admin/model/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/model/new/',
data=dict(id=1, id2='two', test='test3'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/model/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('test3' in data)
assert 'test3' in data
rv = client.get('/admin/model/edit/?id=1,two')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('test3' in data)
assert 'test3' in data
# Correct order is mandatory -> fail here
rv = client.get('/admin/model/edit/?id=two,1')
eq_(rv.status_code, 302)
assert rv.status_code == 302
def test_joined_inheritance():
@ -71,17 +69,17 @@ def test_joined_inheritance():
client = app.test_client()
rv = client.get('/admin/child/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/child/new/',
data=dict(id=1, test='foo', name='bar'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/child/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('foo' in data)
ok_('bar' in data)
assert 'foo' in data
assert 'bar' in data
def test_single_table_inheritance():
@ -111,17 +109,17 @@ def test_single_table_inheritance():
client = app.test_client()
rv = client.get('/admin/child/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/child/new/',
data=dict(id=1, test='foo', name='bar'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/child/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('foo' in data)
ok_('bar' in data)
assert 'foo' in data
assert 'bar' in data
def test_concrete_table_inheritance():
@ -146,17 +144,17 @@ def test_concrete_table_inheritance():
client = app.test_client()
rv = client.get('/admin/child/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/child/new/',
data=dict(id=1, test='foo', name='bar'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/child/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('foo' in data)
ok_('bar' in data)
assert 'foo' in data
assert 'bar' in data
def test_concrete_multipk_inheritance():
@ -182,14 +180,14 @@ def test_concrete_multipk_inheritance():
client = app.test_client()
rv = client.get('/admin/child/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/child/new/',
data=dict(id=1, id2=2, test='foo', name='bar'))
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/child/edit/?id=1,2')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('foo' in data)
ok_('bar' in data)
assert 'foo' in data
assert 'bar' in data

56
flask_admin/tests/sqla/test_postgres.py

@ -1,5 +1,3 @@
from nose.tools import eq_, ok_
from . import setup_postgres
from .test_basic import CustomModelView
@ -22,25 +20,25 @@ def test_hstore():
client = app.test_client()
rv = client.get('/admin/model/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/model/new/', data={
'hstore_test-0-key': 'test_val1',
'hstore_test-0-value': 'test_val2'
})
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/model/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('test_val1' in data)
ok_('test_val2' in data)
assert 'test_val1' in data
assert 'test_val2' in data
rv = client.get('/admin/model/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('test_val1' in data)
ok_('test_val2' in data)
assert 'test_val1' in data
assert 'test_val2' in data
def test_json():
@ -58,25 +56,25 @@ def test_json():
client = app.test_client()
rv = client.get('/admin/jsonmodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/jsonmodel/new/', data={
'json_test': '{"test_key1": "test_value1"}',
})
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/jsonmodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('json_test' in data)
ok_('{&#34;test_key1&#34;: &#34;test_value1&#34;}' in data)
assert 'json_test' in data
assert '{&#34;test_key1&#34;: &#34;test_value1&#34;}' in data
rv = client.get('/admin/jsonmodel/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('json_test' in data)
ok_('>{"test_key1": "test_value1"}<' in data or
'{&#34;test_key1&#34;: &#34;test_value1&#34;}<' in data)
assert 'json_test' in data
assert ('>{"test_key1": "test_value1"}<' in data or
'{&#34;test_key1&#34;: &#34;test_value1&#34;}<' in data)
def test_citext():
@ -95,23 +93,23 @@ def test_citext():
client = app.test_client()
rv = client.get('/admin/citextmodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.post('/admin/citextmodel/new/', data={
'citext_test': 'Foo',
})
eq_(rv.status_code, 302)
assert rv.status_code == 302
rv = client.get('/admin/citextmodel/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('citext_test' in data)
ok_('Foo' in data)
assert 'citext_test' in data
assert 'Foo' in data
rv = client.get('/admin/citextmodel/edit/?id=1')
eq_(rv.status_code, 200)
assert rv.status_code == 200
data = rv.data.decode('utf-8')
ok_('name="citext_test"' in data)
ok_('>Foo</' in data or
'>\nFoo</' in data or
'>\r\nFoo</' in data)
assert 'name="citext_test"' in data
assert ('>Foo</' in data or
'>\nFoo</' in data or
'>\r\nFoo</' in data)

5
flask_admin/tests/sqla/test_translation.py

@ -1,6 +1,5 @@
from flask_admin.babel import lazy_gettext
from flask_babelex import Babel
from nose.tools import eq_, ok_
from . import setup
from .test_basic import CustomModelView, create_models
@ -25,5 +24,5 @@ def test_column_label_translation():
client = app.test_client()
rv = client.get('/admin/model1/?flt1_0=test')
eq_(rv.status_code, 200)
ok_('{"Nombre":' in rv.data.decode('utf-8'))
assert rv.status_code == 200
assert '{"Nombre":' in rv.data.decode('utf-8')

186
flask_admin/tests/test_base.py

@ -1,6 +1,6 @@
import os
from nose.tools import ok_, eq_, raises
import pytest
from flask import Flask, request, abort, url_for
from flask.views import MethodView
@ -76,27 +76,27 @@ class MockMethodView(base.BaseView):
def test_baseview_defaults():
view = MockView()
eq_(view.name, None)
eq_(view.category, None)
eq_(view.endpoint, 'mockview')
eq_(view.url, None)
eq_(view.static_folder, None)
eq_(view.admin, None)
eq_(view.blueprint, None)
assert view.name is None
assert view.category is None
assert view.endpoint == 'mockview'
assert view.url is None
assert view.static_folder is None
assert view.admin is None
assert view.blueprint is None
def test_base_defaults():
admin = base.Admin()
eq_(admin.name, 'Admin')
eq_(admin.url, '/admin')
eq_(admin.endpoint, 'admin')
eq_(admin.app, None)
ok_(admin.index_view is not None)
eq_(admin.index_view._template, 'admin/index.html')
assert admin.name == 'Admin'
assert admin.url == '/admin'
assert admin.endpoint == 'admin'
assert admin.app is None
assert admin.index_view is not None
assert admin.index_view._template == 'admin/index.html'
# Check if default view was added
eq_(len(admin._views), 1)
eq_(admin._views[0], admin.index_view)
assert len(admin._views) == 1
assert admin._views[0] == admin.index_view
def test_custom_index_view():
@ -104,16 +104,16 @@ def test_custom_index_view():
url='/d', template='e')
admin = base.Admin(index_view=view)
eq_(admin.endpoint, 'c')
eq_(admin.url, '/d')
ok_(admin.index_view is view)
eq_(view.name, 'a')
eq_(view.category, 'b')
eq_(view._template, 'e')
assert admin.endpoint == 'c'
assert admin.url == '/d'
assert admin.index_view is view
assert view.name == 'a'
assert view.category == 'b'
assert view._template == 'e'
# Check if view was added
eq_(len(admin._views), 1)
eq_(admin._views[0], view)
assert len(admin._views) == 1
assert admin._views[0] == view
def test_custom_index_view_in_init_app():
@ -123,41 +123,41 @@ def test_custom_index_view_in_init_app():
admin = base.Admin()
admin.init_app(app, index_view=view)
eq_(admin.endpoint, 'c')
eq_(admin.url, '/d')
ok_(admin.index_view is view)
eq_(view.name, 'a')
eq_(view.category, 'b')
eq_(view._template, 'e')
assert admin.endpoint == 'c'
assert admin.url == '/d'
assert admin.index_view is view
assert view.name == 'a'
assert view.category == 'b'
assert view._template == 'e'
# Check if view was added
eq_(len(admin._views), 1)
eq_(admin._views[0], view)
assert len(admin._views) == 1
assert admin._views[0] == view
def test_base_registration():
app = Flask(__name__)
admin = base.Admin(app)
eq_(admin.app, app)
ok_(admin.index_view.blueprint is not None)
assert admin.app == app
assert admin.index_view.blueprint is not None
def test_admin_customizations():
app = Flask(__name__)
admin = base.Admin(app, name='Test', url='/foobar', static_url_path='/static/my/admin')
eq_(admin.name, 'Test')
eq_(admin.url, '/foobar')
eq_(admin.index_view.blueprint.static_url_path, '/static/my/admin')
assert admin.name == 'Test'
assert admin.url == '/foobar'
assert admin.index_view.blueprint.static_url_path == '/static/my/admin'
client = app.test_client()
rv = client.get('/foobar/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
# test custom static_url_path
with app.test_request_context('/'):
rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap2/css/bootstrap.css'))
eq_(rv.status_code, 200)
assert rv.status_code == 200
def test_baseview_registration():
@ -167,43 +167,43 @@ def test_baseview_registration():
bp = view.create_blueprint(admin)
# Base properties
eq_(view.admin, admin)
ok_(view.blueprint is not None)
assert view.admin == admin
assert view.blueprint is not None
# Calculated properties
eq_(view.endpoint, 'mockview')
eq_(view.url, '/admin/mockview')
eq_(view.name, 'Mock View')
assert view.endpoint == 'mockview'
assert view.url == '/admin/mockview'
assert view.name == 'Mock View'
# Verify generated blueprint properties
eq_(bp.name, view.endpoint)
eq_(bp.url_prefix, view.url)
eq_(bp.template_folder, os.path.join('templates', 'bootstrap2'))
eq_(bp.static_folder, view.static_folder)
assert bp.name == view.endpoint
assert bp.url_prefix == view.url
assert bp.template_folder == os.path.join('templates', 'bootstrap2')
assert bp.static_folder == view.static_folder
# Verify customizations
view = MockView(name='Test', endpoint='foobar')
view.create_blueprint(base.Admin())
eq_(view.name, 'Test')
eq_(view.endpoint, 'foobar')
eq_(view.url, '/admin/foobar')
assert view.name == 'Test'
assert view.endpoint == 'foobar'
assert view.url == '/admin/foobar'
view = MockView(url='test')
view.create_blueprint(base.Admin())
eq_(view.url, '/admin/test')
assert view.url == '/admin/test'
view = MockView(url='/test/test')
view.create_blueprint(base.Admin())
eq_(view.url, '/test/test')
assert view.url == '/test/test'
view = MockView(endpoint='test')
view.create_blueprint(base.Admin(url='/'))
eq_(view.url, '/test')
assert view.url == '/test'
view = MockView(static_url_path='/static/my/test')
view.create_blueprint(base.Admin())
eq_(view.blueprint.static_url_path, '/static/my/test')
assert view.blueprint.static_url_path == '/static/my/test'
def test_baseview_urls():
@ -213,7 +213,7 @@ def test_baseview_urls():
view = MockView()
admin.add_view(view)
eq_(len(view._urls), 2)
assert len(view._urls) == 2
def test_add_views():
@ -222,10 +222,10 @@ def test_add_views():
admin.add_views(MockView(endpoint='test1'), MockView(endpoint='test2'))
eq_(len(admin.menu()), 3)
assert len(admin.menu()) == 3
@raises(Exception)
@pytest.mark.xfail(raises=Exception)
def test_no_default():
app = Flask(__name__)
admin = base.Admin(app)
@ -240,18 +240,18 @@ def test_call():
client = app.test_client()
rv = client.get('/admin/')
eq_(rv.status_code, 200)
assert rv.status_code == 200
rv = client.get('/admin/mockview/')
eq_(rv.data, b'Success!')
assert rv.data == b'Success!'
rv = client.get('/admin/mockview/test/')
eq_(rv.data, b'Success!')
assert rv.data == b'Success!'
# Check authentication failure
view.allow_call = False
rv = client.get('/admin/mockview/')
eq_(rv.data, b'Failure!')
assert rv.data == b'Failure!'
def test_permissions():
@ -264,7 +264,7 @@ def test_permissions():
view.allow_access = False
rv = client.get('/admin/mockview/')
eq_(rv.status_code, 403)
assert rv.status_code == 403
def test_inaccessible_callback():
@ -278,7 +278,7 @@ def test_inaccessible_callback():
view.inaccessible_callback = lambda *args, **kwargs: abort(418)
rv = client.get('/admin/mockview/')
eq_(rv.status_code, 418)
assert rv.status_code == 418
def get_visibility():
@ -293,7 +293,7 @@ def get_visibility():
client = app.test_client()
rv = client.get('/admin/mockview/')
ok_('TestMenuItem' not in rv.data.decode('utf-8'))
assert 'TestMenuItem' not in rv.data.decode('utf-8')
def test_submenu():
@ -306,21 +306,21 @@ def test_submenu():
view.allow_access = False
admin.add_view(view)
ok_('Test' in admin._menu_categories)
eq_(len(admin._menu), 2)
eq_(admin._menu[1].name, 'Test')
eq_(len(admin._menu[1]._children), 2)
assert 'Test' in admin._menu_categories
assert len(admin._menu) == 2