def test_build_provision_request_calls_prep_attributes(self, prep_attributes_patch): d = Device() d.name = 'test' d.type = 'Polycom SoundPoint IP 650 + Expansion Module(1)' g = d.build_provision_request() # expect to see two calls self.assertEqual(2, len(prep_attributes_patch.call_args_list))
def test_overwrite_when_no_name_and_fetch_returns_result(self, find_device_patch, delete_patch): i = instance_factory(instance='test') d = Device(mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i) d.overwrite() # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft self.assertFalse(delete_patch.called)
def test_bootstrap_find_result(self): result = {'Available Ports': 'Unlimited', 'Status': 'Online', 'Device Type': 'Generic SIP Phone', 'Net Address': None, 'Version': None, 'Device Name': 'Tim Beaver', 'MAC Address': 'aabbcc112233'} d = Device() d.bootstrap_find_result(result=result) self.assertEqual(d.mac_address, result['MAC Address']) self.assertEqual(d.type, result['Device Type']) self.assertEqual(d.name, result['Device Name']) self.assertIsNone(d.is_primary)
def test_from_shared_call_appearance(self): row = {'Mac Address': 'aa:bb:cc:dd:ee:ff', 'Device Level': 'Group', 'Allow Termination': 'true', 'Allow Origination': 'true', 'Device Type': 'Polycom-VVX1500', 'Is Active': 'true', 'Port Number': None, 'Line/Port': '*****@*****.**', 'Device Support Visual Device Management': 'false', 'Device Name': 'beavervvx', 'SIP Contact': 'sip:'} d = Device() d.bootstrap_shared_call_appearance(sca=row) self.assertEqual(d.mac_address, row['Mac Address']) self.assertEqual(d.type, row['Device Type']) self.assertEqual(d.line_port, row['Line/Port']) self.assertEqual(d.name, row['Device Name']) self.assertFalse(d.is_primary)
def test_fetch_passes_broadsoft_instance( self, get_device_patch, from_xml_patch ): d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory()) d.fetch(target_name='dname') call = get_device_patch.call_args_list[0] args, kwargs = call self.assertIsInstance(kwargs['broadsoftinstance'], broadsoft.requestobjects.lib.BroadsoftRequest.BroadsoftInstance)
def test_device_default_protocols_respected(self): d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone', mac_address='aabbcc112233', protocol=None, transport_protocol=None) ro = d.build_provision_request() g = GroupAccessDeviceAddRequest() self.assertEqual(ro.protocol, g.protocol) self.assertEqual(ro.transport_protocol, g.transport_protocol)
def test_set_password_injects_broadsoftinstance( self, inject_broadsoftinstance_patch, post_patch ): d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(), name='dname') d.set_password(sip_password='******', did=6175551212) self.assertTrue(inject_broadsoftinstance_patch.called) self.assertEqual(1, len(inject_broadsoftinstance_patch.call_args_list)) call = inject_broadsoftinstance_patch.call_args_list[0] args, kwargs = call self.assertIsInstance(kwargs['child'], GroupAccessDeviceModifyRequest)
def test_build_provision_request_injects_broadsoftinstance( self, inject_broadsoftinstance_patch ): d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory()) d.build_provision_request() self.assertTrue(inject_broadsoftinstance_patch.called) self.assertEqual(1, len(inject_broadsoftinstance_patch.call_args_list)) call = inject_broadsoftinstance_patch.call_args_list[0] args, kwargs = call self.assertIsInstance(kwargs['child'], GroupAccessDeviceAddRequest)
def test_overwrite_when_name_provided(self, find_device_patch, delete_patch): i = instance_factory(instance='test') d = Device(name='beaverphone', mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i) d.overwrite() # should not have called find_device_by_mac_and_did() since have a name self.assertFalse(find_device_patch.called) # since a name was inherited, delete() should have been called # self.assertTrue(delete_patch.called) # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft self.assertFalse(delete_patch.called)
def test_xml_converted_to_elementtree_at_init(self): d = Device(xml=""" <ns0:BroadsoftDocument xmlns:ns0="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" protocol="OCI"> <sessionId>dhcp-18-189-4-125.dyn.mit.edu,2017-05-26 15:33:32.605555,3222027341</sessionId> <command echo="" xsi:type="UserGetResponse21"> <serviceProviderId>ENT136</serviceProviderId> <groupId>mit</groupId> <lastName>Beaver</lastName> <firstName>Tim</firstName> <callingLineIdLastName>Beaver</callingLineIdLastName> <callingLineIdFirstName>Tim</callingLineIdFirstName> <hiraganaLastName>Beaver</hiraganaLastName> <hiraganaFirstName>Tim</hiraganaFirstName> <phoneNumber>2212221101</phoneNumber> <extension>1101</extension> <language>English</language> <timeZone>America/New_York</timeZone> <timeZoneDisplayName>(GMT-04:00) (US) Eastern Time</timeZoneDisplayName> <defaultAlias>[email protected]</defaultAlias> <accessDeviceEndpoint> <accessDevice> <deviceLevel>Group</deviceLevel> <deviceName>beaver550</deviceName> </accessDevice> <linePort>[email protected]</linePort> <staticRegistrationCapable>false</staticRegistrationCapable> <useDomain>true</useDomain> <supportVisualDeviceManagement>false</supportVisualDeviceManagement> </accessDeviceEndpoint> <countryCode>1</countryCode> </command> </ns0:BroadsoftDocument> """) self.assertIsInstance(d.xml, Element)
def test_skip_if_exists_set_attr(self): # Account should default to no a = Account() self.assertFalse(a.skip_if_exists) # Device should default to yes d = Device() self.assertTrue(d.skip_if_exists) # Can override Account a = Account(skip_if_exists=True) self.assertTrue(a.skip_if_exists) # Can override Device d = Device(skip_if_exists=False) self.assertFalse(d.skip_if_exists)
def test_skip_if_exists_for_device(self, post_patch): # this should not throw an error d = Device(skip_if_exists=True) d.provision() # this should throw an error d = Device(skip_if_exists=False) with self.assertRaises(RuntimeError): d.provision()
def test_overwrite_when_no_name_and_fetch_returns_no_result(self, find_device_patch, delete_patch): i = instance_factory(instance='test') d = Device(mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i) d.overwrite() # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft self.assertFalse(delete_patch.called) # check the call to find_device_by_mac_and_did() # args, kwargs = find_device_patch.call_args_list[0] # self.assertEqual(d.mac_address, kwargs['mac_address']) # self.assertEqual(d.did, kwargs['did']) # self.assertEqual(i, kwargs['broadsoftinstance']) # device should not have inherited a name at this point self.assertEqual('Generic', d.name) # since a name was not inherited, delete() should not have been called self.assertFalse(delete_patch.called)
def test_delete_device_passes_back_delete_object_when_bundling( self, post_patch ): # when we're bundling, should just pass back request object; shouldn't actually post it d = Device(name='dname') d.delete(bundle=True) self.assertFalse(post_patch.called) # when we're not bundling, should actually try to post it d = Device(name='dname') d.delete(bundle=False) self.assertTrue(post_patch.called)
def test_derive_line_port(self): # implicit broadsoftinstance d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', index=1) self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain, d.line_port) # implicit broadsoftinstance with no index d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33') self.assertEqual('6175551212@' + d.broadsoftinstance.default_domain, d.line_port) # not test broadsoftinstance i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod') d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', broadsoftinstance=i, index=1) self.assertEqual('6175551212_' + str(d.index) + '@' + i.default_domain, d.line_port) # test broadsoftinstance i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test') d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', broadsoftinstance=i, index=1) self.assertEqual('6175551212_' + str(d.index) + '@' + i.default_domain, d.line_port) # passing prod instance to Device i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod') d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', instance='prod', index=1) self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain, d.line_port) # passing test instance to Device i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test') d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', instance='test', index=1) self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain, d.line_port)
def test_xml_converted_to_elementtree_at_from_xml(self): d = Device() d.xml = """<?xml version="1.0" encoding="ISO-8859-1"?> <BroadsoftDocument protocol="OCI" xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <sessionId xmlns="">192.168.0.100,1476473244,1496170270368</sessionId> <command echo="" xsi:type="GroupAccessDeviceGetResponse18sp1" xmlns=""> <deviceType>Polycom SoundPoint IP 550</deviceType> <protocol>SIP 2.0</protocol> <description>the 550 what tim uses</description> <numberOfPorts> <quantity>4</quantity> </numberOfPorts> <numberOfAssignedPorts>1</numberOfAssignedPorts> <status>Online</status> <configurationMode>Default</configurationMode> <transportProtocol>Unspecified</transportProtocol> <useCustomUserNamePassword>false</useCustomUserNamePassword> </command> </BroadsoftDocument> """ d.from_xml() self.assertIsInstance(d.xml, Element)
def test_device_should_skip_error(self): d = Device(skip_if_exists=True) self.assertFalse(d.should_skip_error(error='blah')) self.assertTrue( d.should_skip_error( error= 'the SOAP server threw an error: [Error 4500] Access Device already exists: 6173000066_1 :: [Error 4500] Access Device already exists: 6173000066_1 :: None' )) d = Device(skip_if_exists=False) self.assertFalse(d.should_skip_error(error='blah')) self.assertFalse( d.should_skip_error( error= 'the SOAP server threw an error: [Error 4500] Access Device already exists: 6173000066_1 :: [Error 4500] Access Device already exists: 6173000066_1 :: None' ))
def test_delete_passes_broadsoftinstance( self, post_patch, delete_init_patch, delete_execute_patch ): # when bundle is True (check __init__ on GroupAccessDeviceDeleteRequest) i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test') d = Device(name='dname', broadsoftinstance=i) d.delete(bundle=True) call = delete_init_patch.call_args_list[0] args, kwargs = call self.assertIsInstance(kwargs['broadsoftinstance'], broadsoft.requestobjects.lib.BroadsoftRequest.TestBroadsoftInstance) # when bundle is False (check GroupAccessDeviceDeleteRequest.delete_device) i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod') d = Device(name='dname', broadsoftinstance=i) d.delete(bundle=False) call = delete_execute_patch.call_args_list[0] args, kwargs = call self.assertIsInstance(kwargs['broadsoftinstance'], broadsoft.requestobjects.lib.BroadsoftRequest.BroadsoftInstance)
def test_device_attrs_get_passed_to_request_object(self): d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone', instance='test', mac_address='aabbcc112233', protocol='gopher', transport_protocol='ftp') ro = d.build_provision_request() self.assertEqual(d.name, ro.device_name) #self.assertEqual(d.type, ro.device_type) self.assertEqual(d.mac_address, ro.mac_address) self.assertEqual(d.protocol, ro.protocol) self.assertEqual(d.transport_protocol, ro.transport_protocol) # try again, with prod instance d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone', instance='prod', mac_address='aabbcc112233', protocol='gopher', transport_protocol='ftp') ro = d.build_provision_request() self.assertEqual(d.name, ro.device_name) #self.assertEqual(d.type, ro.device_type) self.assertEqual(d.mac_address, ro.mac_address) self.assertEqual(d.protocol, ro.protocol) self.assertEqual(d.transport_protocol, ro.transport_protocol)
def test_fetch( self, get_device_patch, from_xml_patch ): # d.name set, target_name not d = Device(name='beaverphone') d.fetch() call = get_device_patch.call_args_list[0] args, kwargs = call self.assertEqual('beaverphone', kwargs['name']) # d.name set, target_name set d = Device(name='beaverphone') d.fetch(target_name='beaverandroid') call = get_device_patch.call_args_list[1] args, kwargs = call self.assertEqual('beaverandroid', kwargs['name']) # d.name not set, target_name set d = Device() d.fetch(target_name='beaverandroid') call = get_device_patch.call_args_list[2] args, kwargs = call self.assertEqual('beaverandroid', kwargs['name'])
def test_implicit_overwrite_respected(self, device_overwrite_patch, account_overwrite_patch, post_patch): i = instance_factory(instance='test') # doing this with a Device since raw BroadsoftObject doesn't have an overwrite or build_provision_request method # with default value for implicit overwrite (False) d = Device(mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i) d.provision() self.assertFalse(device_overwrite_patch.called) device_overwrite_patch.called = False # with False for implicit overwrite d = Device(mac_address='aabbcc112233', did=6175551212, implicit_overwrite=False, broadsoftinstance=i) self.assertFalse(device_overwrite_patch.called) d.provision() device_overwrite_patch.called = False # with True for implicit overwrite d = Device(mac_address='aabbcc112233', did=6175551212, implicit_overwrite=True, broadsoftinstance=i) d.provision() self.assertTrue(device_overwrite_patch.called) # doing it again with an Account # with default value for implicit overwrite (False) a = Account(did=6175551212, sip_user_id='*****@*****.**', email='*****@*****.**', broadsoftinstance=i) a.provision() self.assertFalse(account_overwrite_patch.called) account_overwrite_patch.called = False # with False for implicit overwrite a = Account(did=6175551212, sip_user_id='*****@*****.**', email='*****@*****.**', implicit_overwrite=False, broadsoftinstance=i) self.assertFalse(account_overwrite_patch.called) a.provision() account_overwrite_patch.called = False # with True for implicit overwrite a = Account(did=6175551212, sip_user_id='*****@*****.**', email='*****@*****.**', implicit_overwrite=True, broadsoftinstance=i) a.provision() self.assertTrue(account_overwrite_patch.called)
def load_devices(self): # if there's no XML for the user, fetch entire User. Primary device will be in User record, rest found by # searching for shared call appearances. Since .fetch() calls .load_devices(), will wind up back here. if self.xml is None: self.fetch() # if there is XML for the user... else: # first, any that were directly in xml for ade in self.xml.findall('./command/accessDeviceEndpoint'): d = Device() self.inject_broadsoftinstance(child=d) # the <accessDeviceEndpoint> gives us enough info to actually fetch the device d.bootstrap_access_device_endpoint(ade=ade) d.fetch(target_name=d.name) self.devices.append(d) # now find any shared call appearances sca_xml = UserSharedCallAppearanceGetRequest.get_devices(sip_user_id=self.sip_user_id, broadsoftinstance=self.broadsoftinstance) scas = BroadsoftRequest.convert_results_table(xml=sca_xml) for sca in scas: d = Device() self.inject_broadsoftinstance(child=d) # the shared call appearance listings give us nearly everything about a device, but we run a fetch as well # to get everything d.bootstrap_shared_call_appearance(sca=sca) d.fetch(target_name=d.name) self.devices.append(d)
def attach_sca(self, index=None): d = Device(logging_level=self.logging_level) d.index = self.derive_sca_index(index=index) d.broadsoftinstance = self.broadsoftinstance d.logging_level = self.logging_level d.is_primary = False d.did = self.did d.description = self.attach_default_devices__build_description() d.type = 'Generic SIP Phone' d.derive_line_port() d.implicit_overwrite = False d.skip_if_exists = True self.devices.append(d)
def attach_primary_device(self): # attach a primary device, with no line_port suffix d = Device(logging_level=self.logging_level) d.broadsoftinstance = self.broadsoftinstance d.logging_level = self.logging_level d.is_primary = True d.did = self.did d.description = self.attach_default_devices__build_description() d.type = 'Generic SIP Phone' d.derive_line_port() d.implicit_overwrite = False d.skip_if_exists = True self.devices.append(d)
def test_set_password_deriving_sip_user_name( self, device_mod_patch, post_patch ): b = BroadsoftRequest() # just a did d = Device(name='devicename') d.set_password(did=6175551212, sip_password='******') call = device_mod_patch.call_args_list[0] args, kwargs = call self.assertEqual('6175551212@' + d.broadsoftinstance.default_domain, kwargs['sip_user_name']) # just a sip_user_name d = Device(name='devicename') d.set_password(sip_user_name='*****@*****.**', sip_password='******') call = device_mod_patch.call_args_list[1] args, kwargs = call self.assertEqual('*****@*****.**', kwargs['sip_user_name']) # both; sip_user_name should win d = Device(name='devicename') d.set_password(did=6175551212, sip_user_name='*****@*****.**', sip_password='******') call = device_mod_patch.call_args_list[2] args, kwargs = call self.assertEqual('*****@*****.**', kwargs['sip_user_name'])
def test_set_password_requirements( self, device_mod_patch, post_patch ): # requires device name with self.assertRaises(ValueError): d = Device(name=None) d.set_password(sip_user_name='*****@*****.**', sip_password='******') # requires did or sip_user_name with self.assertRaises(ValueError): d = Device(name='dname') d.set_password(sip_password='******') # requires password with self.assertRaises(ValueError): d = Device(name='dname') d.set_password(sip_user_name='*****@*****.**')
def test_init_calls_broadsoftobject_init(self, bo_init_patch): d = Device() self.assertTrue(bo_init_patch.called)
def test_delete_device_barfs_if_no_name( self, post_patch ): d = Device(name=None) with self.assertRaises(ValueError): d.delete()