Exemplo n.º 1
0
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
Exemplo n.º 2
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
Exemplo n.º 3
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
Exemplo n.º 4
0
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])
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0

@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,