Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
fa1dfd71
Commit
fa1dfd71
authored
May 15, 2013
by
cahrens
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update unit test for editable_metadata_fields.
parent
d35b2903
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
76 additions
and
20 deletions
+76
-20
common/lib/xmodule/xmodule/tests/test_xml_module.py
+71
-15
common/lib/xmodule/xmodule/x_module.py
+5
-5
No files found.
common/lib/xmodule/xmodule/tests/test_xml_module.py
View file @
fa1dfd71
from
xmodule.x_module
import
XModuleFields
from
xblock.core
import
Scope
,
String
,
Object
from
xmodule.fields
import
Date
,
StringyInteger
from
xblock.core
import
Scope
,
String
,
Object
,
Boolean
from
xmodule.fields
import
Date
,
StringyInteger
,
StringyFloat
from
xmodule.xml_module
import
XmlDescriptor
import
unittest
from
.
import
test_system
from
mock
import
Mock
class
CrazyJsonString
(
String
):
def
to_json
(
self
,
value
):
return
value
+
" JSON"
class
TestFields
(
object
):
# Will be returned by editable_metadata_fields.
max_attempts
=
StringyInteger
(
scope
=
Scope
.
settings
,
default
=
1000
)
max_attempts
=
StringyInteger
(
scope
=
Scope
.
settings
,
default
=
1000
,
values
=
{
'min'
:
1
,
'max'
:
10
}
)
# Will not be returned by editable_metadata_fields because filtered out by non_editable_metadata_fields.
due
=
Date
(
scope
=
Scope
.
settings
)
# Will not be returned by editable_metadata_fields because is not Scope.settings.
student_answers
=
Object
(
scope
=
Scope
.
user_state
)
# Will be returned, and can override the inherited value from XModule.
display_name
=
String
(
scope
=
Scope
.
settings
,
default
=
'local default'
)
display_name
=
String
(
scope
=
Scope
.
settings
,
default
=
'local default'
,
display_name
=
'Local Display Name'
,
help
=
'local help'
)
# Used for testing select type, effect of to_json method
string_select
=
CrazyJsonString
(
scope
=
Scope
.
settings
,
default
=
'default value'
,
values
=
[{
'display_name'
:
'first'
,
'value'
:
'value a'
},
{
'display_name'
:
'second'
,
'value'
:
'value b'
}])
# Used for testing select type
float_select
=
StringyFloat
(
scope
=
Scope
.
settings
,
default
=.
999
,
values
=
[
1.23
,
0.98
])
# Used for testing float type
float_non_select
=
StringyFloat
(
scope
=
Scope
.
settings
,
default
=.
999
,
values
=
{
'min'
:
0
,
'step'
:
.
3
})
# Used for testing that Booleans get mapped to select type
# TODO: move default value into xblock!
boolean_select
=
Boolean
(
scope
=
Scope
.
settings
,
values
=
[{
'display_name'
:
"True"
,
"value"
:
True
},
{
'display_name'
:
"False"
,
"value"
:
False
}])
class
EditableMetadataFieldsTest
(
unittest
.
TestCase
):
...
...
@@ -34,18 +52,20 @@ class EditableMetadataFieldsTest(unittest.TestCase):
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
XModuleFields
.
display_name
,
explicitly_set
=
True
,
inheritable
=
False
,
value
=
'foo'
,
default_value
=
None
)
def
test_
additional
_field
(
self
):
def
test_
integer
_field
(
self
):
descriptor
=
self
.
get_descriptor
({
'max_attempts'
:
'7'
})
editable_fields
=
descriptor
.
editable_metadata_fields
self
.
assertEqual
(
2
,
len
(
editable_fields
))
self
.
assertEqual
(
6
,
len
(
editable_fields
))
self
.
assert_field_values
(
editable_fields
,
'max_attempts'
,
TestFields
.
max_attempts
,
explicitly_set
=
True
,
inheritable
=
False
,
value
=
7
,
default_value
=
1000
)
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
XModuleFields
.
display_name
,
explicitly_set
=
True
,
inheritable
=
False
,
value
=
7
,
default_value
=
1000
,
type
=
'Integer'
,
options
=
TestFields
.
max_attempts
.
values
)
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
TestFields
.
display_name
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=
'local default'
,
default_value
=
'local default'
)
editable_fields
=
self
.
get_descriptor
({})
.
editable_metadata_fields
self
.
assert_field_values
(
editable_fields
,
'max_attempts'
,
TestFields
.
max_attempts
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=
1000
,
default_value
=
1000
)
explicitly_set
=
False
,
inheritable
=
False
,
value
=
1000
,
default_value
=
1000
,
type
=
'Integer'
,
options
=
TestFields
.
max_attempts
.
values
)
def
test_inherited_field
(
self
):
model_val
=
{
'display_name'
:
'inherited'
}
...
...
@@ -54,7 +74,7 @@ class EditableMetadataFieldsTest(unittest.TestCase):
descriptor
.
_inherited_metadata
=
model_val
descriptor
.
_inheritable_metadata
=
model_val
editable_fields
=
descriptor
.
editable_metadata_fields
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
XModule
Fields
.
display_name
,
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
Test
Fields
.
display_name
,
explicitly_set
=
False
,
inheritable
=
True
,
value
=
'inherited'
,
default_value
=
'inherited'
)
descriptor
=
self
.
get_descriptor
({
'display_name'
:
'explicit'
})
...
...
@@ -62,9 +82,36 @@ class EditableMetadataFieldsTest(unittest.TestCase):
descriptor
.
_inheritable_metadata
=
{
'display_name'
:
'inheritable value'
}
descriptor
.
_inherited_metadata
=
{}
editable_fields
=
descriptor
.
editable_metadata_fields
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
XModule
Fields
.
display_name
,
self
.
assert_field_values
(
editable_fields
,
'display_name'
,
Test
Fields
.
display_name
,
explicitly_set
=
True
,
inheritable
=
True
,
value
=
'explicit'
,
default_value
=
'inheritable value'
)
def
test_type_and_options
(
self
):
# test_display_name_field verifies that a String field is of type "Generic".
# test_integer_field verifies that a StringyInteger field is of type "Integer".
descriptor
=
self
.
get_descriptor
({})
editable_fields
=
descriptor
.
editable_metadata_fields
# Tests for select
self
.
assert_field_values
(
editable_fields
,
'string_select'
,
TestFields
.
string_select
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=
'default value'
,
default_value
=
'default value'
,
type
=
'Select'
,
options
=
[{
'display_name'
:
'first'
,
'value'
:
'value a JSON'
},
{
'display_name'
:
'second'
,
'value'
:
'value b JSON'
}])
self
.
assert_field_values
(
editable_fields
,
'float_select'
,
TestFields
.
float_select
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=.
999
,
default_value
=.
999
,
type
=
'Select'
,
options
=
[
1.23
,
0.98
])
self
.
assert_field_values
(
editable_fields
,
'boolean_select'
,
TestFields
.
boolean_select
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=
None
,
default_value
=
None
,
type
=
'Select'
,
options
=
[{
'display_name'
:
"True"
,
"value"
:
True
},
{
'display_name'
:
"False"
,
"value"
:
False
}])
# Test for float
self
.
assert_field_values
(
editable_fields
,
'float_non_select'
,
TestFields
.
float_non_select
,
explicitly_set
=
False
,
inheritable
=
False
,
value
=.
999
,
default_value
=.
999
,
type
=
'Float'
,
options
=
{
'min'
:
0
,
'step'
:
.
3
})
# Start of helper methods
def
get_xml_editable_fields
(
self
,
model_data
):
system
=
test_system
()
...
...
@@ -84,10 +131,19 @@ class EditableMetadataFieldsTest(unittest.TestCase):
system
.
render_template
=
Mock
(
return_value
=
"<div>Test Template HTML</div>"
)
return
TestModuleDescriptor
(
system
=
system
,
location
=
None
,
model_data
=
model_data
)
def
assert_field_values
(
self
,
editable_fields
,
name
,
field
,
explicitly_set
,
inheritable
,
value
,
default_value
):
def
assert_field_values
(
self
,
editable_fields
,
name
,
field
,
explicitly_set
,
inheritable
,
value
,
default_value
,
type
=
'Generic'
,
options
=
[]):
test_field
=
editable_fields
[
name
]
self
.
assertEqual
(
field
,
test_field
[
'field'
])
self
.
assertEqual
(
field
.
name
,
test_field
[
'field_name'
])
self
.
assertEqual
(
field
.
display_name
,
test_field
[
'display_name'
])
self
.
assertEqual
(
field
.
help
,
test_field
[
'help'
])
self
.
assertEqual
(
field
.
to_json
(
value
),
test_field
[
'value'
])
self
.
assertEqual
(
field
.
to_json
(
default_value
),
test_field
[
'default_value'
])
self
.
assertEqual
(
options
,
test_field
[
'options'
])
self
.
assertEqual
(
type
,
test_field
[
'type'
])
self
.
assertEqual
(
explicitly_set
,
test_field
[
'explicitly_set'
])
self
.
assertEqual
(
inheritable
,
test_field
[
'inheritable'
])
self
.
assertEqual
(
value
,
test_field
[
'value'
])
self
.
assertEqual
(
default_value
,
test_field
[
'default_value'
])
common/lib/xmodule/xmodule/x_module.py
View file @
fa1dfd71
import
logging
import
copy
import
yaml
import
os
...
...
@@ -644,17 +645,16 @@ class XModuleDescriptor(XModuleFields, HTMLSnippet, ResourceTemplates, XBlock):
# We support the following editors:
# 1. A select editor for fields with a list of possible values (includes Booleans).
# 2. Number editor for integers and floats.
# 2. Number editor
s
for integers and floats.
# 3. A generic string editor for anything else (editing JSON representation of the value).
type
=
"Generic"
# TODO: test all this logic
values
=
[]
if
field
.
values
is
None
else
field
.
values
values
=
[]
if
field
.
values
is
None
else
copy
.
deepcopy
(
field
.
values
)
if
isinstance
(
values
,
list
):
if
len
(
values
)
>
0
:
type
=
"Select"
for
index
,
choice
in
enumerate
(
values
):
json_choice
=
c
hoice
if
hasattr
(
json_choice
,
'value'
)
:
json_choice
=
c
opy
.
deepcopy
(
choice
)
if
isinstance
(
json_choice
,
dict
)
and
'value'
in
json_choice
:
json_choice
[
'value'
]
=
field
.
to_json
(
json_choice
[
'value'
])
else
:
json_choice
=
field
.
to_json
(
json_choice
)
...
...
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