index
:
chouette-core
0000-cr-for-5024
0000-enhanced-table-builder
0000-gemfile-multiple-nulldb-entries
0000-import_dir_in_docker
0000-post_to_json_hotfix_for_local_app
0000-proposal-through_if
0000-refactor_netex_file
0000-specs-easy-zip-setup
0000-transport-mode-validation
3126-referentials-lines--search-for-routes-by-first-and-last-stop-area-name
3479-migrate-Lines#index-table-builder-helper-to-new-table-builder
3479-table-builder-helper--fix-bug-where-decorator-links-not-rendered-if-no-link-actions-passed-to-helper
3521-workbench_output_controller
3542-referential-overview
3562_ccset_affectation
4155-ensure-new-Netex-imports-have-associated-referential-and-workbench
4401-compliance-control-ModelAttribute--address-Robert,s-comments
4431-permission-renaming
4442-api_keys-permissions-spex
4443-edit-metadata
4466-compliance_control_sets
4467_compliance_control_crud
4477-import-unzip-to-files
4516_cleanup_rule_parameter_set
4633-import-handle-incorrect-zip
4655-dashboard-controller
4658-remove-current-functional-scope
4658-remove-current_functional_scope
4663-compliance_controls_layouts
4698-table_pages_title_refactoring
4706-mofify_sub/transport_modes
4707-simplify-compliance-control-copy
4709-compliance-check-criticity-as-string
4726-breadcrumb
4727-clone-compliance-control-set
4728-hstore-presence-validation
4774-compliance_control_sets-filters
4776-compliance_controls_policy
4800-hstore-numeric-validation
4812-display_empty_compliance_control_blocks
4817-better-traduction
4820_refactoring_breadcrumb
4824-create_line_referentials
4944_remove_route_section_code
4951-spec-to-validate-that-primary-and-foreign-keys-in-the-database-are-type-bigint
4981_last_editor
4986-compliance_control_sets_fix
4987-compliance_check-sets_show
5006-wb_import_filter_refs_with_foreign_lines
5102-begin_of_association_chain
5102-verify_line-refs_org_in_controllers
5111-begin_of_association_chain
5111-verify_stop_area_org_in_controllers
5113-update-logo
5119_i18n_dashboard
5129-import-report-button
5130-del_fk_compliance_ctrl_set_in_compliance_check_sets
5137-timetable-color
5140-wb_index_show_only_collaborators
5150_decorator_policy
5156-handle-long-distance-routes
5163-5164-export-csv
5179-ref_creation_enforces_objectid_format
5197-compliance-control-set-view-spec
5198-bis-wkbch-view-spec-modal-with-js
5206-multiple-selection-refactoring
5253-truncate-breadcrumb
5281-workbench-import-structural-bug-reading-zip
5287-clean-links-in-stop-areas-index
5291-disable-useless-checkboxes-on-referentials-index
5297_fix_referential_create_validation
5299-merge-operation
5305_autocomplete_stop_area_unaccent
5307_referential_lines_menu
5311-stop-area-type-customizable
5313_stop_areas_parent
5321-remove-duplicated-field-in-new-line-form
5325-use-policies-for-calendars-sharing
5331-display-users-name
5333-add-policies-for-referentials-sharing
5334-add-nulldb-support
5336-spurious-buttons
5339-organisation-and-features
5340-deactivate-lines
5341-create-referential-vehiclejourneys-controller
5348_clickable_brandname
5349-deactivate-stop-areas
from
__future__
import
unicode_literals
from
rest_framework
import
exceptions
,
serializers
,
views
from
rest_framework.request
import
Request
from
rest_framework.test
import
APIRequestFactory
import
pytest
request
=
Request
(
APIRequestFactory
()
.
options
(
'/'
))
class
TestMetadata
:
def
test_metadata
(
self
):
"""
OPTIONS requests to views should return a valid 200 response.
"""
class
ExampleView
(
views
.
APIView
):
"""Example view."""
pass
response
=
ExampleView
()
.
options
(
request
=
request
)
expected
=
{
'name'
:
'Example'
,
'description'
:
'Example view.'
,
'renders'
:
[
'application/json'
,
'text/html'
],
'parses'
:
[
'application/json'
,
'application/x-www-form-urlencoded'
,
'multipart/form-data'
]
}
assert
response
.
status_code
==
200
assert
response
.
data
==
expected
def
test_none_metadata
(
self
):
"""
OPTIONS requests to views where `metadata_class = None` should raise
a MethodNotAllowed exception, which will result in an HTTP 405 response.
"""
class
ExampleView
(
views
.
APIView
):
metadata_class
=
None
with
pytest
.
raises
(
exceptions
.
MethodNotAllowed
):
ExampleView
()
.
options
(
request
=
request
)
def
test_actions
(
self
):
"""
On generic views OPTIONS should return an 'actions' key with metadata
on the fields that may be supplied to PUT and POST requests.
"""
class
ExampleSerializer
(
serializers
.
Serializer
):
choice_field
=
serializers
.
ChoiceField
([
'red'
,
'green'
,
'blue'
])
integer_field
=
serializers
.
IntegerField
(
max_value
=
10
)
char_field
=
serializers
.
CharField
(
required
=
False
)
class
ExampleView
(
views
.
APIView
):
"""Example view."""
def
post
(
self
,
request
):
pass
def
get_serializer
(
self
):
return
ExampleSerializer
()
response
=
ExampleView
()
.
options
(
request
=
request
)
expected
=
{
'name'
:
'Example'
,
'description'
:
'Example view.'
,
'renders'
:
[
'application/json'
,
'text/html'
],
'parses'
:
[
'application/json'
,
'application/x-www-form-urlencoded'
,
'multipart/form-data'
],
'actions'
:
{
'POST'
:
{
'choice_field'
:
{
'type'
:
'choice'
,
'required'
:
True
,
'read_only'
:
False
,
'label'
:
'Choice field'
,
'choices'
:
[
{
'display_name'
:
'red'
,
'value'
:
'red'
},
{
'display_name'
:
'green'
,
'value'
:
'green'
},
{
'display_name'
:
'blue'
,
'value'
:
'blue'
}
]
},
'integer_field'
:
{
'type'
:
'integer'
,
'required'
:
True
,
'read_only'
:
False
,
'label'
:
'Integer field'
},
'char_field'
:
{
'type'
:
'string'
,
'required'
:
False
,
'read_only'
:
False
,
'label'
:
'Char field'
}
}
}
}
assert
response
.
status_code
==
200
assert
response
.
data
==
expected
def
test_global_permissions
(
self
):
"""
If a user does not have global permissions on an action, then any
metadata associated with it should not be included in OPTION responses.
"""
class
ExampleSerializer
(
serializers
.
Serializer
):
choice_field
=
serializers
.
ChoiceField
([
'red'
,
'green'
,
'blue'
])
integer_field
=
serializers
.
IntegerField
(
max_value
=
10
)
char_field
=
serializers
.
CharField
(
required
=
False
)
class
ExampleView
(
views
.
APIView
):
"""Example view."""
def
post
(
self
,
request
):
pass
def
put
(
self
,
request
):
pass
def
get_serializer
(
self
):
return
ExampleSerializer
()
def
check_permissions
(
self
,
request
):
if
request
.
method
==
'POST'
:
raise
exceptions
.
PermissionDenied
()
response
=
ExampleView
()
.
options
(
request
=
request
)
assert
response
.
status_code
==
200
assert
list
(
response
.
data
[
'actions'
]
.
keys
())
==
[
'PUT'
]
def
test_object_permissions
(
self
):
"""
If a user does not have object permissions on an action, then any
metadata associated with it should not be included in OPTION responses.
"""
class
ExampleSerializer
(
serializers
.
Serializer
):
choice_field
=
serializers
.
ChoiceField
([
'red'
,
'green'
,
'blue'
])
integer_field
=
serializers
.
IntegerField
(
max_value
=
10
)
char_field
=
serializers
.
CharField
(
required
=
False
)
class
ExampleView
(
views
.
APIView
):
"""Example view."""
def
post
(
self
,
request
):
pass
def
put
(
self
,
request
):
pass
def
get_serializer
(
self
):
return
ExampleSerializer
()
def
get_object
(
self
):
if
self
.
request
.
method
==
'PUT'
:
raise
exceptions
.
PermissionDenied
()
response
=
ExampleView
()
.
options
(
request
=
request
)
assert
response
.
status_code
==
200
assert
list
(
response
.
data
[
'actions'
]
.
keys
())
==
[
'POST'
]