def test_mixin_field_access(): field_data = DictFieldData({ 'field_a': 5, 'field_x': [1, 2, 3], }) runtime = TestRuntime(Mock(), mixins=[TestSimpleMixin], services={'field-data': field_data}) field_tester = runtime.construct_xblock_from_class(FieldTester, Mock()) assert field_tester.field_a == 5 assert field_tester.field_b == 10 assert field_tester.field_c == 42 assert field_tester.field_x == [1, 2, 3] assert field_tester.field_y == 'default_value' field_tester.field_x = ['a', 'b'] field_tester.save() assert ['a', 'b'] == field_tester._field_data.get(field_tester, 'field_x') del field_tester.field_x assert [] == field_tester.field_x assert [1, 2, 3] == field_tester.field_x_with_default with pytest.raises(AttributeError): getattr(field_tester, 'field_z') with pytest.raises(AttributeError): delattr(field_tester, 'field_z') field_tester.field_z = 'foo' assert field_tester.field_z == 'foo' assert not field_tester._field_data.has(field_tester, 'field_z')
def test_mixin_field_access(): field_data = DictFieldData({ 'field_a': 5, 'field_x': [1, 2, 3], }) runtime = TestRuntime(Mock(), mixins=[TestSimpleMixin], services={'field-data': field_data}) field_tester = runtime.construct_xblock_from_class(FieldTester, Mock()) assert_equals(5, field_tester.field_a) assert_equals(10, field_tester.field_b) assert_equals(42, field_tester.field_c) assert_equals([1, 2, 3], field_tester.field_x) assert_equals('default_value', field_tester.field_y) field_tester.field_x = ['a', 'b'] field_tester.save() assert_equals(['a', 'b'], field_tester._field_data.get(field_tester, 'field_x')) del field_tester.field_x assert_equals([], field_tester.field_x) assert_equals([1, 2, 3], field_tester.field_x_with_default) with assert_raises(AttributeError): getattr(field_tester, 'field_z') with assert_raises(AttributeError): delattr(field_tester, 'field_z') field_tester.field_z = 'foo' assert_equals('foo', field_tester.field_z) assert_false(field_tester._field_data.has(field_tester, 'field_z'))
def test_mixin_field_access(): field_data = DictFieldData({ 'field_a': 5, 'field_x': [1, 2, 3], }) runtime = TestRuntime(Mock(), mixins=[TestSimpleMixin], services={'field-data': field_data}) field_tester = runtime.construct_xblock_from_class(FieldTester, Mock()) assert_equals(5, field_tester.field_a) assert_equals(10, field_tester.field_b) assert_equals(42, field_tester.field_c) assert_equals([1, 2, 3], field_tester.field_x) assert_equals('default_value', field_tester.field_y) field_tester.field_x = ['a', 'b'] field_tester.save() assert_equals(['a', 'b'], field_tester._field_data.get(field_tester, 'field_x')) del field_tester.field_x assert_equals([], field_tester.field_x) assert_equals([1, 2, 3], field_tester.field_x_with_default) with assert_raises(AttributeError): getattr(field_tester, 'field_z') with assert_raises(AttributeError): delattr(field_tester, 'field_z') field_tester.field_z = 'foo' assert_equals('foo', field_tester.field_z) assert_false(field_tester._field_data.has(field_tester, 'field_z'))
def test_db_model_keys(): # Tests that updates to fields are properly recorded in the KeyValueStore, # and that the keys have been constructed correctly key_store = DictKeyValueStore() field_data = KvsFieldData(key_store) runtime = TestRuntime(Mock(), mixins=[TestMixin], services={'field-data': field_data}) tester = runtime.construct_xblock_from_class(TestXBlock, ScopeIds('s0', 'TestXBlock', 'd0', 'u0')) assert not field_data.has(tester, 'not a field') for field in six.itervalues(tester.fields): new_value = 'new ' + field.name assert not field_data.has(tester, field.name) if isinstance(field, List): new_value = [new_value] setattr(tester, field.name, new_value) # Write out the values tester.save() # Make sure everything saved correctly for field in six.itervalues(tester.fields): assert field_data.has(tester, field.name) def get_key_value(scope, user_id, block_scope_id, field_name): """Gets the value, from `key_store`, of a Key with the given values.""" new_key = KeyValueStore.Key(scope, user_id, block_scope_id, field_name) return key_store.db_dict[new_key] # Examine each value in the database and ensure that keys were constructed correctly assert get_key_value(Scope.content, None, 'd0', 'content') == 'new content' assert get_key_value(Scope.settings, None, 'u0', 'settings') == 'new settings' assert get_key_value(Scope.user_state, 's0', 'u0', 'user_state') == 'new user_state' assert get_key_value(Scope.preferences, 's0', 'TestXBlock', 'preferences') == 'new preferences' assert get_key_value(Scope.user_info, 's0', None, 'user_info') == 'new user_info' assert get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, 'TestXBlock', 'by_type') == 'new by_type' assert get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, 'for_all') == 'new for_all' assert get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), 's0', 'd0', 'user_def') == 'new user_def' assert get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, 'agg_global') == 'new agg_global' assert get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, 'TestXBlock', 'agg_type') == 'new agg_type' assert get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, 'd0', 'agg_def') == 'new agg_def' assert get_key_value(Scope.user_state_summary, None, 'u0', 'agg_usage') == 'new agg_usage' assert get_key_value(Scope.content, None, 'd0', 'mixin_content') == 'new mixin_content' assert get_key_value(Scope.settings, None, 'u0', 'mixin_settings') == 'new mixin_settings' assert get_key_value(Scope.user_state, 's0', 'u0', 'mixin_user_state') == 'new mixin_user_state' assert get_key_value(Scope.preferences, 's0', 'TestXBlock', 'mixin_preferences') == 'new mixin_preferences' assert get_key_value(Scope.user_info, 's0', None, 'mixin_user_info') == 'new mixin_user_info' assert get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, 'TestXBlock', 'mixin_by_type') == \ 'new mixin_by_type' assert get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, 'mixin_for_all') == \ 'new mixin_for_all' assert get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), 's0', 'd0', 'mixin_user_def') == \ 'new mixin_user_def' assert get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, 'mixin_agg_global') == \ 'new mixin_agg_global' assert get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, 'TestXBlock', 'mixin_agg_type') == \ 'new mixin_agg_type' assert get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, 'd0', 'mixin_agg_def') == \ 'new mixin_agg_def' assert get_key_value(Scope.user_state_summary, None, 'u0', 'mixin_agg_usage') == 'new mixin_agg_usage'
def test_lazy_translation(self): with warnings.catch_warnings(record=True) as caught_warnings: warnings.simplefilter('always', FailingEnforceTypeWarning) class XBlockTest(XBlock): """ Set up a class that contains a single string field with a translated default. """ STR_DEFAULT_ENG = 'ENG: String to be translated' str_field = String(scope=Scope.settings, default=_('ENG: String to be translated')) # No FailingEnforceTypeWarning should have been triggered assert not caught_warnings # Construct a runtime and an XBlock using it. key_store = DictKeyValueStore() field_data = KvsFieldData(key_store) runtime = TestRuntime(Mock(), services={'field-data': field_data}) # Change language to 'de'. user_language = 'de' with translation.override(user_language): tester = runtime.construct_xblock_from_class(XBlockTest, ScopeIds('s0', 'XBlockTest', 'd0', 'u0')) # Assert instantiated XBlock str_field value is not yet evaluated. assert 'django.utils.functional.' in str(type(tester.str_field)) # Assert str_field *is* translated when the value is used. assert text_type(tester.str_field) == 'DEU: Translated string'
def test_lazy_translation(self): with warnings.catch_warnings(record=True) as caught_warnings: warnings.simplefilter('always', FailingEnforceTypeWarning) class XBlockTest(XBlock): """ Set up a class that contains a single string field with a translated default. """ STR_DEFAULT_ENG = 'ENG: String to be translated' str_field = String(scope=Scope.settings, default=_('ENG: String to be translated')) # No FailingEnforceTypeWarning should have been triggered assert not caught_warnings # Construct a runtime and an XBlock using it. key_store = DictKeyValueStore() field_data = KvsFieldData(key_store) runtime = TestRuntime(Mock(), services={'field-data': field_data}) # Change language to 'de'. user_language = 'de' with translation.override(user_language): tester = runtime.construct_xblock_from_class(XBlockTest, ScopeIds('s0', 'XBlockTest', 'd0', 'u0')) # Assert instantiated XBlock str_field value is not yet evaluated. assert 'django.utils.functional.' in str(type(tester.str_field)) # Assert str_field *is* translated when the value is used. assert text_type(tester.str_field) == 'DEU: Translated string'
def test_mixin_field_access(): field_data = DictFieldData({ 'field_a': 5, 'field_x': [1, 2, 3], }) runtime = TestRuntime(Mock(), mixins=[TestSimpleMixin], services={'field-data': field_data}) field_tester = runtime.construct_xblock_from_class(FieldTester, Mock()) assert field_tester.field_a == 5 assert field_tester.field_b == 10 assert field_tester.field_c == 42 assert field_tester.field_x == [1, 2, 3] assert field_tester.field_y == 'default_value' field_tester.field_x = ['a', 'b'] field_tester.save() assert ['a', 'b'] == field_tester._field_data.get(field_tester, 'field_x') del field_tester.field_x assert [] == field_tester.field_x assert [1, 2, 3] == field_tester.field_x_with_default with pytest.raises(AttributeError): getattr(field_tester, 'field_z') with pytest.raises(AttributeError): delattr(field_tester, 'field_z') field_tester.field_z = 'foo' assert field_tester.field_z == 'foo' assert not field_tester._field_data.has(field_tester, 'field_z')
def test_db_model_keys(): # Tests that updates to fields are properly recorded in the KeyValueStore, # and that the keys have been constructed correctly key_store = DictKeyValueStore() field_data = KvsFieldData(key_store) runtime = TestRuntime(Mock(), mixins=[TestMixin], services={'field-data': field_data}) tester = runtime.construct_xblock_from_class(TestXBlock, ScopeIds('s0', 'TestXBlock', 'd0', 'u0')) assert not field_data.has(tester, 'not a field') for field in six.itervalues(tester.fields): new_value = 'new ' + field.name assert not field_data.has(tester, field.name) if isinstance(field, List): new_value = [new_value] setattr(tester, field.name, new_value) # Write out the values tester.save() # Make sure everything saved correctly for field in six.itervalues(tester.fields): assert field_data.has(tester, field.name) def get_key_value(scope, user_id, block_scope_id, field_name): """Gets the value, from `key_store`, of a Key with the given values.""" new_key = KeyValueStore.Key(scope, user_id, block_scope_id, field_name) return key_store.db_dict[new_key] # Examine each value in the database and ensure that keys were constructed correctly assert get_key_value(Scope.content, None, 'd0', 'content') == 'new content' assert get_key_value(Scope.settings, None, 'u0', 'settings') == 'new settings' assert get_key_value(Scope.user_state, 's0', 'u0', 'user_state') == 'new user_state' assert get_key_value(Scope.preferences, 's0', 'TestXBlock', 'preferences') == 'new preferences' assert get_key_value(Scope.user_info, 's0', None, 'user_info') == 'new user_info' assert get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, 'TestXBlock', 'by_type') == 'new by_type' assert get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, 'for_all') == 'new for_all' assert get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), 's0', 'd0', 'user_def') == 'new user_def' assert get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, 'agg_global') == 'new agg_global' assert get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, 'TestXBlock', 'agg_type') == 'new agg_type' assert get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, 'd0', 'agg_def') == 'new agg_def' assert get_key_value(Scope.user_state_summary, None, 'u0', 'agg_usage') == 'new agg_usage' assert get_key_value(Scope.content, None, 'd0', 'mixin_content') == 'new mixin_content' assert get_key_value(Scope.settings, None, 'u0', 'mixin_settings') == 'new mixin_settings' assert get_key_value(Scope.user_state, 's0', 'u0', 'mixin_user_state') == 'new mixin_user_state' assert get_key_value(Scope.preferences, 's0', 'TestXBlock', 'mixin_preferences') == 'new mixin_preferences' assert get_key_value(Scope.user_info, 's0', None, 'mixin_user_info') == 'new mixin_user_info' assert get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, 'TestXBlock', 'mixin_by_type') == \ 'new mixin_by_type' assert get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, 'mixin_for_all') == \ 'new mixin_for_all' assert get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), 's0', 'd0', 'mixin_user_def') == \ 'new mixin_user_def' assert get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, 'mixin_agg_global') == \ 'new mixin_agg_global' assert get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, 'TestXBlock', 'mixin_agg_type') == \ 'new mixin_agg_type' assert get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, 'd0', 'mixin_agg_def') == \ 'new mixin_agg_def' assert get_key_value(Scope.user_state_summary, None, 'u0', 'mixin_agg_usage') == 'new mixin_agg_usage'
def test_mixin_field_access(): field_data = DictFieldData({"field_a": 5, "field_x": [1, 2, 3]}) runtime = TestRuntime(Mock(), mixins=[TestSimpleMixin], services={"field-data": field_data}) field_tester = runtime.construct_xblock_from_class(FieldTester, Mock()) assert_equals(5, field_tester.field_a) assert_equals(10, field_tester.field_b) assert_equals(42, field_tester.field_c) assert_equals([1, 2, 3], field_tester.field_x) assert_equals("default_value", field_tester.field_y) field_tester.field_x = ["a", "b"] field_tester.save() assert_equals(["a", "b"], field_tester._field_data.get(field_tester, "field_x")) del field_tester.field_x assert_equals([], field_tester.field_x) assert_equals([1, 2, 3], field_tester.field_x_with_default) with assert_raises(AttributeError): getattr(field_tester, "field_z") with assert_raises(AttributeError): delattr(field_tester, "field_z") field_tester.field_z = "foo" assert_equals("foo", field_tester.field_z) assert_false(field_tester._field_data.has(field_tester, "field_z"))
def setUp(self): """ Create a test xblock with mock runtime. """ runtime = TestRuntime(Mock(entry_point=XBlock.entry_point), mixins=[InheritanceMixin], services={'field-data': {}}) self.xblock = runtime.construct_xblock_from_class( TestXBlock, ScopeIds('user', 'TestXBlock', 'def_id', 'usage_id')) super().setUp()
def test_db_model_keys(): # Tests that updates to fields are properly recorded in the KeyValueStore, # and that the keys have been constructed correctly key_store = DictKeyValueStore() field_data = KvsFieldData(key_store) runtime = TestRuntime(Mock(), mixins=[TestMixin], services={"field-data": field_data}) tester = runtime.construct_xblock_from_class(TestXBlock, ScopeIds("s0", "TestXBlock", "d0", "u0")) assert_false(field_data.has(tester, "not a field")) for field in tester.fields.values(): new_value = "new " + field.name assert_false(field_data.has(tester, field.name)) if isinstance(field, List): new_value = [new_value] setattr(tester, field.name, new_value) # Write out the values tester.save() # Make sure everything saved correctly for field in tester.fields.values(): assert_true(field_data.has(tester, field.name)) def get_key_value(scope, user_id, block_scope_id, field_name): """Gets the value, from `key_store`, of a Key with the given values.""" new_key = KeyValueStore.Key(scope, user_id, block_scope_id, field_name) return key_store.db_dict[new_key] # Examine each value in the database and ensure that keys were constructed correctly assert_equals("new content", get_key_value(Scope.content, None, "d0", "content")) assert_equals("new settings", get_key_value(Scope.settings, None, "u0", "settings")) assert_equals("new user_state", get_key_value(Scope.user_state, "s0", "u0", "user_state")) assert_equals("new preferences", get_key_value(Scope.preferences, "s0", "TestXBlock", "preferences")) assert_equals("new user_info", get_key_value(Scope.user_info, "s0", None, "user_info")) assert_equals("new by_type", get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, "TestXBlock", "by_type")) assert_equals("new for_all", get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, "for_all")) assert_equals("new user_def", get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), "s0", "d0", "user_def")) assert_equals("new agg_global", get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, "agg_global")) assert_equals("new agg_type", get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, "TestXBlock", "agg_type")) assert_equals("new agg_def", get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, "d0", "agg_def")) assert_equals("new agg_usage", get_key_value(Scope.user_state_summary, None, "u0", "agg_usage")) assert_equals("new mixin_content", get_key_value(Scope.content, None, "d0", "mixin_content")) assert_equals("new mixin_settings", get_key_value(Scope.settings, None, "u0", "mixin_settings")) assert_equals("new mixin_user_state", get_key_value(Scope.user_state, "s0", "u0", "mixin_user_state")) assert_equals("new mixin_preferences", get_key_value(Scope.preferences, "s0", "TestXBlock", "mixin_preferences")) assert_equals("new mixin_user_info", get_key_value(Scope.user_info, "s0", None, "mixin_user_info")) assert_equals( "new mixin_by_type", get_key_value(Scope(UserScope.NONE, BlockScope.TYPE), None, "TestXBlock", "mixin_by_type") ) assert_equals( "new mixin_for_all", get_key_value(Scope(UserScope.NONE, BlockScope.ALL), None, None, "mixin_for_all") ) assert_equals( "new mixin_user_def", get_key_value(Scope(UserScope.ONE, BlockScope.DEFINITION), "s0", "d0", "mixin_user_def") ) assert_equals( "new mixin_agg_global", get_key_value(Scope(UserScope.ALL, BlockScope.ALL), None, None, "mixin_agg_global") ) assert_equals( "new mixin_agg_type", get_key_value(Scope(UserScope.ALL, BlockScope.TYPE), None, "TestXBlock", "mixin_agg_type") ) assert_equals( "new mixin_agg_def", get_key_value(Scope(UserScope.ALL, BlockScope.DEFINITION), None, "d0", "mixin_agg_def") ) assert_equals("new mixin_agg_usage", get_key_value(Scope.user_state_summary, None, "u0", "mixin_agg_usage"))