Ejemplo n.º 1
0
 def plugin(self):
     self.sh = MockSmartHome()
     self.sh.with_items_from(common.BASE +
                             '/plugins/database/tests/test_items.conf')
     plugin = Database(self.sh, 'sqlite3', {'database': ':memory:'})
     for item in self.sh.return_items():
         plugin.parse_item(item)
     return plugin
Ejemplo n.º 2
0
    def test_module_is_registered1(self):
        logger.warning('')
        logger.warning('=== Begin Module Tests:')
        
        self.sh = MockSmartHome()
        self.modules = self.sh.with_modules_from(common.BASE + "/tests/resources/module")
        self.assertIsNotNone(self.sh.modules.get_module("dummy"))    # Test module is not registered
        self.assertIsNone(self.sh.modules.get_module("dummyX"))      # Test module ist not registered
        self.assertEqual(self.sh.modules.return_modules(),['dummy']) # Test modules loaded
        self.assertIsNone(self.sh.modules.get_module("faulty"))      # Test module ist not registered
 
        logger.warning('=== End Module Tests')
Ejemplo n.º 3
0
class TestModule(unittest.TestCase):

    def test_module_is_registered1(self):
        logger.warning('')
        logger.warning('=== Begin Module Tests:')
        
        self.sh = MockSmartHome()
        self.modules = self.sh.with_modules_from(common.BASE + "/tests/resources/module")
        self.assertIsNotNone(self.sh.get_module("dummy"))    # Test module is not registered
        self.assertIsNone(self.sh.get_module("dummyX"))      # Test module ist not registered
        self.assertEqual(self.sh.return_modules(),['dummy']) # Test modules loaded
        self.assertIsNone(self.sh.get_module("faulty"))      # Test module ist not registered
 
        logger.warning('=== End Module Tests')
Ejemplo n.º 4
0
    def test_last_prev_change(self):
        import datetime
        import time
        sh = MockSmartHome()
        conf = {'type': 'num'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        sec1 = datetime.datetime.now().time().second
        self.assertEqual(sec1, item.last_change().time().second)
        time.sleep(2)
        item(12)
        self.assertEqual(datetime.datetime.now().time().second,
                         item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)
        self.assertEqual(datetime.datetime.now().time().second,
                         item.last_change().time().second)
        sec2 = datetime.datetime.now().time().second
        time.sleep(2)

        item(12)
        self.assertEqual(sec2, item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)

        sec3 = datetime.datetime.now().time().second
        item(23)
        self.assertEqual(sec3, item.last_change().time().second)
Ejemplo n.º 5
0
    def test_jsonvars(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item.set('42')

        self.assertDictEqual(item.jsonvars(),{'attributes': {}, 'value': 42, 'type': 'num', 'children': [], 'id': 'test_item01', 'name': 'test_item01'})
Ejemplo n.º 6
0
    def test_fadejob(self):
        #(item, dest, step, delta):
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01' )
        item = self.create_item(smarthome=sh,
                                parent=sh,
                                path='test_item01',
                                config=conf)
        logger.warning("test_fadejob: item={}".format(item))
        item(10)

        item._fading = True
        self.item_fadejob(item, 0, 5, 1)
        self.assertEqual(10, item._value)

        item._fading = False
        self.item_fadejob(item, 0, 5, 0.1)
        self.assertEqual(0, item._value)

        self.item_fadejob(item, 10, 5, 0.1)
        self.assertEqual(10, item._value)

        self.item_fadejob(item, 100, 200, 1)
        self.assertEqual(100, item._value)
Ejemplo n.º 7
0
 def test_type(self):
     sh = MockSmartHome()
     conf = {'type': 'num', 'eval': '2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     self.assertEqual(item.type(), 'num')
     item._type= 'foo'
     self.assertNotEqual(item.type(), 'num')
     self.assertEqual(item.type(), 'foo')
Ejemplo n.º 8
0
 def test_to_json(self):
     import json
     sh = MockSmartHome()
     conf = {'type': 'num', 'eval': '2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     item.set('42')
     expected = json.dumps({'attributes': {}, 'value': 42, 'type': 'num', 'children': [], 'id': 'test_item01', 'name': 'test_item01'}, sort_keys=True, indent=2)
     self.assertEqual(item.to_json(), expected)
Ejemplo n.º 9
0
 def test_run_eval(self):
     sh = MockSmartHome()
     conf = {'type': 'num', 'eval': '2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     item._Item__run_eval()
     self.assertEqual(2,item())
     item._eval = 'bla'
     item._Item__run_eval()
     item._eval = 'sh.return_none()'
     item._Item__run_eval()
Ejemplo n.º 10
0
class MockBackendServer():
    _sh = MockSmartHome()

    def __init__(self):
        self._sh.with_items_from(common.BASE + "/tests/resources/blockly_items.conf")

        # HACK: Make tests work! Backend accesses private field _logic_dir
        # directly instead of using a method (the field was remove in the
        # meantime). Setting this just to make it work again.
        self._sh._logic_dir = common.BASE + "/tests/resources/"
Ejemplo n.º 11
0
    def test_item_jsondump(self):
        sh = MockSmartHome()

        self.load_items('item_dumps', YAML_FILE)

        #logger.warning(self.sh.return_item("item1").to_json())
        #logger.warning(self.sh.return_item("item3.item3b.item3b1").to_json())
        #logger.warning(self.sh.return_item("item3").to_json())
        import json
        self.assertEqual(json.loads(self.sh.items.return_item("item3").to_json())['name'], self.sh.items.return_item("item3")._name)
        self.assertEqual(json.loads(self.sh.items.return_item("item3").to_json())['id'], self.sh.items.return_item("item3")._path)
Ejemplo n.º 12
0
 def test_cast_duration(self):
     if verbose == True:
         logger.warning('')
         logger.warning('===== test_item_relative_references:')
     sh = MockSmartHome()
     conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     self.assertEqual(300, item._cast_duration('5m'))
     self.assertEqual(23, item._cast_duration('23s'))
     self.assertEqual(42, item._cast_duration(42))
     self.assertEqual(42, item._cast_duration('42'))
     self.assertFalse(item._cast_duration('aa'))
     self.assertFalse(item._cast_duration(None))
Ejemplo n.º 13
0
    def test_prev_value(self):
        sh = MockSmartHome()
        conf = {'type': 'num'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')

        self.assertEqual(0,item.prev_value())

        item(12)
        self.assertEqual(0, item.prev_value())

        item(23)
        self.assertEqual(12, item.prev_value())

        item(42)
        self.assertEqual(23, item.prev_value())
Ejemplo n.º 14
0
 def test_call(self):
     if verbose == True:
         logger.warning('')
         logger.warning('===== test_call:')
     sh = MockSmartHome()
     conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     item(12)
     self.assertEqual(12, item._value)
     self.assertEqual(12, item())
     conf = {'type': 'num', 'eval': '2'}
     item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
     item(12)
     self.assertEqual(0, item())
     item.set(12)
     self.assertEqual(12, item())
Ejemplo n.º 15
0
    def test_set(self):
        
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_set:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item.set(12)
        self.assertEqual(12, item._value)

        item.set('13')
        self.assertEqual(13, item._value)
        self.assertIsNone(item.set('qwe'))
        self.assertEqual(13, item._value)
        item.set('14')
Ejemplo n.º 16
0
    def test_fadejob(self):
        #(item, dest, step, delta):
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01' )
        item(10)
        item._fading = True
        lib.item._fadejob(item, 0, 5, 1)
        self.assertEqual(10, item._value)
        item._fading = False
        lib.item._fadejob(item,0, 5, 0.1)
        self.assertEqual(0,item._value)

        lib.item._fadejob(item, 10, 5, 0.1)
        self.assertEqual(10, item._value)

        lib.item._fadejob(item, 100, 200, 1)
        self.assertEqual(100, item._value)
Ejemplo n.º 17
0
class TestPlugin(unittest.TestCase):

	def setUp(self):
		self.sh = MockSmartHome()
		self.plugins = self.sh.with_plugins_from(common.BASE + "/tests/resources/plugin")
		self.item_conf = self.sh.with_items_from(common.BASE + "/tests/resources/plugin_items.conf")

	def test_plugin_is_registered(self):
		self.assertIsNotNone(self.plugins.get_plugin("wol"))

	def test_plugin_not_registered(self):
		self.assertIsNone(self.plugins.get_plugin("wol1"))

	def test_plugin_name(self):
		wolplug = self.plugins.get_plugin("wol_ww")
		self.assertEqual(wolplug.name, "wol_ww")

	def test_plugin_implementation(self):
		wolplug = self.plugins.get_plugin("wol_ww")
		self.assertEqual(wolplug.plugin, wolplug.get_implementation())

	def test_plugin_ident(self):
		wolplug = self.plugins.get_plugin("wol_ww")
		self.assertIsNone(wolplug.ident)
		self.plugins.start()
		self.assertEqual(wolplug.ident, wolplug.get_ident())
		self.assertIsNotNone(wolplug.get_ident())
		self.plugins.stop()

	def test_plugin_instance_not_set(self):
		cliplug = self.plugins.get_plugin("cli")
		self.assertEqual(cliplug.plugin.get_instance_name(),"")

	def test_plugin_instance_set(self):
		cliplug = self.plugins.get_plugin("wol_ww")
		self.assertEqual(cliplug.plugin.get_instance_name(),"bind")

	def test_plugin_multi_instance_capable_true(self):
		wolplug = self.plugins.get_plugin("wol_ww")
		self.assertTrue(isinstance(wolplug.plugin, SmartPlugin))
		self.assertTrue(wolplug.plugin.is_multi_instance_capable())

	def test_plugin_multi_instance_capable_false(self):
		cliplug = self.plugins.get_plugin("cli")
		self.assertTrue(isinstance(cliplug.plugin, SmartPlugin))
		self.assertFalse(cliplug.plugin.is_multi_instance_capable())

	def test_plugin_instance_not_set_has_iattr(self):
		wolplug = self.plugins.get_plugin("wol")

		config_mock = {'key3', 'value3'}
		self.assertTrue(wolplug.plugin.has_iattr(config_mock,"key3"))
		config_mock = {'key3@*', 'value3'}
		self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
		config_mock = {'key3@false*', 'value3'}
		self.assertFalse(wolplug.plugin.has_iattr(config_mock, "key3"))

	def test_plugin_instance_set_has_iattr(self):
		wolplug = self.plugins.get_plugin("wol_ww")

		config_mock = {'key3@bind', 'value3'}
		self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
		config_mock = {'key3@*', 'value3'}
		self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
		config_mock = {'key3@false', 'value3'}
		self.assertFalse(wolplug.plugin.has_iattr(config_mock, "key3"))

	def test_plugin_instance_not_set_get_iattr_value(self):
		wolplug = self.plugins.get_plugin("wol")

		config_mock = {'key3@*' : 'value3'}
		self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"), "value3")
		config_mock = {'key3@bind' : 'value2'}
		self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))
		config_mock = {'key3@bind2' : 'value4'}
		self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))

	def test_plugin_instance_set_get_iattr_value(self):
		wolplug = self.plugins.get_plugin("wol_ww")

		config_mock = {'key3@*' : 'value3'}
		self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"), "value3")
		config_mock = {'key3@bind' : 'value2'}
		self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"), "value2")
		config_mock = {'key3@bind2', 'value4'}
		self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))

	def test_plugin_instance_not_used_in_item_config(self):
		it = self.sh.return_item("item3.item3b.item3b1")
		self.assertIsNotNone(it)
		self.assertEqual(len(it.get_method_triggers()),1)

	def test_plugin_instance_used_in_item_config(self):
		it = self.sh.return_item("item3.item3b.item3b1.item3b1a")
		self.assertIsNotNone(it)
		self.assertEqual(len(it.get_method_triggers()),2)

	def test_plugin_instance_no_attributes_item_config(self):
		it = self.sh.return_item("item3.item3b")
		self.assertIsNotNone(it)
		self.assertEqual(len(it.get_method_triggers()),0)

	def test_plugin_instance_wol(self):
		wolplug = self.plugins.get_plugin("wol_ww")
		self.sh.scheduler.add(wolplug.name, wolplug.plugin.update_item, prio=5, cycle=300, offset=2)
		wolplug.plugin.wake_on_lan("11:22:33:44:55:66")

	def _test_configsave(self):
		import configparser
		item_conf = self.item_conf

		config = configparser.RawConfigParser( )
		#config.read(common.BASE + '/tests/resources/plugin_items.conf')
		config.read_dict(item_conf)
		print(config)
		with open('example.cfg', 'w') as configfile:
			config.write(configfile)
