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)
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()
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)
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
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
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
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
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'
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'
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'