コード例 #1
0
def test_zones(mock_post):
    """
    test sequence

    """

    # A response object
    robj = mock.Mock()

    # Simulate a valid login return
    with open(join(TEST_VAR_DIR, 'zones.htm-okay'), 'rb') as f:
        robj.content = f.read()
    robj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.return_value = robj

    uobj = UltraSync()

    # Force valid authentication (for testing purposes)
    uobj._authenticated = True
    uobj.session_id = 'ABCD1234'

    # We should successfully acquire our zones
    assert uobj._zones()
    assert isinstance(uobj._zone_names, dict)
    assert isinstance(uobj._zone_sequence, list)
    assert isinstance(uobj._zone_status, list)
コード例 #2
0
def test_login(mock_post):
    """
    test login

    """

    # A response object
    robj = mock.Mock()

    # Simulate a valid login return
    with open(join(TEST_VAR_DIR, 'login.cgi-okay'), 'rb') as f:
        robj.content = str(f.read().decode('utf-8'))
    robj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.return_value = robj

    uobj = UltraSync()
    assert uobj.login()
コード例 #3
0
ファイル: test_seq.py プロジェクト: Dilepa/ultrasync
def test_sequence(mock_post):
    """
    test sequence

    """

    # A response object
    robj = mock.Mock()

    # Simulate a valid login return
    with open(join(TEST_VAR_DIR, 'seq.json-okay'), 'rb') as f:
        robj.content = f.read()
    robj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.return_value = robj

    uobj = UltraSync()
    # Force valid authentication (for testing purposes)
    uobj._authenticated = True
    uobj.session_id = 'ABCD1234'

    assert isinstance(uobj._sequence(), dict)
コード例 #4
0
def test_zerowire_general_communication(mock_post):
    """
    Test Interlogix ZeroWire Hub Communication

    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.json'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.json'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # An area state response object
    ast_obj = mock.Mock()

    # Simulate initial area status fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'status.json'), 'rb') as f:
        ast_obj.content = f.read()
    ast_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Perform a login which under the hood queries both area.htm and zones.htm
    # (in that order)
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.ZEROWIRE
    assert uobj.version == '3.02'
    assert uobj.release == 'C'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Ready'

    assert isinstance(uobj.zones, dict)
    # we have 8 zones defined in our test file spread across
    # different banks:
    assert len(uobj.zones) == 6
    bank = 0
    assert uobj.zones[bank]['name'] == 'Sensor 1'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 1
    assert uobj.zones[bank]['name'] == 'Sensor 2'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 2
    assert uobj.zones[bank]['name'] == 'Sensor 3'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 3
    assert uobj.zones[bank]['name'] == 'Sensor 4'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    # Our Sensor 5 can not be bypassed
    bank = 7
    assert uobj.zones[bank]['name'] == 'Sensor 5'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is False

    bank = 9
    assert uobj.zones[bank]['name'] == 'Sensor 6'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, zst_obj, ast_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    assert mock_post.call_count == 3
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.json'
    assert mock_post.call_args_list[2][0][0] == \
        'http://zerowire/user/status.json'

    assert isinstance(uobj.areas, dict)
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    # Our sequence got bumped
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Ready'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = seq_obj

    uobj.details(max_age_sec=0)

    # Only 1 query made because seq.json file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert uobj.areas[0]['sequence'] == 1
コード例 #5
0
ファイル: test_comnav_0_106.py プロジェクト: caronc/ultrasync
def test_comnav_0_106_communication(mock_post):
    """
    Test ComNav v0.106 Hub Communication

    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate initial zone configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.xml'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.xml'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # An area state response object
    ast_obj = mock.Mock()

    # Simulate initial area status fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'status.xml'), 'rb') as f:
        ast_obj.content = f.read()
    ast_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Perform a login which under the hood queries both area.htm and zones.htm
    # (in that order)
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.COMNAV
    assert uobj.version == '0.106'
    assert uobj.release == 'j'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Ready'

    assert isinstance(uobj.zones, dict)
    # our total zones defined
    assert len(uobj.zones) == 16
    zone_map = [{
        'bank': 0,
        'name': 'Sensor 1',
    }, {
        'bank': 1,
        'name': 'Sensor 2',
        'status': 'Not Ready',
    }, {
        'bank': 2,
        'name': 'Sensor 3',
    }, {
        'bank': 3,
        'name': 'Sensor 4',
    }, {
        'bank': 15,
        'name': 'Sensor 16',
    }]
    for entry in zone_map:
        assert entry['bank'] in uobj.zones
        assert uobj.zones[entry['bank']]['bank'] == entry['bank']
        assert uobj.zones[entry['bank']]['name'] == entry['name']
        assert uobj.zones[entry['bank']]['sequence'] == 1
        assert uobj.zones[entry['bank']]['status'] == \
            entry.get('status', 'Ready')
        assert uobj.zones[entry['bank']]['can_bypass'] is None

    # A call to login.cgi (which fetches area.html) and then zones.htm
    assert mock_post.call_count == 2
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/login.cgi'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zones.htm'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, ast_obj, zst_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    # Only 1 query made because seq.xml file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert uobj.areas[0]['sequence'] == 1

    # Update our sequence file so that it reflects a change
    # This update will report an area update and 2 zones (bank 0 and 4)
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.w.update.xml'), 'rb') as f:
        seq_obj.content = f.read()

    # A zone state response object
    zst0_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.bank0.w.update.xml'),
              'rb') as f:
        zst0_obj.content = f.read()
    zst0_obj.status_code = requests.codes.ok

    # A zone state response object
    zst4_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.bank4.w.update.xml'),
              'rb') as f:
        zst4_obj.content = f.read()
    zst4_obj.status_code = requests.codes.ok

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, zst0_obj, zst4_obj, ast_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    assert mock_post.call_count == 4
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.xml'
    assert mock_post.call_args_list[2][0][0] == \
        'http://zerowire/user/zstate.xml'
    assert mock_post.call_args_list[3][0][0] == \
        'http://zerowire/user/status.xml'

    assert isinstance(uobj.areas, dict)
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    # Our sequence got bumped because of a status change
    assert uobj.areas[0]['sequence'] == 2
    assert uobj.areas[0]['status'] == 'Not Ready'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = seq_obj

    uobj.details(max_age_sec=0)

    # Only 1 query made because seq.xml file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert uobj.areas[0]['sequence'] == 2
