Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
20ce56f2
Commit
20ce56f2
authored
Apr 01, 2012
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More unit tests.
parent
235b6d9b
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
209 additions
and
46 deletions
+209
-46
view.py
flask_adminex/ext/sqlamodel/view.py
+7
-2
setup.cfg
setup.cfg
+0
-1
mock.py
tests/mock.py
+0
-27
test_base.py
tests/test_base.py
+25
-1
test_model.py
tests/test_model.py
+177
-15
No files found.
flask_adminex/ext/sqlamodel/view.py
View file @
20ce56f2
...
@@ -621,5 +621,10 @@ class ModelView(BaseModelView):
...
@@ -621,5 +621,10 @@ class ModelView(BaseModelView):
`model`
`model`
Model to delete
Model to delete
"""
"""
self
.
session
.
delete
(
model
)
try
:
self
.
session
.
commit
()
self
.
session
.
delete
(
model
)
self
.
session
.
commit
()
return
True
except
Exception
,
ex
:
flash
(
'Failed to delete model. '
+
str
(
ex
),
'error'
)
return
False
setup.cfg
View file @
20ce56f2
...
@@ -3,4 +3,3 @@ detailed-errors=1
...
@@ -3,4 +3,3 @@ detailed-errors=1
with-coverage=0
with-coverage=0
debug=nose.loader
debug=nose.loader
tests=tests/test_base.py
tests=tests/test_base.py
tests/mock.py
View file @
20ce56f2
from
flask.ext.adminex
import
base
class
MockView
(
base
.
BaseView
):
# Various properties
allow_call
=
True
allow_access
=
True
@
base
.
expose
(
'/'
)
def
index
(
self
):
return
'Success!'
@
base
.
expose
(
'/test/'
)
def
test
(
self
):
return
self
.
render
(
'mock.html'
)
def
_handle_view
(
self
,
name
,
**
kwargs
):
if
self
.
allow_call
:
return
super
(
MockView
,
self
)
.
_handle_view
(
name
,
**
kwargs
)
else
:
return
'Failure!'
def
is_accessible
(
self
):
if
self
.
allow_access
:
return
super
(
MockView
,
self
)
.
is_accessible
()
else
:
return
False
tests/test_base.py
View file @
20ce56f2
...
@@ -3,7 +3,31 @@ from nose.tools import ok_, eq_, raises
...
@@ -3,7 +3,31 @@ from nose.tools import ok_, eq_, raises
from
flask
import
Flask
from
flask
import
Flask
from
flask.ext.adminex
import
base
from
flask.ext.adminex
import
base
from
.mock
import
MockView
class
MockView
(
base
.
BaseView
):
# Various properties
allow_call
=
True
allow_access
=
True
@
base
.
expose
(
'/'
)
def
index
(
self
):
return
'Success!'
@
base
.
expose
(
'/test/'
)
def
test
(
self
):
return
self
.
render
(
'mock.html'
)
def
_handle_view
(
self
,
name
,
**
kwargs
):
if
self
.
allow_call
:
return
super
(
MockView
,
self
)
.
_handle_view
(
name
,
**
kwargs
)
else
:
return
'Failure!'
def
is_accessible
(
self
):
if
self
.
allow_access
:
return
super
(
MockView
,
self
)
.
is_accessible
()
else
:
return
False
def
test_baseview_defaults
():
def
test_baseview_defaults
():
...
...
tests/test_model.py
View file @
20ce56f2
from
nose.tools
import
eq_
,
ok_
from
flask
import
Flask
from
flask
import
Flask
from
flask.helpers
import
get_flashed_messages
from
flask.ext.adminex
import
Admin
from
flask.ext.adminex
import
Admin
from
flask.ext.adminex.model
import
base
,
filters
from
flask.ext.adminex.model
import
base
,
filters
...
@@ -7,7 +10,7 @@ from flask.ext import wtf
...
@@ -7,7 +10,7 @@ from flask.ext import wtf
class
Model
(
object
):
class
Model
(
object
):
def
__init__
(
self
,
id
=
None
,
c1
=
None
,
c2
=
None
,
c3
=
None
):
def
__init__
(
self
,
id
=
None
,
c1
=
1
,
c2
=
2
,
c3
=
3
):
self
.
id
=
id
self
.
id
=
id
self
.
col1
=
c1
self
.
col1
=
c1
self
.
col2
=
c2
self
.
col2
=
c2
...
@@ -21,54 +24,89 @@ class Form(wtf.Form):
...
@@ -21,54 +24,89 @@ class Form(wtf.Form):
class
MockModelView
(
base
.
BaseModelView
):
class
MockModelView
(
base
.
BaseModelView
):
def
__init__
(
self
,
model
,
name
=
None
,
category
=
None
,
endpoint
=
None
,
url
=
None
):
def
__init__
(
self
,
model
,
name
=
None
,
category
=
None
,
endpoint
=
None
,
url
=
None
,
**
kwargs
):
# Allow to set any attributes from parameters
for
k
,
v
in
kwargs
.
iteritems
():
setattr
(
self
,
k
,
v
)
super
(
MockModelView
,
self
)
.
__init__
(
model
,
name
,
category
,
endpoint
,
url
)
super
(
MockModelView
,
self
)
.
__init__
(
model
,
name
,
category
,
endpoint
,
url
)
self
.
created_models
=
[]
self
.
created_models
=
[]
self
.
updated_models
=
[]
self
.
updated_models
=
[]
self
.
deleted_models
=
[]
self
.
deleted_models
=
[]
self
.
search_arguments
=
[]
self
.
all_models
=
{
1
:
Model
(
1
),
2
:
Model
(
2
)}
self
.
last_id
=
3
# Scaffolding
# Scaffolding
def
scaffold_pk
(
self
):
def
scaffold_pk
(
self
):
return
'id'
return
'id'
def
scaffold_list_columns
(
self
):
def
scaffold_list_columns
(
self
):
return
[
'col1'
,
'col2'
,
'col3'
]
columns
=
[
'col1'
,
'col2'
,
'col3'
]
if
self
.
excluded_list_columns
:
return
filter
(
lambda
x
:
x
not
in
self
.
excluded_list_columns
,
columns
)
return
columns
def
init_search
(
self
):
def
init_search
(
self
):
return
True
return
bool
(
self
.
searchable_columns
)
def
scaffold_filters
(
self
):
def
scaffold_filters
(
self
):
return
None
return
None
def
scaffold_sortable_columns
(
self
):
return
[
'col1'
,
'col2'
,
'col3'
]
def
scaffold_form
(
self
):
def
scaffold_form
(
self
):
return
Form
return
Form
# Data
# Data
def
get_list
(
self
,
page
,
sort_field
,
sort_desc
,
search
,
filters
):
def
get_list
(
self
,
page
,
sort_field
,
sort_desc
,
search
,
filters
):
return
[
Model
(
1
,
2
,
3
,
4
),
Model
(
2
,
3
,
4
,
5
)]
self
.
search_arguments
.
append
((
page
,
sort_field
,
sort_desc
,
search
,
filters
))
return
len
(
self
.
all_models
),
self
.
all_models
.
itervalues
()
def
get_one
(
self
,
id
):
def
get_one
(
self
,
id
):
return
Model
(
1
,
2
,
3
,
4
)
return
self
.
all_models
.
get
(
id
)
def
create_model
(
self
,
form
):
def
create_model
(
self
,
form
):
model
=
Model
()
model
=
Model
(
self
.
last_id
)
self
.
last_id
+=
1
form
.
populate_obj
(
model
)
form
.
populate_obj
(
model
)
self
.
created_models
.
append
(
model
)
self
.
all_models
[
model
.
id
]
=
model
return
True
return
True
def
update_model
(
self
,
form
,
model
):
def
update_model
(
self
,
form
,
model
):
form
.
populate_obj
(
model
)
form
.
populate_obj
(
model
)
self
.
updated_models
.
append
(
model
)
return
True
return
True
def
delete_model
(
self
,
model
):
def
delete_model
(
self
,
model
):
self
.
deleted_models
.
append
(
model
)
return
True
return
True
def
test_mockview
():
def
setup
():
app
=
Flask
(
__name__
)
app
=
Flask
(
__name__
)
admin
=
Admin
()
app
.
config
[
'CSRF_ENABLED'
]
=
False
app
.
secret_key
=
'1'
admin
=
Admin
(
app
)
return
app
,
admin
view
=
MockView
(
Model
)
def
test_mockview
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
)
admin
.
add_view
(
view
)
admin
.
add_view
(
view
)
eq_
(
view
.
model
,
Model
)
eq_
(
view
.
model
,
Model
)
...
@@ -81,20 +119,144 @@ def test_mockview():
...
@@ -81,20 +119,144 @@ def test_mockview():
eq_
(
view
.
_sortable_columns
,
[
'col1'
,
'col2'
,
'col3'
])
eq_
(
view
.
_sortable_columns
,
[
'col1'
,
'col2'
,
'col3'
])
eq_
(
view
.
_create_form_class
,
Form
)
eq_
(
view
.
_create_form_class
,
Form
)
eq_
(
view
.
_edit_form_class
,
Form
)
eq_
(
view
.
_edit_form_class
,
Form
)
eq_
(
view
.
_search_supported
,
Tru
e
)
eq_
(
view
.
_search_supported
,
Fals
e
)
eq_
(
view
.
_filters
,
None
)
eq_
(
view
.
_filters
,
None
)
# Make some test requests
client
=
app
.
test_client
()
client
=
app
.
test_client
()
# Make model view requests
rv
=
client
.
get
(
'/admin/modelview/'
)
rv
=
client
.
get
(
'/admin/modelview/'
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'/admin/modelview/delete/1/'
in
rv
.
data
)
# Test model creation view
rv
=
client
.
get
(
'/admin/modelview/new/'
)
rv
=
client
.
get
(
'/admin/modelview/new/'
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
rv
=
client
.
get
(
'/admin/modelview/edit/0/'
)
rv
=
client
.
post
(
'/admin/modelview/new/'
,
eq_
(
rv
.
status_code
,
200
)
data
=
dict
(
col1
=
'test1'
,
col2
=
'test2'
,
col3
=
'test3'
))
eq_
(
rv
.
status_code
,
302
)
eq_
(
len
(
view
.
created_models
),
1
)
rv
=
client
.
post
(
'/admin/modelview/delete/0/'
)
model
=
view
.
created_models
.
pop
()
eq_
(
model
.
id
,
3
)
eq_
(
model
.
col1
,
'test1'
)
eq_
(
model
.
col2
,
'test2'
)
eq_
(
model
.
col3
,
'test3'
)
# Try model edit view
rv
=
client
.
get
(
'/admin/modelview/edit/3/'
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'test1'
in
rv
.
data
)
rv
=
client
.
post
(
'/admin/modelview/edit/3/'
,
data
=
dict
(
col1
=
'test!'
,
col2
=
'test@'
,
col3
=
'test#'
))
eq_
(
rv
.
status_code
,
302
)
eq_
(
len
(
view
.
updated_models
),
1
)
model
=
view
.
updated_models
.
pop
()
eq_
(
model
.
col1
,
'test!'
)
eq_
(
model
.
col2
,
'test@'
)
eq_
(
model
.
col3
,
'test#'
)
rv
=
client
.
get
(
'/admin/modelview/edit/4/'
)
eq_
(
rv
.
status_code
,
302
)
# Attempt to delete model
rv
=
client
.
post
(
'/admin/modelview/delete/3/'
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
headers
[
'location'
],
'http://localhost/admin/modelview/'
)
def
test_permissions
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
)
admin
.
add_view
(
view
)
client
=
app
.
test_client
()
view
.
can_create
=
False
rv
=
client
.
get
(
'/admin/modelview/new/'
)
eq_
(
rv
.
status_code
,
302
)
view
.
can_edit
=
False
rv
=
client
.
get
(
'/admin/modelview/edit/1/'
)
eq_
(
rv
.
status_code
,
302
)
view
.
can_delete
=
False
rv
=
client
.
post
(
'/admin/modelview/delete/1/'
)
eq_
(
rv
.
status_code
,
302
)
def
test_templates
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
)
admin
.
add_view
(
view
)
client
=
app
.
test_client
()
view
.
list_template
=
'mock.html'
view
.
create_template
=
'mock.html'
view
.
edit_template
=
'mock.html'
rv
=
client
.
get
(
'/admin/modelview/'
)
eq_
(
rv
.
data
,
'Success!'
)
rv
=
client
.
get
(
'/admin/modelview/new/'
)
eq_
(
rv
.
data
,
'Success!'
)
rv
=
client
.
get
(
'/admin/modelview/edit/1/'
)
eq_
(
rv
.
data
,
'Success!'
)
def
test_list_columns
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
,
list_columns
=
[
'col1'
,
'col3'
],
rename_columns
=
dict
(
col1
=
'Column1'
))
admin
.
add_view
(
view
)
eq_
(
len
(
view
.
_list_columns
),
2
)
eq_
(
view
.
_list_columns
,
[(
'col1'
,
'Column1'
),
(
'col3'
,
'Col3'
)])
client
=
app
.
test_client
()
rv
=
client
.
get
(
'/admin/modelview/'
)
ok_
(
'Column1'
in
rv
.
data
)
ok_
(
'Col2'
not
in
rv
.
data
)
def
test_exclude_columns
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
,
excluded_list_columns
=
[
'col2'
])
admin
.
add_view
(
view
)
eq_
(
view
.
_list_columns
,
[(
'col1'
,
'Col1'
),
(
'col3'
,
'Col3'
)])
client
=
app
.
test_client
()
rv
=
client
.
get
(
'/admin/modelview/'
)
ok_
(
'Col1'
in
rv
.
data
)
ok_
(
'Col2'
not
in
rv
.
data
)
def
test_sortable_columns
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
,
sortable_columns
=
[
'col1'
,
(
'col2'
,
'test1'
)])
admin
.
add_view
(
view
)
eq_
(
view
.
_sortable_columns
,
dict
(
col1
=
'col1'
,
col2
=
'test1'
))
def
test_searchable_columns
():
app
,
admin
=
setup
()
view
=
MockModelView
(
Model
,
searchable_columns
=
[
'col1'
,
'col2'
])
admin
.
add_view
(
view
)
eq_
(
view
.
_search_supported
,
True
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment