def test_key_value_field(): from model_helpers import KeyValueContainer team = Team(name="Team1") test.assert_equal(team.options, {}) team.options = "name = Ramast" test.assert_equal(team.options, {"name": "Ramast"}) test.assert_equal(str(team.options), "name = Ramast\n") team.options = KeyValueContainer(Age=30) test.assert_equal(str(team.options), "Age = 30\n") # Notice int has been converted to string since we don't store value data type test.assert_equal(team.options, {"Age": "30"}) team.options.update({"Name": "Ramast"}) # Output should be # Name = Ramast # Age = 30 # but since dictionary doesn't maintain order, I can't predict which oe of the two lines will show first test.assert_in("Age = 30", str(team.options)) test.assert_in("Name = Ramast", str(team.options)) # Test invalid string try: team.options = "Name ?? Ramast" assert False, "Assigning invalid string should raise ValidationError" except ValidationError: pass
def test_custom_key_value_separator(): team = Team(name="Team2") # Modify option field's separator pragmatically for this test case # Of course you should just define it in the model's field definition # options = KeyValueField(sep=":") options_field = filter(lambda field: field.name == "options", team._meta.fields)[0] options_field.separator = ":" # Test invalid string try: team.options = "Name = Ramast" assert False, "Assigning invalid string should raise ValidationError" except ValidationError: pass # Now use the new separator team.options = "Name : Ramast" test.assert_equal(team.options, {"Name": "Ramast"})