コード例 #6
0
def test_zerowire_armed_communication(mock_post):
    """
    Test Interlogix ZeroWire Hub Communication

    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Perform a login which under the hood queries both area.htm and zones.htm
    # (in that order)
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.ZEROWIRE
    assert uobj.version == '3.02'
    assert uobj.release == 'C'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Exit Delay 1'

    assert isinstance(uobj.zones, dict)
    # we have 6 zones defined in our test file spread across
    # different banks:
    assert len(uobj.zones) == 6
    bank = 0
    assert uobj.zones[bank]['name'] == 'Sensor 1'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 1
    assert uobj.zones[bank]['name'] == 'Sensor 2'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 2
    assert uobj.zones[bank]['name'] == 'Sensor 3'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 3
    assert uobj.zones[bank]['name'] == 'Sensor 4'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    # Our Sensor 5 can not be bypassed
    bank = 7
    assert uobj.zones[bank]['name'] == 'Sensor 5'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is False

    bank = 9
    assert uobj.zones[bank]['name'] == 'Sensor 6'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is False
コード例 #7
0
def test_comnav_0_108_zone_filter(mock_post):
    """
    Test ComNav v0.108 Zone Filtering

    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate initial zone configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.xml'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.xml'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # An area state response object
    ast_obj = mock.Mock()

    # Simulate initial area status fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'status.xml'), 'rb') as f:
        ast_obj.content = f.read()
    ast_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Perform a login which under the hood queries both area.htm and zones.htm
    # (in that order)
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.COMNAV
    assert uobj.version == '0.108'
    assert uobj.release == 'O'

    assert isinstance(uobj.areas, dict)
    # 2 Areas defined
    assert len(uobj.areas) == 2
    assert uobj.areas[0]['name'] == 'AREA 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Ready'

    assert uobj.areas[1]['name'] == 'AREA 2'
    assert uobj.areas[1]['bank'] == 1
    assert uobj.areas[1]['sequence'] == 1
    assert uobj.areas[1]['status'] == 'Ready'

    assert isinstance(uobj.zones, dict)
    # our total zones defined (we want to be sure we don't
    # include the '%2D' or '-')
    assert len(uobj.zones) == 17

    # A call to login.cgi (which fetches area.html) and then zones.htm
    assert mock_post.call_count == 2
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/login.cgi'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zones.htm'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, ast_obj, zst_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    # Only 1 query made because seq.xml file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert uobj.areas[0]['sequence'] == 1

    # Update our sequence file so that it reflects a change
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.w.update.xml'), 'rb') as f:
        seq_obj.content = f.read()

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, ast_obj, zst_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    assert mock_post.call_count == 3
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.xml'
    assert mock_post.call_args_list[2][0][0] == \
        'http://zerowire/user/status.xml'

    assert isinstance(uobj.areas, dict)
    assert len(uobj.areas) == 2
    assert uobj.areas[0]['name'] == 'AREA 1'
    assert uobj.areas[0]['bank'] == 0
    # Our sequence does not change because our status did not
    # change from one state to another
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Ready'

    assert uobj.areas[1]['name'] == 'AREA 2'
    assert uobj.areas[1]['bank'] == 1
    # Our sequence does not change because our status did not
    # change from one state to another
    assert uobj.areas[1]['sequence'] == 1
    assert uobj.areas[1]['status'] == 'Ready'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = seq_obj

    uobj.details(max_age_sec=0)

    # Only 1 query made because seq.xml file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.xml'
    assert uobj.areas[0]['sequence'] == 1