Ejemplo n.º 18
0
	def setUp(self):
		self.sh = MockSmartHome()
		self.plugins = self.sh.with_plugins_from(common.BASE + "/tests/resources/plugin")
		self.item_conf = self.sh.with_items_from(common.BASE + "/tests/resources/plugin_items.conf")
Ejemplo n.º 19
0
    def test_meta_is_registered(self):
        logger.warning('')
        logger.warning('=== Begin Metadata Tests:')

        self.sh = MockSmartHome()
        self.meta = Metadata(self.sh, 'test_resources', 'module', 'tests.resources.test_metadata')
        print()
        print('self.meta: {}'.format(self.meta))
        print()

        args = {}
        # (processed_args, allparams_ok) = self.meta.check_parameters(args)
        (processed_args, allparams_ok, hide_params) = self.meta.check_parameters(args)

        # Test default values for datatypes
        self.assertIsNone(processed_args.get('notype_nodefault', None))
        self.assertEqual(False, processed_args['bool_nodefault'])
        self.assertEqual(0, processed_args['int_nodefault'])
        self.assertEqual(2, processed_args['int_validmin_nodefault'])
        self.assertEqual(-42, processed_args['int_validmax_nodefault'])
        self.assertEqual(0, processed_args['pint_nodefault'])
        self.assertEqual(0, processed_args['float_nodefault'])
        self.assertEqual(0, processed_args['pfloat_nodefault'])
        self.assertEqual('', processed_args['str_nodefault'])
        self.assertEqual('', processed_args['str_validlist_nodefault'])
        self.assertEqual([], processed_args['list_nodefault'])
        self.assertEqual({}, processed_args['dict_nodefault'])
        self.assertEqual('0.0.0.0', processed_args['ip_nodefault'])
        self.assertEqual('00:00:00:00:00:00', processed_args['mac_nodefault'])
        self.assertIsNone(processed_args['foo_nodefault'])

        # Test set default values for parameters
        self.assertEqual(42, processed_args['notype_default1'])
        self.assertEqual('42', processed_args['notype_default2'])
        self.assertEqual(True, processed_args['bool_default'])
        self.assertEqual(42, processed_args['int_default'])
        self.assertEqual(42, processed_args['pint_default'])
        self.assertEqual(4.2, processed_args['float_default'])
        self.assertEqual(4.2, processed_args['pfloat_default'])
        self.assertEqual('42', processed_args['str_default'])
        self.assertEqual('string2', processed_args['str_validlist_default'])
        self.assertEqual('string1', processed_args['str_validlist_invalid_default'])
        self.assertEqual([4,2], processed_args['list_default'])
        self.assertEqual({'answer': 42}, processed_args['dict_default'])
        self.assertEqual('127.0.0.1', processed_args['ip_default'])
        self.assertEqual('01:23:45:67:89:ab', processed_args['mac_default'])
        self.assertEqual(42, processed_args['foo_default'])

        args = {
            'notype_nodefault': True, 'bool_nodefault': '42', 'int_nodefault': -24, 'pint_nodefault': 24,
            'float_nodefault': -24.2, 'pfloat_nodefault': 24.3, 'str_nodefault': 'answer', 'str_validlist_nodefault': 'string2',
            'str_validlist_default': 'x', 'str_validlist_invalid_default': 'string2',
            'list_nodefault': [24,42], 'dict_nodefault': {'question': 24, 'answer': '42'},
            'ip_nodefault': '1.2.3.4', 'mac_nodefault': 'aa:ab:ac:ad:ae:af',
            'foo_nodefault': [4, 2],
            'notype_default1': '24', 'notype_default2': 24, 'bool_default': True, 'int_default': '-x', 'pint_default': -24,
            'float_default': '-x', 'pfloat_default': -24.2, 'str_default': 25,
            'list_default': "[24,'42', 4.2, '4.2']", 'dict_default': {24, '42'},
            'ip_default': '1.2.3.256', 'mac_default': 'aa:ab:ac:ad:ae:ag',
            'foo_default': ['4', 2, [4, '2']]
        }
        # (processed_args, allparams_ok) = self.meta.check_parameters(args)
        (processed_args, allparams_ok, hide_params) = self.meta.check_parameters(args)
        logger.warning("\n=== processed_args: {}".format(processed_args))
        logger.warning("\n=== allparams_ok: {}".format(allparams_ok))
        logger.warning("\n=== hide_params: {}\n".format(hide_params))

        # Test valid parameter configurations
        #self.assertEqual(True, processed_args.get('notype_nodefault', None))
        self.assertEqual(False, processed_args['bool_nodefault'])
        self.assertEqual(-24, processed_args['int_nodefault'])
        self.assertEqual(24, processed_args['pint_nodefault'])
        self.assertEqual(-24.2, processed_args['float_nodefault'])
        self.assertEqual(24.3, processed_args['pfloat_nodefault'])
        self.assertEqual('answer', processed_args['str_nodefault'])
        self.assertEqual('string2', processed_args['str_validlist_nodefault'])
        self.assertEqual([24,42], processed_args['list_nodefault'])
        self.assertEqual({'question': 24, 'answer': '42'}, processed_args['dict_nodefault'])
        self.assertEqual('1.2.3.4', processed_args['ip_nodefault'])
        self.assertEqual('aa:ab:ac:ad:ae:af', processed_args['mac_nodefault'])
        self.assertEqual([4, 2], processed_args['foo_nodefault'])


        # Test invalid parameter configurations
        self.assertEqual('24', processed_args['notype_default1'])
        self.assertEqual(24, processed_args['notype_default2'])
        self.assertTrue(processed_args['bool_default'])
        self.assertEqual(42, processed_args['int_default'])               # default value taken (42 instead of '-x')
        self.assertEqual(0, processed_args['pint_default'])               # valid_min value taken, not default value (0 instead of -24)
        self.assertEqual(4.2, processed_args['float_default'])            # default value taken (42 instead of '-x')
        self.assertEqual(0, processed_args['pfloat_default'])             # valid_min value taken, not default value (0 instead of -24)
        self.assertEqual('25', processed_args['str_default'])             # default value not taken, because 25 can be converted to '25'
        self.assertEqual('string1', processed_args['str_validlist_default'])  # default value taken ('string1' instead of 'x')
        self.assertEqual('string2', processed_args['str_validlist_invalid_default'])
        self.assertEqual([24,'42', 4.2, '4.2'], processed_args['list_default'])       # Test list with mixed datatypes
        self.assertEqual({'answer': 42}, processed_args['dict_default'])  # default value taken ({'answer': 42} instead of invalid dict {24, '42'})
        self.assertEqual('127.0.0.1', processed_args['ip_default'])       # default value taken ('127.0.0.1' instead of invalid ip '1.2.3.256')
        self.assertEqual('01:23:45:67:89:ab', processed_args['mac_default'])  # default value taken (instead of invalid mac 'aa:ab:ac:ad:ae:ag')
        self.assertEqual(['4', 2, [4, '2']], processed_args['foo_default'])   # accepts any data (no default is taken, if a value is specified)

        logger.warning('=== End metadata Tests')
