def test_add_remove(sqldb): db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) # Rules assert len(db._rules) == 0 rule = db.add_rule( rules_db.RulesRow( RuleID=501, Name="Long Press Rule", Type=MOCK_RULE_TYPE, State=1, )) assert len(db._rules) == 1 db.remove_rule(rule) assert len(db._rules) == 0 # RuleDevices assert len(db._rule_devices) == 0 device = db.add_rule_devices( rules_db.RuleDevicesRow(RuleDevicePK=1, RuleID=501, DeviceID=MOCK_UDN)) assert len(db._rule_devices) == 1 db.remove_rule_devices(device) assert len(db._rule_devices) == 0 # TargetDevices assert len(db._target_devices) == 0 target = db.add_target_devices( rules_db.TargetDevicesRow(RuleID=501, DeviceID=MOCK_TARGET_UDN)) assert len(db._target_devices) == 1 db.remove_target_devices(target) assert len(db._target_devices) == 0
def test_clear_all(sqldb): db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) rule = db.add_rule( rules_db.RulesRow( RuleID=501, Name="Long Press Rule", Type=MOCK_RULE_TYPE, State=1, )) assert len(db._rules) == 1 # RuleDevices assert len(db._rule_devices) == 0 device = db.add_rule_devices( rules_db.RuleDevicesRow(RuleDevicePK=1, RuleID=501, DeviceID=MOCK_UDN)) assert len(db._rule_devices) == 1 # TargetDevices assert len(db._target_devices) == 0 target = db.add_target_devices( rules_db.TargetDevicesRow(RuleID=501, DeviceID=MOCK_TARGET_UDN)) assert len(db._target_devices) == 1 db.clear_all() assert len(db._rules) == 0 assert len(db._rule_devices) == 0 assert len(db._target_devices) == 0
def test_update_if_modified_new_entry(sqldb): rule = rules_db.RulesRow(RuleID=501) db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) assert db.update_if_modified() is False # Adding a new entry in the db should cause update_if_modified() to be True db.add_target_device_to_rule(rule, MOCK_TARGET_UDN) assert db.update_if_modified() is True
def test_get_target_devices_for_rule(sqldb): cursor = sqldb.cursor() rule = rules_db.RulesRow(RuleID=501) rules_db.TargetDevicesRow( RuleID=rule.RuleID, DeviceID=MOCK_TARGET_UDN, ).update_db(cursor) db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) assert db.get_target_devices_for_rule(rule) == frozenset([MOCK_TARGET_UDN])
def test_add_remove_target_device_to_rule(sqldb): rule = rules_db.RulesRow(RuleID=501) db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) assert MOCK_TARGET_UDN not in db.get_target_devices_for_rule(rule) db.add_target_device_to_rule(rule, MOCK_TARGET_UDN) assert MOCK_TARGET_UDN in db.get_target_devices_for_rule(rule) db.remove_target_device_from_rule(rule, MOCK_TARGET_UDN) assert MOCK_TARGET_UDN not in db.get_target_devices_for_rule(rule)
def test_update_if_modified_field_changed(sqldb): cursor = sqldb.cursor() rules_db.RulesRow( RuleID=501, Name="Long Press Rule", Type=MOCK_RULE_TYPE, State=1, ).update_db(cursor) rules_db.RuleDevicesRow(RuleDevicePK=1, RuleID=501, DeviceID=MOCK_UDN).update_db(cursor) db = rules_db.RulesDb(sqldb, MOCK_UDN, MOCK_NAME) rule, device = db.rules_for_device()[0] assert db.update_if_modified() is False # Modifying an entry in the db should cause update_if_modified() to be True rule.State = 0 assert db.update_if_modified() is True
def test_rules_db_from_device(temp_file, sqldb): rules_db.RulesRow(RuleID=501, Name="", Type="").update_db(sqldb.cursor()) sqldb.commit() sqldb.close() zip_content = base64.b64decode(rules_db._pack_db(temp_file, "inner.db")) mock_response = create_autospec(urllib3.HTTPResponse, instance=True) mock_response.status = 200 mock_response.data = zip_content store_rules = [] class Device: name = MOCK_NAME udn = MOCK_UDN session = Session("http://localhost/") class rules: @staticmethod def FetchRules(): return { "ruleDbVersion": "1", "ruleDbPath": "http://localhost/rules.db", } @staticmethod def StoreRules(**kwargs): store_rules.append(kwargs) with patch("urllib3.PoolManager.request", return_value=mock_response) as mock_request: with rules_db.rules_db_from_device(Device) as db: mock_request.assert_called_once_with( method="GET", url="http://localhost/rules.db") # Make a modification to trigger StoreRules. assert len(db._rules) == 1 db._rules[501].State = 1 assert len(store_rules) == 1 assert store_rules[0]["ruleDbVersion"] == 2 assert len(store_rules[0]["ruleDbBody"]) > 1000
@pytest.mark.parametrize( "test_input,expected", [ # Test case 0: No long press existed in the database. # Expect that a new entry is generated. ( [], [ ( rules_db.RulesRow( RuleID=1, Name=f"{MOCK_NAME} Long Press Rule", Type=long_press.RULE_TYPE_LONG_PRESS, RuleOrder=0, StartDate="12201982", EndDate="07301982", State=1, Sync="NOSYNC", ), rules_db.RuleDevicesRow( RuleDevicePK=1, RuleID=1, DeviceID=MOCK_UDN, GroupID=0, DayID=-1, StartTime=60, RuleDuration=86340, StartAction=long_press.ActionType.TOGGLE.value, EndAction=-1.0, SensorDuration=-1,