コード例 #8
0
def test_xgen8_nxg8zbo_communication(mock_post):
    """
    Test xGen 8 NXG-8-Z-BO ZeroWire Hub Communication
    Source:
      https://firesecurityproducts.com/en/product/intrusion/NXG_8_Z_BO/82651
    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.json'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.json'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # An area state response object
    ast_obj = mock.Mock()

    # Simulate initial area status fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'status.json'), 'rb') as f:
        ast_obj.content = f.read()
    ast_obj.status_code = requests.codes.ok

    # A sequence response object
    seq2_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.w.update.json'), 'rb') as f:
        seq2_obj.content = f.read()
    seq2_obj.status_code = requests.codes.ok

    # A zone state response object
    zst2_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.w.update.json'), 'rb') as f:
        zst2_obj.content = f.read()
    zst2_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Test that we're a xGen v8
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.XGEN8
    assert uobj.version == '8.000'
    assert uobj.release == '0'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Not Ready'

    assert isinstance(uobj.zones, dict)
    # we have 4 zones defined
    assert len(uobj.zones) == 16
    bank = 0
    assert uobj.zones[bank]['name'] == 'Sensor 1'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 1
    assert uobj.zones[bank]['name'] == 'Sensor 2'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 2
    assert uobj.zones[bank]['name'] == 'Sensor 3'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Not Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    bank = 3
    assert uobj.zones[bank]['name'] == 'Sensor 4'
    assert uobj.zones[bank]['bank'] == bank
    assert uobj.zones[bank]['sequence'] == 1
    assert uobj.zones[bank]['status'] == 'Ready'
    assert uobj.zones[bank]['can_bypass'] is True

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq_obj, zst_obj, ast_obj)

    # Perform Updated Query
    uobj.update(max_age_sec=0)

    assert mock_post.call_count == 3
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.json'
    assert mock_post.call_args_list[2][0][0] == \
        'http://zerowire/user/status.json'

    assert isinstance(uobj.areas, dict)
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    # Our sequence got bumped
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Not Ready'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = seq_obj

    uobj.details(max_age_sec=0)

    # Only 1 query made because seq.json file unchanged
    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Not Ready'

    # Reset our mock object
    mock_post.reset_mock()

    # Update our side effects
    mock_post.side_effect = (seq2_obj, zst2_obj)

    # Perform Detils Query
    details = uobj.details(max_age_sec=0)

    assert details
    assert mock_post.call_count == 2
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.json'

    assert isinstance(uobj.areas, dict)
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    # Our sequence got bumped
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Not Ready'
コード例 #9
0
def test_comnav_0_108_active_burglary(mock_post):
    """
    Test ComNav v0.108 Hub Communication with Burglary in Progress

    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate initial zone configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.xml'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.xml'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # An area state response object
    ast_obj = mock.Mock()

    # Simulate initial area status fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'status.xml'), 'rb') as f:
        ast_obj.content = f.read()
    ast_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()

    # Perform a login which under the hood queries both area.htm and zones.htm
    # (in that order)
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.COMNAV
    assert uobj.version == '0.108'
    assert uobj.release == 'm'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Home'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Burglar Alarm'

    assert isinstance(uobj.zones, dict)
    # our total zones defined
    assert len(uobj.zones) == 17
    zone_map = [{
        'bank': 0,
        'name': 'MasterBed Motion',
    }, {
        'bank': 1,
        'name': 'Living Room Motion',
    }, {
        'bank': 2,
        'name': 'Kitchen/DiningMotion',
    }, {
        'bank': 3,
        'name': 'Theater Motion',
    }, {
        'bank': 4,
        'name': 'Hallway Motion',
    }]
    for entry in zone_map:
        assert entry['bank'] in uobj.zones
        assert uobj.zones[entry['bank']]['bank'] == entry['bank']
        assert uobj.zones[entry['bank']]['name'] == entry['name']
        assert uobj.zones[entry['bank']]['sequence'] == 1
        assert uobj.zones[entry['bank']]['status'] == \
            entry.get('status', 'Ready')
        assert uobj.zones[entry['bank']]['can_bypass'] is None

    # A call to login.cgi (which fetches area.html) and then zones.htm
    assert mock_post.call_count == 2
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/login.cgi'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zones.htm'
コード例 #10
0
def test_xgen8_bypass(mock_post):
    """
    Test xGen 8 Zone Bypass
    """

    # A area response object
    arobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'area.htm'), 'rb') as f:
        arobj.content = f.read()
    arobj.status_code = requests.codes.ok

    # A zone response object
    zrobj = mock.Mock()

    # Simulate a valid login return
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zones.htm'), 'rb') as f:
        zrobj.content = f.read()
    zrobj.status_code = requests.codes.ok

    # A zonefunction response object
    zfun_obj = mock.Mock()

    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zonefunction.json'), 'rb') as f:
        zfun_obj.content = f.read()
    zfun_obj.status_code = requests.codes.ok

    # A sequence response object
    seq_obj = mock.Mock()

    # Simulate initial sequence configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'seq.json'), 'rb') as f:
        seq_obj.content = f.read()
    seq_obj.status_code = requests.codes.ok

    # A zone state response object
    zst_obj = mock.Mock()

    # Simulate initial zone fetch configuration
    with open(join(ULTRASYNC_TEST_VAR_DIR, 'zstate.json'), 'rb') as f:
        zst_obj.content = f.read()
    zst_obj.status_code = requests.codes.ok

    # Assign our response object to our mocked instance of requests
    mock_post.side_effect = (arobj, zrobj)

    uobj = UltraSync()
    # uobj.load('/home/vagabond/.config/ultrasync')

    # Test that we're a xGen v8
    assert uobj.login()
    assert uobj.vendor is NX595EVendor.XGEN8
    assert uobj.version == '8.000'
    assert uobj.release == '0'

    assert isinstance(uobj.areas, dict)
    # we only have 1 area defined in our test file
    assert len(uobj.areas) == 1
    assert uobj.areas[0]['name'] == 'Area 1'
    assert uobj.areas[0]['bank'] == 0
    assert uobj.areas[0]['sequence'] == 1
    assert uobj.areas[0]['status'] == 'Not Ready'

    assert isinstance(uobj.zones, dict)
    # we have 15 zones defined
    assert len(uobj.zones) == 15

    for bank in range(15):
        assert uobj.zones[bank]['name'] == 'Sensor ' + str(bank + 1)
        assert uobj.zones[bank]['bank'] == bank
        assert uobj.zones[bank]['sequence'] == 1
        assert uobj.zones[bank]['status'] == 'Ready' \
            if bank in (0, 1, 3, 4, 5, 7, 8, 12, 13, 14) else 'Not Ready'
        assert uobj.zones[bank]['can_bypass'] is True

    assert uobj.zones[0]['bank_state'] == '000000000000000000'

    # Call set_zone_bypass
    mock_post.reset_mock()
    mock_post.side_effect = (zfun_obj,)

    assert uobj.set_zone_bypass(1, True)

    assert mock_post.call_count == 1
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/zonefunction.cgi'

    # Perform Update and check that the zone is bypassed
    mock_post.reset_mock()
    mock_post.side_effect = (seq_obj, zst_obj)

    uobj.update(max_age_sec=0)

    assert uobj.zones[0]['bank_state'] == '000100000000000000'

    assert mock_post.call_count == 2
    assert mock_post.call_args_list[0][0][0] == \
        'http://zerowire/user/seq.json'
    assert mock_post.call_args_list[1][0][0] == \
        'http://zerowire/user/zstate.json'