Ejemplo n.º 20
0
class TestDatabaseBase(unittest.TestCase):

    TIME_FACTOR = 1000

    def plugin(self):
        self.sh = MockSmartHome()
        self.sh.with_items_from(common.BASE +
                                '/plugins/database/tests/test_items.conf')
        plugin = Database(self.sh, 'sqlite3', {'database': ':memory:'})
        for item in self.sh.return_items():
            plugin.parse_item(item)
        return plugin

    def t(self, s):
        return s * TestDatabaseBase.TIME_FACTOR

    def create_tmpfile(self):
        (fd, name) = tempfile.mkstemp()
        os.close(fd)
        return name

    def read_tmpfile(self, name):
        with open(name, 'r') as f:
            content = f.read(os.path.getsize(name))
        os.unlink(name)
        return content

    def create_item(self, plugin, name):
        return plugin.id(self.sh.return_item(name), True)

    def create_log(self, plugin, name, tuples):
        """ Create log in database (pass list of tuples: start, end, value)
        """
        id = self.create_item(plugin, name)
        for t in tuples:
            if t[1] is None:
                duration = None
            else:
                duration = self.t(t[1] - t[0])
            plugin.insertLog(id,
                             time=self.t(t[0]),
                             duration=duration,
                             val=t[2],
                             it='num')

    def dump_item(self, plugin, name):
        value = plugin.readItem(plugin.id(self.sh.return_item(name)))
        values = [(value[0], value[2], value[4])]
        self.log_dump(values)

    def dump_log(self, plugin, name):
        values = [(value[0], value[2], value[4]) for value in plugin.readLogs(
            plugin.id(self.sh.return_item(name), False))]
        self.log_dump(values)

    def log_slice(self, start, interval, *tuples_list):
        logs = []
        for tuples in tuples_list:
            for t in tuples:
                logs.append((start, start + interval, t))
                start = start + interval
        return logs

    def log_slice_values_delta(self, start, end, delta):
        values = []
        value = start
        while (delta < 0 or value <= end) and (delta > 0 or value >= end):
            values.append(value)
            value = value + delta
        return values

    def log_slice_values_func(self, start, end, func):
        n = 0
        value = func(n=n)
        while value <= end:
            values.append(value)
            n = n + 1
            value = func(n)
        return values

    def log_dump(self, values):
        func = [
            lambda v, nv: "{0:5} - {1: >5} ({2: >3})".format(
                v, (nv if nv != None else 0), (nv if nv != None else 0) - v),
            lambda v, nv: v, lambda v, nv: v
        ]
        align = [">26", ">10", ">10"]
        for (j, value) in enumerate(values):
            for (i, column) in enumerate(value):
                fmt = "{0: " + align[i] + "}"
                v = column
                nv = None if j == len(values) - 1 else values[j + 1][i]
                res = func[i](v, nv)
                print(fmt.format(res if res is not None else "(none)"), end='')
            print("")

    def assertLines(self, expected, actual):
        print(actual.split("\n"))
        for line in actual.split("\n"):
            self.assertIn(line, expected)

    def assertSingle(self, expected, actual):
        self.assertEquals(expected, actual)

    def assertSeries(self, expected, actual):
        # Series result is (in actual):
        # {
        # 'sid': 'main.num|avg|0|now|100',
        # 'params': {
        #   'item': 'main.num',
        #   'step': None,
        #   'update': True,
        #   'func': 'avg',
        #   'start': 1494087165032,
        #   'sid': 'main.num|avg|0|now|100',
        #   'end': 'now'
        # },
        # 'series': [
        #   (1494087165029, 0.0),
        #   (1494087165032, 0.0)
        # ],
        # 'update': datetime.datetime(2017, 10, 26, 16, 27, 16, 33702),
        # 'cmd': 'series'
        # }
        result = []
        for (i, e) in enumerate(expected):
            result.append((self.t(e[0]), e[1]))
        self.assertEquals(result, actual['series'])

    def assertSeriesCount(self, expected, actual):
        self.assertEquals(expected, len(actual['series']))
Ejemplo n.º 21
0
 def setUp(self):
     self.sh = MockSmartHome()
Ejemplo n.º 22
0
class TestItem(unittest.TestCase):

    def props(self,cls):   
        return [i for i in cls.__dict__.keys() if i[:1] != '_']

        
    def test__begin(self):
        logger.warning('')
        logger.warning('=== Begin Item Tests:')


    def test_zz_end(self):    
        logger.warning('')
        logger.warning('=== End Item Tests.')


    def setUp(self):
        self.sh = MockSmartHome()

    def load_items(self, filename, filetype=None):
        if filetype == None:
            conf_filename = common.BASE + "/tests/resources/"+filename+ITEM_FILE_TYPE
        else:
            conf_filename = common.BASE + "/tests/resources/"+filename+filetype
        item_conf = None
        item_conf = lib.config.parse(conf_filename, item_conf)
        if item_conf == {}:
            logger.warning('')
            logger.warning("config file '"+conf_filename+"' not found")
        if verbose == True:
            logger.warning('')
            logger.warning('test_item_relative_references: {}'.format(str(item_conf)))
            logger.warning('test_item_relative_references: {}'.format(str(item_conf.items())))
        for attr, value in item_conf.items():
            if isinstance(value, dict):
                child_path = attr
                try:
                    child = lib.item.Item(self.sh, self.sh, child_path, value)
                except Exception as e:
                    logger.error("Item {}: problem creating: {}".format(child_path, e))
                else:
                    #vars(sh)[attr] = child
                    self.sh.add_item(child_path, child)
                    self.sh.children.append(child)


    # ===================================================================
    # Following tests are about relative item addressing
    #
    def test_item_relative_references(self):
        """
        Tests various aspects around the handling of relative item references
        """
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_relative_references:')
       
        # -----------------------------------------------------------------
        
