def test_bool_type(): flag = Item(type=Types.bool, default='yes') assert flag.default is True assert flag.value is True flag.value = 'no' assert flag.value is False assert flag.default is True flag.value = True assert flag.value is True flag.value = '1' assert flag.value is True flag.value = '0' assert flag.value is False assert Types.guess(True) == Types.bool assert Types.guess(False) == Types.bool assert Types.guess(None) == Types.not_set assert Types.guess('yes') == Types.str assert Types.guess('no') == Types.str assert Types.guess('True') == Types.str assert Types.guess('False') == Types.str
def test_bool_config_preserves_raw_str_value_used_to_set_it(): c = Item('a', type=bool, default=False) assert c.value is False assert not c.value assert c.str_value == 'False' assert c.value is False c.value = 'False' assert not c.value assert c.str_value == 'False' assert c.value is False c.value = 'no' assert not c.value assert c.str_value == 'no' assert c.value is False c.value = '0' assert not c.value assert c.str_value == '0' assert c.value is False c.value = '1' assert c.value assert c.str_value == '1' assert c.value is True c.reset() assert not c.value assert c.value is False c.value = 'yes' assert c.str_value == 'yes' assert c.value is True
def test_raw_str_value_is_reset_on_non_str_value_set(): c = Item('a', type=int, default=25) c.value = '23' assert c.str_value == '23' c.value = 25 assert c.str_value == '25' c.value = 24 assert c.str_value == '24' c.value = '22' assert c.str_value == '22'
def test_items_allows_special_attributes_to_be_prefixed_with_at_symbol_too(): s = Item(**{'@type': bool, '@value': 'no'}) assert s.type is Types.bool assert s.value is False s.value = 'yes' assert s.value is True t = Item(**{'@default': True}) assert t.type is Types.bool assert t.value is True t.value = 'no' assert t.value is False
def test_int_type(): number = Item(type=Types.int, default='55') assert number.default == 55 assert number.value == 55 assert number.str_value == '55' number.value = -55 assert number.value == -55 number.value = '-555' assert number.value == -555 assert Types.guess(5) == Types.int assert Types.guess(-5) == Types.int assert Types.guess(0) == Types.int
def test_can_set_str_value_to_none(): c = Item('a', default='haha') assert c.value == 'haha' assert c.type is Types.str c.value = None assert c.value is None
def test_item_value_can_be_unicode_str(): c = Item(default=u'Jānis Bērziņš') assert c.str_value == u'Jānis Bērziņš' c.value = u'Pēteris Liepiņš' assert c.str_value == u'Pēteris Liepiņš' assert c.default == u'Jānis Bērziņš'
def test_float_type(): rate = Item(type=Types.float, default='0.23') assert rate.default == 0.23 assert rate.value == 0.23 rate.value = '0.01' assert rate.value == 0.01 rate.value = '-0.23' assert rate.value == -0.23 assert Types.guess(0.23) == Types.float assert Types.guess(-0.23) == Types.float assert Types.guess('-0.23') is not Types.float assert Types.guess('0.23') is not Types.float
def test_bool_of_value(): c = Item('a') # not_set evaluates to False assert not c.value c.value = 'b' assert c.value c.value = '' assert not c.value d = Item('a', default='b') assert d.value d.value = '' assert not d.value
def test_value_gets_stringified(): c = Item('a', value='23') assert c.value == '23' assert c.value != 23 c.value = 24 assert c.value == '24' assert c.value != 24
def test_raw_str_value_is_reset_on_reset(): c = Item('a', type=int, default=25) assert c.str_value == '25' c.value = '23' assert c.str_value == '23' c.reset() assert c.str_value == '25'
def test_item_with_no_value_and_no_default_returns_not_set_as_value(): c = Item('a') assert c.value is not_set c.value = 'hey' assert c.value == 'hey' c.reset() assert c.value is not_set
def test_item_value_is_not_deep_copied_on_value_request(): precious_things = ['a', 'b'] c = Item(default=precious_things) c.value = ['c', 'd'] c.value.append('e') assert c.value == ['c', 'd', 'e'] assert c.default == ['a', 'b']
def test_int_value(): c = Item('a', type=int, default=25) assert c.value == 25 c.value = '23' assert c.value == 23 assert c.value != '23' c.reset() assert c.value == 25
def test_has_value_returns_true_if_value_or_default_is_set(): c = Item() assert not c.has_value c.value = '5' assert c.has_value c.reset() assert not c.has_value d = Item(default=5) assert d.has_value d.value = 6 assert d.has_value d.reset() assert d.has_value e = Item(value=8) assert e.has_value e.value = 9 assert e.has_value e.reset() assert not e.has_value
def test_is_default(): c = Item('a') d = Item('a', default=None) e = Item('a', value=None) assert c.is_default assert d.is_default assert not e.is_default c.value = 'ccc' d.value = 'ddd' e.value = 'eee' assert not c.is_default assert not d.is_default assert not e.is_default c.value = None d.value = None e.value = None assert not c.is_default assert d.is_default # this is the case when is_default is NOT the opposite of has_value assert not e.is_default c.reset() d.reset() e.reset() assert c.is_default assert d.is_default assert e.is_default
def test_item_sets_unrecognised_kwargs_as_attributes(): c = Item(help='This is help', comment='This is comment', default=5, something_random=True) c.value = 5 assert c.is_default assert c.help == 'This is help' assert c.comment == 'This is comment' assert c.something_random with pytest.raises(AttributeError): assert c.something_too_random
def test_list_type(): tags = Item(type=Types.list, default=['untitled', 'new']) assert tags.default == ['untitled', 'new'] assert tags.value == ['untitled', 'new'] # This should have no effect tags.value.append('!!!!') assert tags.default == ['untitled', 'new'] assert tags.value == ['untitled', 'new'] tags.value = ['real', 'tags', 'now'] tags.value.append('!!!!') assert tags.default == ['untitled', 'new'] assert tags.value == ['real', 'tags', 'now', '!!!!'] assert Types.guess([]) == Types.list assert Types.guess(()) == Types.list assert Types.guess([1, 2, 3]) == Types.list assert Types.guess(['1', '2', '3']) == Types.list
def test_setting_value_to_not_set_resets_it(): c = Item('a', default='default', value='custom') assert c.value == 'custom' c.value = not_set assert c.value == 'default'
def test_can_set_int_value_to_none(): c = Item('a', type=int, default=0, value=23) assert c.value == 23 c.value = None assert c.value is None
def test_bool_str_is_a_str(): c = Item('a', type=bool) assert isinstance(c.str_value, six.string_types) c.value = True assert isinstance(c.str_value, six.string_types)
def test_dict_type(): db = Item(type=Types.dict, default={ 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test', }) assert db.default == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test' } assert db.value == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test' } # This has no effect because it is working on a copy of default value db.value['password'] = '******' assert db.default == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test' } assert db.value == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test' } # But once we have a real value, then modifications are for real db.value = { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'production' } db.value['password'] = '******' assert db.default == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'test' } assert db.value == { 'user': '******', 'password': '******', 'host': 'localhost', 'db': 'production' } assert Types.guess({}) == Types.dict assert Types.guess(collections.OrderedDict()) == Types.dict
def test_repr_makes_clear_name_and_value(): c = Item('a', default='hello') assert repr(c) == '<Item a \'hello\'>' c.value = 'bye!' assert repr(c) == '<Item a \'bye!\'>'