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 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')
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')
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_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'})
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_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_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_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()
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/"
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)
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_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_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_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_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)
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)
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_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')
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']))
def setUp(self): self.sh = MockSmartHome()
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)
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()
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)
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)
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")