#        if verbose == True:
#            logger.warning('')

        self.load_items('item_items')
        it = self.sh.return_item("item_tree")
        self.assertIsNotNone(it)

        it = self.sh.return_item("item_tree.grandparent.parent.my_item")
        self.assertIsNotNone(it)
        self.assertEqual(it._type, 'bool')
        it = self.sh.return_item("item_tree.grandparent.parent.my_item.child")
        self.assertIsNotNone(it)
        self.assertEqual(it._type, 'foo')

        if verbose == True:
            logger.warning('')
            logger.warning('=== eval_trigger Tests:')
        # Attribute with relative references
        it = self.sh.return_item("item_tree.grandparent.parent.my_item")
        self.assertEqual(it.get_absolutepath('.', 'eval_trigger'), 'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('.self', 'eval_trigger'), 'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('.child', 'eval_trigger'), 'item_tree.grandparent.parent.my_item.child')
        self.assertEqual(it.get_absolutepath('.self.child', 'eval_trigger'), 'item_tree.grandparent.parent.my_item.child')
        self.assertEqual(it.get_absolutepath('.child.grandchild', 'eval_trigger'), 'item_tree.grandparent.parent.my_item.child.grandchild')
        self.assertEqual(it.get_absolutepath('..', 'eval_trigger'), 'item_tree.grandparent.parent')
        self.assertEqual(it.get_absolutepath('...', 'eval_trigger'), 'item_tree.grandparent')
        self.assertEqual(it.get_absolutepath('....', 'eval_trigger'), 'item_tree')
        self.assertEqual(it.get_absolutepath('.....', 'eval_trigger'), '')
        self.assertEqual(it.get_absolutepath('......', 'eval_trigger'), '')
        self.assertEqual(it.get_absolutepath('..sister', 'eval_trigger'), 'item_tree.grandparent.parent.sister')

        # Attribute w/o relative references
        self.assertEqual(it.get_absolutepath('item_tree.grandparent.parent.my_item', 'eval_trigger'), 'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('abc', 'eval_trigger'), 'abc')

        if verbose == True:
            logger.warning('')
            logger.warning('=== eval Tests:')
        it = self.sh.return_item("item_tree.grandparent.parent.my_item")

        self.assertEqual(it.get_stringwithabsolutepathes('sh..child()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.my_item.child()')
        self.assertEqual(it.get_stringwithabsolutepathes('5*sh..child()', 'sh.', '(', 'eval'), '5*sh.item_tree.grandparent.parent.my_item.child()')
        self.assertEqual(it.get_stringwithabsolutepathes('5 * sh..child() + 4', 'sh.', '(', 'eval'), '5 * sh.item_tree.grandparent.parent.my_item.child() + 4')

        # tests for '.self' implementation
        self.assertEqual(it.get_stringwithabsolutepathes('sh..child.changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.my_item.child.changed_by()')
        self.assertNotEqual(it.get_stringwithabsolutepathes('sh...changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(it.get_stringwithabsolutepathes('sh.item_tree.grandparent.parent.my_item.changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(it.get_stringwithabsolutepathes('sh..self.changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(it.get_stringwithabsolutepathes('sh...changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.changed_by()')
        self.assertEqual(it.get_stringwithabsolutepathes('sh...self.changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.parent.changed_by()')
        self.assertNotEqual(it.get_stringwithabsolutepathes('sh.....changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.changed_by()')
        self.assertEqual(it.get_stringwithabsolutepathes('sh....self.changed_by()', 'sh.', '(', 'eval'), 'sh.item_tree.grandparent.changed_by()')

        if verbose == True:
            logger.warning('')
            logger.warning('=== plugin-attribute Tests:')
        # Attribute with relative references
        it = self.sh.return_item("item_tree.grandparent.parent.my_item")
        it.expand_relativepathes('sv_widget', "'", "'")
        self.assertEqual(it.conf['sv_widget'], "{{ basic.switch('id_schreibtischleuchte', 'item_tree.grandparent.parent.my_item.onoff') }}")

        # Attribute w/o relative references
        it = self.sh.return_item("item_tree.grandparent.parent.my_item.child")
        orig = it.conf['sv_widget']
        it.expand_relativepathes('sv_widget', "'", "'")
        self.assertEqual(it.conf['sv_widget'], orig)
        self.assertEqual(it.conf['sv_widget'], "{{ basic.switch('id_schreibtischleuchte', 'item_tree.grandparent.parent.my_item.child.onoff') }}")

        # Tests for accessing internal attributes of items using relative adressing
        it = self.sh.return_item("item_tree.grandparent.parent.my_item")
        self.assertEqual(it.get_absolutepath('.child', 'eval_trigger'), 'item_tree.grandparent.parent.my_item.child')



    # ===================================================================
    # Following tests are about the autotimer attribut and value casting
    #
    def test_item_autotimers(self):
        """
        Tests about the autotimer attribut and value casting
        """
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_autotimers:')
#        if verbose == True:
#            logger.warning('')
        
        self.load_items('item_timers')

        # -----------------------------------------------------------------
        
        # Compatibility mode: No value casting for SmartHome v1.2 and older
        it = self.sh.return_item("item_tree.timertests.test_item01")		# autotimer = 5m = 42 = compat_1.2
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, '42'))
        
        it = self.sh.return_item("item_tree.timertests.test_item02")		# autotimer = 5s = = compat_1.2
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, ''))
        
        it = self.sh.return_item("item_tree.timertests.test_item03")		# autotimer = 5s = None = compat_1.2
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 'None'))


        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist str
        it = self.sh.return_item("item_tree.timertests.test_item11")		# autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, '42'))
        self.assertEqual(it._castvalue_to_itemtype(it._autotimer[0][1], it._autotimer[1]), '42')

        it = self.sh.return_item("item_tree.timertests.test_item12")		# autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, ''))

        it = self.sh.return_item("item_tree.timertests.test_item13")		# autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 'None'))


        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist num
        it = self.sh.return_item("item_tree.timertests.test_item21")		# autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, 42))

        it = self.sh.return_item("item_tree.timertests.test_item22")		# autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 0))

        it = self.sh.return_item("item_tree.timertests.test_item23")		# autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 0))


        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist bool
        it = self.sh.return_item("item_tree.timertests.test_item31")		# autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, False))

        it = self.sh.return_item("item_tree.timertests.test_item32")		# autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.return_item("item_tree.timertests.test_item33")		# autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.return_item("item_tree.timertests.test_item33")		# autotimer = 5s = 1 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.return_item("item_tree.timertests.test_item34")		# autotimer = 5s = True = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, True))

        it = self.sh.return_item("item_tree.timertests.test_item35")		# autotimer = 5s = true = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, True))

        # test use of items in attributes
        it = self.sh.return_item("item_tree.timertests.test_item41")		# sh.item_tree.timertests.test_item41.dauer() = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[2], 'item_tree.timertests.test_item41.dauer')

        it = self.sh.return_item("item_tree.timertests.test_item42")		# 5m = sh.item_tree.timertests.test_item42.wert() = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[3], 'item_tree.timertests.test_item42.wert')

        it = self.sh.return_item("item_tree.timertests.test_item51")		# sh..dauer() = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[2], 'item_tree.timertests.test_item51.dauer')
        
        it = self.sh.return_item("item_tree.timertests.test_item52")		# 5m = sh..wert() = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[3], 'item_tree.timertests.test_item52.wert')


    def test_cast_str(self):
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_str(1))
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_str(["ee","ww"]))

        str = 'qwe'
        self.assertEqual(str, lib.item._cast_str(str))

    def test_cast_list(self):
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_list(1))
        self.assertIsNotNone(lib.item._cast_list([1,2]))
        with self.assertRaises(ValueError):
            self.assertIsNotNone(lib.item._cast_list({1, 2}))

    def test_cast_dict(self):
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_dict(1))
        self.assertIsNotNone(lib.item._cast_dict({1:1, 2:2}))
        self.assertIsNotNone(lib.item._cast_dict({'1':1 , '2': 2}))

        with self.assertRaises(ValueError):
            self.assertIsNotNone(lib.item._cast_dict({1, 2}))

    def test_cast_scene(self):
        self.assertEqual(1, lib.item._cast_scene('1'))
        self.assertNotEqual(1, lib.item._cast_scene('2'))
        self.assertEqual(255, lib.item._cast_scene(0xff))

        with self.assertRaises(ValueError):
            self.assertEqual(255, lib.item._cast_scene(""))

        with self.assertRaises(ValueError):
            self.assertEqual(1, lib.item._cast_scene('l'))

    def test_cast_num(self):
        self.assertEqual(0, lib.item._cast_num(''))
        self.assertEqual(0, lib.item._cast_num(' '))
        self.assertEqual(1, lib.item._cast_num(' 1 '))
        self.assertEqual(1, lib.item._cast_num('1'))
        self.assertEqual(1.2, lib.item._cast_num('1.2'))
        self.assertEqual(1.2, lib.item._cast_num(1.2))
        self.assertEqual(1, lib.item._cast_num(int(1.2)))
        self.assertEqual(1.2, lib.item._cast_num(float(1.2)))
        with self.assertRaises(ValueError):
            self.assertEqual(10, lib.item._cast_num(' 0x0a'))

    def test_cast_bool(self):
        """
        ['0', 'false', 'no', 'off', '']:
            return False
        elif value.lower() in ['1', 'true', 'yes', 'on']:
        :return:
        """
        # true string values
        self.assertTrue(lib.item._cast_bool('yes'))
        self.assertTrue(lib.item._cast_bool('true'))
        self.assertTrue(lib.item._cast_bool('1'))
        self.assertTrue(lib.item._cast_bool('on'))
        # true numeric values
        self.assertTrue(lib.item._cast_bool(1))
        self.assertTrue(lib.item._cast_bool(int(1)))
        self.assertTrue(lib.item._cast_bool(float(1)))
        self.assertTrue(lib.item._cast_bool(bool(1)))

        # exceptions
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_bool(float(99)))
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_bool(2))
        with self.assertRaises(ValueError):
            self.assertTrue(lib.item._cast_bool(-2))

        with self.assertRaises(TypeError):
            self.assertTrue(lib.item._cast_bool([]))

        with self.assertRaises(TypeError):
            self.assertTrue(lib.item._cast_bool(None))

        #false numeric values
        self.assertFalse(lib.item._cast_bool(0))
        self.assertFalse(lib.item._cast_bool(int(0)))
        self.assertFalse(lib.item._cast_bool(float(0)))
        self.assertFalse(lib.item._cast_bool(bool(0)))
        # false string values
        self.assertFalse(lib.item._cast_bool(""))
        self.assertFalse(lib.item._cast_bool('no'))
        self.assertFalse(lib.item._cast_bool('off'))
        self.assertFalse(lib.item._cast_bool('false'))
        self.assertFalse(lib.item._cast_bool('0'))

    def test_fadejob(self):
        #(item, dest, step, delta):
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01' )
        item(10)
        item._fading = True
        lib.item._fadejob(item, 0, 5, 1)
        self.assertEqual(10, item._value)
        item._fading = False
        lib.item._fadejob(item,0, 5, 0.1)
        self.assertEqual(0,item._value)

        lib.item._fadejob(item, 10, 5, 0.1)
        self.assertEqual(10, item._value)

        lib.item._fadejob(item, 100, 200, 1)
        self.assertEqual(100, item._value)

    def test_set(self):
        
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_set:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item.set(12)
        self.assertEqual(12, item._value)

        item.set('13')
        self.assertEqual(13, item._value)
        self.assertIsNone(item.set('qwe'))
        self.assertEqual(13, item._value)
        item.set('14')

    def test_cast_duration(self):
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_relative_references:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        self.assertEqual(300, item._cast_duration('5m'))
        self.assertEqual(23, item._cast_duration('23s'))
        self.assertEqual(42, item._cast_duration(42))
        self.assertEqual(42, item._cast_duration('42'))
        self.assertFalse(item._cast_duration('aa'))
        self.assertFalse(item._cast_duration(None))

    def test_call(self):
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_call:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item(12)
        self.assertEqual(12, item._value)
        self.assertEqual(12, item())
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item(12)
        self.assertEqual(0, item())
        item.set(12)
        self.assertEqual(12, item())

    def test_run_eval(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item._Item__run_eval()
        self.assertEqual(2,item())
        item._eval = 'bla'
        item._Item__run_eval()
        item._eval = 'sh.return_none()'
        item._Item__run_eval()
    def test_jsonvars(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item.set('42')

        self.assertDictEqual(item.jsonvars(),{'attributes': {}, 'value': 42, 'type': 'num', 'children': [], 'id': 'test_item01', 'name': 'test_item01'})
      #  __run_eval(self, value=None, caller='Eval', source=None, dest=None):
    def test_to_json(self):
        import json
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item.set('42')
        expected = json.dumps({'attributes': {}, 'value': 42, 'type': 'num', 'children': [], 'id': 'test_item01', 'name': 'test_item01'}, sort_keys=True, indent=2)
        self.assertEqual(item.to_json(), expected)

    def test_type(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        self.assertEqual(item.type(), 'num')
        item._type= 'foo'
        self.assertNotEqual(item.type(), 'num')
        self.assertEqual(item.type(), 'foo')

    def test_prev_value(self):
        sh = MockSmartHome()
        conf = {'type': 'num'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')

        self.assertEqual(0,item.prev_value())

        item(12)
        self.assertEqual(0, item.prev_value())

        item(23)
        self.assertEqual(12, item.prev_value())

        item(42)
        self.assertEqual(23, item.prev_value())

    def test_last_prev_change(self):
        import datetime
        import time
        sh = MockSmartHome()
        conf = {'type': 'num'}
        item = lib.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        sec1 = datetime.datetime.now().time().second
        self.assertEqual(sec1,item.last_change().time().second)
        time.sleep(2)
        item(12)
        self.assertEqual(datetime.datetime.now().time().second,item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)
        self.assertEqual(datetime.datetime.now().time().second, item.last_change().time().second)
        sec2 = datetime.datetime.now().time().second
        time.sleep(2)

        item(12)
        self.assertEqual(sec2, item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)

        sec3 = datetime.datetime.now().time().second
        item(23)
        self.assertEqual(sec3, item.last_change().time().second)


    def test_split_duration_value_string(self):
        lib.item._split_duration_value_string("")

    def test_join_duration_value_string(self):
        #logger.warning(lib.item._join_duration_value_string(12,123))
        #(time, value, compat=''):
        pass
        
    def test_cachewrite_readjson(self):
        import datetime
        from lib.constants import CACHE_JSON

        self.cache_write_load_value(v = True, f=CACHE_JSON)
        self.cache_write_load_value(v=None, f=CACHE_JSON)
        self.cache_write_load_value(v=1, f=CACHE_JSON)
        self.cache_write_load_value(v=123123123, f=CACHE_JSON)
        self.cache_write_load_value(v="foo", f=CACHE_JSON)
        self.cache_write_load_value(v={'active': True, 'list': [{'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'time': 'sunset+30m', 'value': 1}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'time': 'sunrise-30m', 'value': 0}]}, f=CACHE_JSON)
        self.cache_write_load_value(v={'active': True}, f=CACHE_JSON)
        self.cache_write_load_value(v=[1,2,3,4,5], f=CACHE_JSON)
        self.cache_write_load_value(v=["a","2","3"], f=CACHE_JSON)
        self.cache_write_load_value(v=["a","2","3",2,3,4,5], f=CACHE_JSON)
        # @TODO: not working : self.cache_write_load_value(v=datetime.datetime.now(), f=CACHE_JSON)

    def test_cachewrite_readpickle(self):
        import datetime
        from lib.constants import CACHE_PICKLE

        self.cache_write_load_value(v = True, f=CACHE_PICKLE)
        self.cache_write_load_value(v=None, f=CACHE_PICKLE)
        self.cache_write_load_value(v=1, f=CACHE_PICKLE)
        self.cache_write_load_value(v=123123123, f=CACHE_PICKLE)
        self.cache_write_load_value(v="foo", f=CACHE_PICKLE)
        self.cache_write_load_value(v={'active': True, 'list': [{'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'time': 'sunset+30m', 'value': 1}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'time': 'sunrise-30m', 'value': 0}]}, f=CACHE_PICKLE)
        self.cache_write_load_value(v={'active': True}, f=CACHE_PICKLE)
        self.cache_write_load_value(v=[1,2,3,4,5], f=CACHE_PICKLE)
        self.cache_write_load_value(v=["a","2","3"], f=CACHE_PICKLE)
        self.cache_write_load_value(v=["a","2","3",2,3,4,5], f=CACHE_PICKLE)
        self.cache_write_load_value(v=datetime.datetime.now(), f=CACHE_PICKLE)


    def cache_write_load_value(self, v,f):
        from dateutil.tz import gettz

        TZ = gettz('UTC')
        fn = 'test.cache'

        lib.item._cache_write(value=v, filename=fn, cformat=f)

        date = cachedvalue = None
        date, cachedvalue = lib.item._cache_read(filename=fn, tz=TZ, cformat=f)
        #logger.warning(type(cachedvalue))
        self.assertEqual(v, cachedvalue)


    def test_item_jsondump(self):
        sh = MockSmartHome()

        self.load_items('item_dumps', YAML_FILE)

        #logger.warning(self.sh.return_item("item1").to_json())
        #logger.warning(self.sh.return_item("item3.item3b.item3b1").to_json())
        #logger.warning(self.sh.return_item("item3").to_json())
        import json
        self.assertEqual(json.loads(self.sh.return_item("item3").to_json())['name'], self.sh.return_item("item3")._name)
        self.assertEqual(json.loads(self.sh.return_item("item3").to_json())['id'], self.sh.return_item("item3")._path)
Ejemplo n.º 23
0
 def setUp(self):
     logger.warning('')
     self.sh = MockSmartHome()
     self._logics = Logics(self.sh, self.sh._logic_conf_basename, self.sh._env_logic_conf_basename)
     self.logics = Logics.get_instance()
Ejemplo n.º 24
0
class TestPlugin(unittest.TestCase):
    def setUp(self):
        self.sh = MockSmartHome()
        self.plugins = self.sh.with_plugins_from(common.BASE +
                                                 "/tests/resources/plugin")
        self.item_conf = self.sh.with_items_from(
            common.BASE + "/tests/resources/plugin_items.conf")

    def test_plugin_is_registered(self):
        self.assertIsNotNone(self.plugins.get_pluginthread("wol"))

    def test_plugin_not_registered(self):
        self.assertIsNone(self.plugins.get_pluginthread("wol1"))

    def test_plugin_name(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")
        self.assertEqual(wolplug.name, "wol_ww")

    def test_plugin_implementation(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")
        self.assertEqual(wolplug.plugin, wolplug.get_implementation())

    def test_plugin_ident(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")
        self.assertIsNone(wolplug.ident)
        self.plugins.start()
        self.assertEqual(wolplug.ident, wolplug.get_ident())
        self.assertIsNotNone(wolplug.get_ident())
        self.plugins.stop()

    def test_plugin_instance_not_set(self):
        cliplug = self.plugins.get_pluginthread("cli")
        self.assertEqual(cliplug.plugin.get_instance_name(), "")

    def test_plugin_instance_set(self):
        cliplug = self.plugins.get_pluginthread("wol_ww")
        self.assertEqual(cliplug.plugin.get_instance_name(), "bind")

    def test_plugin_multi_instance_capable_true(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")
        self.assertTrue(isinstance(wolplug.plugin, SmartPlugin))
        self.assertTrue(wolplug.plugin.is_multi_instance_capable())

        cliplug = self.plugins.get_pluginthread("cli")
        self.assertTrue(isinstance(cliplug.plugin, SmartPlugin))
        self.assertTrue(cliplug.plugin.is_multi_instance_capable())

    def test_plugin_multi_instance_capable_false(self):
        pass
        # cliplug = self.plugins.get_pluginthread("cli")
        # self.assertTrue(isinstance(cliplug.plugin, SmartPlugin))
        # self.assertFalse(cliplug.plugin.is_multi_instance_capable())

    def test_plugin_instance_not_set_has_iattr(self):
        wolplug = self.plugins.get_pluginthread("wol")

        config_mock = {'key3', 'value3'}
        self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
        config_mock = {'key3@*', 'value3'}
        self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
        config_mock = {'key3@false*', 'value3'}
        self.assertFalse(wolplug.plugin.has_iattr(config_mock, "key3"))

    def test_plugin_instance_set_has_iattr(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")

        config_mock = {'key3@bind', 'value3'}
        self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
        config_mock = {'key3@*', 'value3'}
        self.assertTrue(wolplug.plugin.has_iattr(config_mock, "key3"))
        config_mock = {'key3@false', 'value3'}
        self.assertFalse(wolplug.plugin.has_iattr(config_mock, "key3"))

    def test_plugin_instance_not_set_get_iattr_value(self):
        wolplug = self.plugins.get_pluginthread("wol")

        config_mock = {'key3@*': 'value3'}
        self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"),
                         "value3")
        config_mock = {'key3@bind': 'value2'}
        self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))
        config_mock = {'key3@bind2': 'value4'}
        self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))

    def test_plugin_instance_set_get_iattr_value(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")

        config_mock = {'key3@*': 'value3'}
        self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"),
                         "value3")
        config_mock = {'key3@bind': 'value2'}
        self.assertEqual(wolplug.plugin.get_iattr_value(config_mock, "key3"),
                         "value2")
        config_mock = {'key3@bind2', 'value4'}
        self.assertIsNone(wolplug.plugin.get_iattr_value(config_mock, "key3"))

    def test_plugin_instance_not_used_in_item_config(self):
        it = self.sh.items.return_item("item3.item3b.item3b1")
        self.assertIsNotNone(it)
        self.assertEqual(len(it.get_method_triggers()), 1)

    def test_plugin_instance_used_in_item_config(self):
        it = self.sh.items.return_item("item3.item3b.item3b1.item3b1a")
        self.assertIsNotNone(it)
        self.assertEqual(len(it.get_method_triggers()), 2)

    def test_plugin_instance_no_attributes_item_config(self):
        it = self.sh.items.return_item("item3.item3b")
        self.assertIsNotNone(it)
        self.assertEqual(len(it.get_method_triggers()), 0)

    def test_plugin_instance_wol(self):
        wolplug = self.plugins.get_pluginthread("wol_ww")
        self.sh.scheduler.add(wolplug.name,
                              wolplug.plugin.update_item,
                              prio=5,
                              cycle=300,
                              offset=2)
        wolplug.plugin.wake_on_lan("11:22:33:44:55:66")

    def _test_configsave(self):
        import configparser
        item_conf = self.item_conf

        config = configparser.RawConfigParser()
        #config.read(common.BASE + '/tests/resources/plugin_items.conf')
        config.read_dict(item_conf)
        print(config)
        with open('example.cfg', 'w') as configfile:
            config.write(configfile)
Ejemplo n.º 25
0
class TestItem(unittest.TestCase):
    def props(self, cls):
        return [i for i in cls.__dict__.keys() if i[:1] != '_']

    def test__begin(self):
        logger.warning('')
        logger.warning('=== Begin Item Tests:')

    def test_zz_end(self):
        logger.warning('')
        logger.warning('=== End Item Tests.')

    def setUp(self):
        self.sh = MockSmartHome()

    def load_items(self, filename, filetype=None):
        logger.warning("\n\nload_items: ===  Begin of method  ==\n")
        if filetype == None:
            conf_filename = common.BASE + "/tests/resources/" + filename + ITEM_FILE_TYPE
        else:
            conf_filename = common.BASE + "/tests/resources/" + filename + filetype
        item_conf = None
        item_conf = lib.config.parse(conf_filename, item_conf)
        if item_conf == {}:
            logger.warning("\nconfig file '" + conf_filename + "' not found")
        if verbose == True:
            logger.warning('\nload_items: item_conf.items()={}'.format(
                str(item_conf.items())))
        #lib.item._items_instance = None
        #self.items = lib.item.Items(self)
        #self.sh.items = lib.item.Items(self)
        for attr, value in item_conf.items():
            logger.warning("\nload_items: attr={}, value={}\n".format(
                attr, value))
            if isinstance(value, dict):
                child_path = attr
                try:
                    #child = lib.item.Item(self.sh, self.sh, child_path, value)
                    #child = lib.item.item.Item(self.sh, self.sh, child_path, value)
                    child = self.create_item(self.sh, self.sh, child_path,
                                             value)
                except Exception as e:
                    logger.error("Item {}: problem creating: {}".format(
                        child_path, e))
                else:
                    logger.warning(
                        "\nload_items: child_path={}, value={} -> child={}".
                        format(attr, value, child))
                    vars(self.sh)[attr] = child
                    vars(self)[attr] = child
                    self.sh.add_item(child_path, child)
                    #                    self.items.add_item(child_path, child)
                    self.sh.children.append(child)

        items = self.sh.items.return_items()
        for i in items:
            logger.warning("\nload_items: self.sh.items i = {}".format(i))
        logger.warning("\nload_items: ===  End of method  ==\n")

    # ===================================================================
    # Following tests are about relative item addressing
    #
    def test_item_relative_references(self):
        """
        Tests various aspects around the handling of relative item references
        """
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_relative_references:')

        # -----------------------------------------------------------------

#        if verbose == True:
#            logger.warning('')

        self.load_items('item_items')
        it = self.sh.items.return_item("item_tree")
        self.assertIsNotNone(it)

        it = self.sh.items.return_item("item_tree.grandparent.parent.my_item")
        self.assertIsNotNone(it)
        self.assertEqual(it._type, 'bool')
        it = self.sh.items.return_item(
            "item_tree.grandparent.parent.my_item.child")
        self.assertIsNotNone(it)
        self.assertEqual(it._type, 'foo')

        if verbose == True:
            logger.warning('')
            logger.warning('=== eval_trigger Tests:')
        # Attribute with relative references
        it = self.sh.items.return_item("item_tree.grandparent.parent.my_item")
        self.assertEqual(it.get_absolutepath('.', 'eval_trigger'),
                         'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('.self', 'eval_trigger'),
                         'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('.child', 'eval_trigger'),
                         'item_tree.grandparent.parent.my_item.child')
        self.assertEqual(it.get_absolutepath('.self.child', 'eval_trigger'),
                         'item_tree.grandparent.parent.my_item.child')
        self.assertEqual(
            it.get_absolutepath('.child.grandchild', 'eval_trigger'),
            'item_tree.grandparent.parent.my_item.child.grandchild')
        self.assertEqual(it.get_absolutepath('..', 'eval_trigger'),
                         'item_tree.grandparent.parent')
        self.assertEqual(it.get_absolutepath('...', 'eval_trigger'),
                         'item_tree.grandparent')
        self.assertEqual(it.get_absolutepath('....', 'eval_trigger'),
                         'item_tree')
        self.assertEqual(it.get_absolutepath('.....', 'eval_trigger'), '')
        self.assertEqual(it.get_absolutepath('......', 'eval_trigger'), '')
        self.assertEqual(it.get_absolutepath('..sister', 'eval_trigger'),
                         'item_tree.grandparent.parent.sister')

        # Attribute w/o relative references
        self.assertEqual(
            it.get_absolutepath('item_tree.grandparent.parent.my_item',
                                'eval_trigger'),
            'item_tree.grandparent.parent.my_item')
        self.assertEqual(it.get_absolutepath('abc', 'eval_trigger'), 'abc')

        if verbose == True:
            logger.warning('')
            logger.warning('=== eval Tests:')
        it = self.sh.items.return_item("item_tree.grandparent.parent.my_item")

        self.assertEqual(
            it.get_stringwithabsolutepathes('sh..child()', 'sh.', '(', 'eval'),
            'sh.item_tree.grandparent.parent.my_item.child()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('5*sh..child()', 'sh.', '(',
                                            'eval'),
            '5*sh.item_tree.grandparent.parent.my_item.child()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('5 * sh..child() + 4', 'sh.', '(',
                                            'eval'),
            '5 * sh.item_tree.grandparent.parent.my_item.child() + 4')

        # tests for '.self' implementation
        self.assertEqual(
            it.get_stringwithabsolutepathes('sh..child.changed_by()', 'sh.',
                                            '(', 'eval'),
            'sh.item_tree.grandparent.parent.my_item.child.changed_by()')
        self.assertNotEqual(
            it.get_stringwithabsolutepathes('sh...changed_by()', 'sh.', '(',
                                            'eval'),
            'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(
            it.get_stringwithabsolutepathes(
                'sh.item_tree.grandparent.parent.my_item.changed_by()', 'sh.',
                '(', 'eval'),
            'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('sh..self.changed_by()', 'sh.',
                                            '(', 'eval'),
            'sh.item_tree.grandparent.parent.my_item.changed_by()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('sh...changed_by()', 'sh.', '(',
                                            'eval'),
            'sh.item_tree.grandparent.parent.changed_by()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('sh...self.changed_by()', 'sh.',
                                            '(', 'eval'),
            'sh.item_tree.grandparent.parent.changed_by()')
        self.assertNotEqual(
            it.get_stringwithabsolutepathes('sh.....changed_by()', 'sh.', '(',
                                            'eval'),
            'sh.item_tree.grandparent.changed_by()')
        self.assertEqual(
            it.get_stringwithabsolutepathes('sh....self.changed_by()', 'sh.',
                                            '(', 'eval'),
            'sh.item_tree.grandparent.changed_by()')

        if verbose == True:
            logger.warning('')
            logger.warning('=== plugin-attribute Tests:')
        # Attribute with relative references
        it = self.sh.items.return_item("item_tree.grandparent.parent.my_item")
        it.expand_relativepathes('sv_widget', "'", "'")
        self.assertEqual(
            it.conf['sv_widget'],
            "{{ basic.switch('id_schreibtischleuchte', 'item_tree.grandparent.parent.my_item.onoff') }}"
        )

        # Attribute with relative references (sv_widget contains a list)
        it = self.sh.items.return_item("item_tree.svwidget_list")
        it.expand_relativepathes('sv_widget', "'", "'")
        # result should be a list
        self.assertEqual(isinstance(it.conf['sv_widget'], list), True)
        # length of list should be 2
        self.assertEqual(len(it.conf['sv_widget']), 2)
        # test both values of list (first w/o relative path, second with relative path)
        self.assertEqual(
            it.conf['sv_widget'][0],
            "{{ basic.switch('id_schreibtischleuchte1', 'item_tree.grandparent.parent.my_item.child.onoff') }}"
        )
        self.assertEqual(
            it.conf['sv_widget'][1],
            "{{ basic.switch('id_schreibtischleuchte2', 'item_tree.grandparent.parent.my_item.child.onoff') }}"
        )

        # Attribute w/o relative references
        it = self.sh.items.return_item(
            "item_tree.grandparent.parent.my_item.child")
        orig = it.conf['sv_widget']
        it.expand_relativepathes('sv_widget', "'", "'")
        self.assertEqual(it.conf['sv_widget'], orig)
        self.assertEqual(
            it.conf['sv_widget'],
            "{{ basic.switch('id_schreibtischleuchte', 'item_tree.grandparent.parent.my_item.child.onoff') }}"
        )

        # Tests for accessing internal attributes of items using relative adressing
        it = self.sh.items.return_item("item_tree.grandparent.parent.my_item")
        self.assertEqual(it.get_absolutepath('.child', 'eval_trigger'),
                         'item_tree.grandparent.parent.my_item.child')

    # ===================================================================
    # Following tests are about the autotimer attribut and value casting
    #
    def test_item_autotimers(self):
        """
        Tests about the autotimer attribut and value casting
        """
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_autotimers:')


#        if verbose == True:
#            logger.warning('')

        self.load_items('item_timers')
        #self.sh.with_items_from('item_timers')

        items = self.sh.items.return_items()
        for i in items:
            logger.warning(
                "test_item_autotimers: self.sh.items i = {}".format(i))

        # -----------------------------------------------------------------

        # Compatibility mode: No value casting for SmartHome v1.2 and older
        it = self.sh.items.return_item("item_tree.timertests.test_item01"
                                       )  # autotimer = 5m = 42 = compat_1.2
        logger.warning("test_item_autotimers: sh.items  it = {}".format(it))
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, '42'))

        it = self.sh.items.return_item("item_tree.timertests.test_item02"
                                       )  # autotimer = 5s = = compat_1.2
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, ''))

        it = self.sh.items.return_item("item_tree.timertests.test_item03"
                                       )  # autotimer = 5s = None = compat_1.2
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 'None'))

        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist str
        it = self.sh.items.return_item(
            "item_tree.timertests.test_item11")  # autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, '42'))
        self.assertEqual(
            it._castvalue_to_itemtype(it._autotimer[0][1], it._autotimer[1]),
            '42')

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item12")  # autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, ''))

        it = self.sh.items.return_item("item_tree.timertests.test_item13"
                                       )  # autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 'None'))

        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist num
        it = self.sh.items.return_item(
            "item_tree.timertests.test_item21")  # autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, 42))

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item22")  # autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 0))

        it = self.sh.items.return_item("item_tree.timertests.test_item23"
                                       )  # autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, 0))

        # Compatibility mode: No value casting for SmartHome v1.2 and older -> item-type ist bool
        it = self.sh.items.return_item(
            "item_tree.timertests.test_item31")  # autotimer = 5m = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (300, False))

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item32")  # autotimer = 5s = = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.items.return_item("item_tree.timertests.test_item33"
                                       )  # autotimer = 5s = None = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item33")  # autotimer = 5s = 1 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, False))

        it = self.sh.items.return_item("item_tree.timertests.test_item34"
                                       )  # autotimer = 5s = True = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, True))

        it = self.sh.items.return_item("item_tree.timertests.test_item35"
                                       )  # autotimer = 5s = true = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[0], (5, True))

        # test use of items in attributes
        it = self.sh.items.return_item(
            "item_tree.timertests.test_item41"
        )  # sh.item_tree.timertests.test_item41.dauer() = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[2],
                         'item_tree.timertests.test_item41.dauer')

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item42"
        )  # 5m = sh.item_tree.timertests.test_item42.wert() = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[3],
                         'item_tree.timertests.test_item42.wert')

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item51")  # sh..dauer() = 42 = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[2],
                         'item_tree.timertests.test_item51.dauer')

        it = self.sh.items.return_item(
            "item_tree.timertests.test_item52")  # 5m = sh..wert() = latest
        self.assertIsNotNone(it)
        self.assertEqual(it._autotimer[3],
                         'item_tree.timertests.test_item52.wert')

    def item_cast_str(self, value):
        try:
            return lib.item.helpers.cast_str(value)
        except AttributeError:
            return lib.item._cast_str(value)

    def item_cast_list(self, value):
        try:
            return lib.item.helpers.cast_list(value)
        except AttributeError:
            return lib.item._cast_list(value)

    def item_cast_dict(self, value):
        try:
            return lib.item.helpers.cast_dict(value)
        except AttributeError:
            return lib.item._cast_dict(value)

    def item_cast_scene(self, value):
        try:
            return lib.item.helpers.cast_scene(value)
        except AttributeError:
            return lib.item._cast_scene(value)

    def item_cast_num(self, value):
        try:
            return lib.item.helpers.cast_num(value)
        except AttributeError:
            return lib.item._cast_num(value)

    def item_cast_bool(self, value):
        try:
            return lib.item.helpers.cast_bool(value)
        except AttributeError:
            return lib.item._cast_bool(value)

    def test_cast_str(self):
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_str(1))
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_str(["ee", "ww"]))

        str = 'qwe'
        self.assertEqual(str, self.item_cast_str(str))

    def test_cast_list(self):
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_list(1))
        self.assertIsNotNone(self.item_cast_list([1, 2]))
        with self.assertRaises(ValueError):
            self.assertIsNotNone(self.item_cast_list({1, 2}))

    def test_cast_dict(self):
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_dict(1))
        self.assertIsNotNone(self.item_cast_dict({1: 1, 2: 2}))
        self.assertIsNotNone(self.item_cast_dict({'1': 1, '2': 2}))

        with self.assertRaises(ValueError):
            self.assertIsNotNone(self.item_cast_dict({1, 2}))

    def test_cast_scene(self):
        self.assertEqual(1, self.item_cast_scene('1'))
        self.assertNotEqual(1, self.item_cast_scene('2'))
        self.assertEqual(255, self.item_cast_scene(0xff))

        with self.assertRaises(ValueError):
            self.assertEqual(255, self.item_cast_scene(""))

        with self.assertRaises(ValueError):
            self.assertEqual(1, self.item_cast_scene('l'))

    def test_cast_num(self):
        self.assertEqual(0, self.item_cast_num(''))
        self.assertEqual(0, self.item_cast_num(' '))
        self.assertEqual(1, self.item_cast_num(' 1 '))
        self.assertEqual(1, self.item_cast_num('1'))
        self.assertEqual(1.2, self.item_cast_num('1.2'))
        self.assertEqual(1.2, self.item_cast_num(1.2))
        self.assertEqual(1, self.item_cast_num(int(1.2)))
        self.assertEqual(1.2, self.item_cast_num(float(1.2)))
        with self.assertRaises(ValueError):
            self.assertEqual(10, self.item_cast_num(' 0x0a'))

    def test_cast_bool(self):
        """
        ['0', 'false', 'no', 'off', '']:
            return False
        elif value.lower() in ['1', 'true', 'yes', 'on']:
        :return:
        """
        # true string values
        self.assertTrue(self.item_cast_bool('yes'))
        self.assertTrue(self.item_cast_bool('true'))
        self.assertTrue(self.item_cast_bool('1'))
        self.assertTrue(self.item_cast_bool('on'))
        # true numeric values
        self.assertTrue(self.item_cast_bool(1))
        self.assertTrue(self.item_cast_bool(int(1)))
        self.assertTrue(self.item_cast_bool(float(1)))
        self.assertTrue(self.item_cast_bool(bool(1)))

        # exceptions
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_bool(float(99)))
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_bool(2))
        with self.assertRaises(ValueError):
            self.assertTrue(self.item_cast_bool(-2))

        with self.assertRaises(TypeError):
            self.assertTrue(self.item_cast_bool([]))

        with self.assertRaises(TypeError):
            self.assertTrue(self.item_cast_bool(None))

        #false numeric values
        self.assertFalse(self.item_cast_bool(0))
        self.assertFalse(self.item_cast_bool(int(0)))
        self.assertFalse(self.item_cast_bool(float(0)))
        self.assertFalse(self.item_cast_bool(bool(0)))
        # false string values
        self.assertFalse(self.item_cast_bool(""))
        self.assertFalse(self.item_cast_bool('no'))
        self.assertFalse(self.item_cast_bool('off'))
        self.assertFalse(self.item_cast_bool('false'))
        self.assertFalse(self.item_cast_bool('0'))

    def create_item(self, smarthome, parent, path, config):
        try:
            item = lib.item.item.Item(smarthome, parent, path, config)
        except:
            item = lib.item.Item(smarthome, parent, path, config)
        return item

    def item_fadejob(self, item, dest, step, delta):
        try:
            lib.item.helpers.fadejob(item, dest, step, delta)
        except:
            lib.item._fadejob(item, dest, step, delta)

    def test_fadejob(self):
        #(item, dest, step, delta):
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01' )
        item = self.create_item(smarthome=sh,
                                parent=sh,
                                path='test_item01',
                                config=conf)
        logger.warning("test_fadejob: item={}".format(item))
        item(10)

        item._fading = True
        self.item_fadejob(item, 0, 5, 1)
        self.assertEqual(10, item._value)

        item._fading = False
        self.item_fadejob(item, 0, 5, 0.1)
        self.assertEqual(0, item._value)

        self.item_fadejob(item, 10, 5, 0.1)
        self.assertEqual(10, item._value)

        self.item_fadejob(item, 100, 200, 1)
        self.assertEqual(100, item._value)

    def test_set(self):

        if verbose == True:
            logger.warning('')
            logger.warning('===== test_set:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item.set(12)
        self.assertEqual(12, item._value)

        item.set('13')
        self.assertEqual(13, item._value)
        self.assertIsNone(item.set('qwe'))
        self.assertEqual(13, item._value)
        item.set('14')

    def test_cast_duration(self):
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_item_relative_references:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        self.assertEqual(300, item._cast_duration('5m'))
        self.assertEqual(23, item._cast_duration('23s'))
        self.assertEqual(42, item._cast_duration(42))
        self.assertEqual(42, item._cast_duration('42'))
        self.assertFalse(item._cast_duration('aa'))
        self.assertFalse(item._cast_duration(None))

    def test_call(self):
        if verbose == True:
            logger.warning('')
            logger.warning('===== test_call:')
        sh = MockSmartHome()
        conf = {'type': 'num', 'autotimer': '5m = 42 = compat_1.2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item(12)
        self.assertEqual(12, item._value)
        self.assertEqual(12, item())
        conf = {'type': 'num', 'eval': '2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item(12)
        self.assertEqual(0, item())
        item.set(12)
        self.assertEqual(12, item())

    def test_run_eval(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item._Item__run_eval()
        self.assertEqual(2, item())
        item._eval = 'bla'
        item._Item__run_eval()
        item._eval = 'sh.return_none()'
        item._Item__run_eval()

    def test_jsonvars(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item.set('42')

        self.assertDictEqual(
            item.jsonvars(), {
                'attributes': {},
                'value': 42,
                'type': 'num',
                'children': [],
                'id': 'test_item01',
                'name': 'test_item01'
            })

    #  __run_eval(self, value=None, caller='Eval', source=None, dest=None):
    def test_to_json(self):
        import json
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        item.set('42')
        expected = json.dumps(
            {
                'attributes': {},
                'value': 42,
                'type': 'num',
                'children': [],
                'id': 'test_item01',
                'name': 'test_item01'
            },
            sort_keys=True,
            indent=2)
        self.assertEqual(item.to_json(), expected)

    def test_type(self):
        sh = MockSmartHome()
        conf = {'type': 'num', 'eval': '2'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        self.assertEqual(item.type(), 'num')
        item._type = 'foo'
        self.assertNotEqual(item.type(), 'num')
        self.assertEqual(item.type(), 'foo')

    def test_prev_value(self):
        sh = MockSmartHome()
        conf = {'type': 'num'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')

        self.assertEqual(0, item.prev_value())

        item(12)
        self.assertEqual(0, item.prev_value())

        item(23)
        self.assertEqual(12, item.prev_value())

        item(42)
        self.assertEqual(23, item.prev_value())

    def test_last_prev_change(self):
        import datetime
        import time
        sh = MockSmartHome()
        conf = {'type': 'num'}
        #item = lib.item.item.Item(config=conf, parent=sh, smarthome=sh, path='test_item01')
        item = self.create_item(config=conf,
                                parent=sh,
                                smarthome=sh,
                                path='test_item01')
        sec1 = datetime.datetime.now().time().second
        self.assertEqual(sec1, item.last_change().time().second)
        time.sleep(2)
        item(12)
        self.assertEqual(datetime.datetime.now().time().second,
                         item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)
        self.assertEqual(datetime.datetime.now().time().second,
                         item.last_change().time().second)
        sec2 = datetime.datetime.now().time().second
        time.sleep(2)

        item(12)
        self.assertEqual(sec2, item.last_change().time().second)
        self.assertEqual(sec1, item.prev_change().time().second)

        sec3 = datetime.datetime.now().time().second
        item(23)
        self.assertEqual(sec3, item.last_change().time().second)

    def test_split_duration_value_string(self):
        try:
            lib.item.helpers.split_duration_value_string(
                "", lib.item.item.ATTRIB_COMPAT_DEFAULT)
        except AttributeError:
            lib.item._split_duration_value_string("")

    def test_join_duration_value_string(self):
        #logger.warning(lib.item._join_duration_value_string(12,123))
        #(time, value, compat=''):
        pass

    def test_cachewrite_readjson(self):
        import datetime
        from lib.constants import CACHE_JSON

        self.cache_write_load_value(v=True, f=CACHE_JSON)
        self.cache_write_load_value(v=None, f=CACHE_JSON)
        self.cache_write_load_value(v=1, f=CACHE_JSON)
        self.cache_write_load_value(v=123123123, f=CACHE_JSON)
        self.cache_write_load_value(v="foo", f=CACHE_JSON)
        self.cache_write_load_value(v={
            'active':
            True,
            'list': [{
                'active': True,
                'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU',
                'time': 'sunset+30m',
                'value': 1
            }, {
                'active': True,
                'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU',
                'time': 'sunrise-30m',
                'value': 0
            }]
        },
                                    f=CACHE_JSON)
        self.cache_write_load_value(v={'active': True}, f=CACHE_JSON)
        self.cache_write_load_value(v=[1, 2, 3, 4, 5], f=CACHE_JSON)
        self.cache_write_load_value(v=["a", "2", "3"], f=CACHE_JSON)
        self.cache_write_load_value(v=["a", "2", "3", 2, 3, 4, 5],
                                    f=CACHE_JSON)
        # @TODO: not working : self.cache_write_load_value(v=datetime.datetime.now(), f=CACHE_JSON)

    def test_cachewrite_readpickle(self):
        import datetime
        from lib.constants import CACHE_PICKLE

        self.cache_write_load_value(v=True, f=CACHE_PICKLE)
        self.cache_write_load_value(v=None, f=CACHE_PICKLE)
        self.cache_write_load_value(v=1, f=CACHE_PICKLE)
        self.cache_write_load_value(v=123123123, f=CACHE_PICKLE)
        self.cache_write_load_value(v="foo", f=CACHE_PICKLE)
        self.cache_write_load_value(v={
            'active':
            True,
            'list': [{
                'active': True,
                'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU',
                'time': 'sunset+30m',
                'value': 1
            }, {
                'active': True,
                'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU',
                'time': 'sunrise-30m',
                'value': 0
            }]
        },
                                    f=CACHE_PICKLE)
        self.cache_write_load_value(v={'active': True}, f=CACHE_PICKLE)
        self.cache_write_load_value(v=[1, 2, 3, 4, 5], f=CACHE_PICKLE)
        self.cache_write_load_value(v=["a", "2", "3"], f=CACHE_PICKLE)
        self.cache_write_load_value(v=["a", "2", "3", 2, 3, 4, 5],
                                    f=CACHE_PICKLE)
        self.cache_write_load_value(v=datetime.datetime.now(), f=CACHE_PICKLE)

    def cache_write_load_value(self, v, f):
        from dateutil.tz import gettz

        TZ = gettz('UTC')
        fn = 'test.cache'

        try:
            lib.item.item.cache_write(value=v, filename=fn, cformat=f)
        except:
            lib.item._cache_write(value=v, filename=fn, cformat=f)

        date = cachedvalue = None
        try:
            date, cachedvalue = lib.item.item.cache_read(filename=fn,
                                                         tz=TZ,
                                                         cformat=f)
        except:
            date, cachedvalue = lib.item._cache_read(filename=fn,
                                                     tz=TZ,
                                                     cformat=f)
        #logger.warning(type(cachedvalue))
        self.assertEqual(v, cachedvalue)

    def test_item_jsondump(self):
        sh = MockSmartHome()

        self.load_items('item_dumps', YAML_FILE)

        #logger.warning(self.sh.return_item("item1").to_json())
        #logger.warning(self.sh.return_item("item3.item3b.item3b1").to_json())
        #logger.warning(self.sh.return_item("item3").to_json())
        import json
        self.assertEqual(
            json.loads(self.sh.items.return_item("item3").to_json())['name'],
            self.sh.items.return_item("item3")._name)
        self.assertEqual(
            json.loads(self.sh.items.return_item("item3").to_json())['id'],
            self.sh.items.return_item("item3")._path)
Ejemplo n.º 26
0
 def setUp(self):
     self.sh = MockSmartHome()
     self.plugins = self.sh.with_plugins_from(common.BASE +
                                              "/tests/resources/plugin")
     self.item_conf = self.sh.with_items_from(
         common.BASE + "/tests/resources/plugin_items.conf")
Ejemplo n.º 27
0
 def setUp(self):
     self.sh = MockSmartHome()