def test_folder(self): s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) account = s.account() folder = s.clientfolder(account.accountId) self.assertTrue(not folder.clientFolderId is None, "Did not get clientFolderId")
def test_subscribe(self): s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email':email}) contact_id = contacts.contacts[0].contactId result = s.create_subscription(contact_id, settings.ICONTACT_MAIN_LIST_ID) self.assertTrue(len(result.subscriptions) == 1)
def test_unsubscribe(self): # note, you can't unsubscribe, you can only move them to a holding list s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email':email}) contact_id = contacts.contacts[0].contactId result = s.move_subscriber(settings.ICONTACT_MAIN_LIST_ID, contact_id, settings.ICONTACT_HOLDING_LIST_ID) self.assertTrue(result.subscription.listId == settings.ICONTACT_HOLDING_LIST_ID)
def test_subscribe(self): s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email': email}) contact_id = contacts.contacts[0].contactId result = s.create_subscription(contact_id, settings.ICONTACT_MAIN_LIST_ID) self.assertTrue(len(result.subscriptions) == 1)
def test_find_or_create_contact(self): s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email':email}) if contacts.total == 0: contacts = s.create_contact(email, firstName='Firstname', lastName='Lastname') self.assertTrue(contacts.contacts[0].email == email, "Contacts=%s" % (contacts,)) else: self.assertTrue(contacts.contacts[0].email == email)
def test_prepare_url(self): baseurl = settings.ICONTACT_URL account_id = settings.ICONTACT_ACCOUNT_ID folder_id = settings.ICONTACT_FOLDER_ID resource_url = 'contacts/' client = IContactClient(folder_id=folder_id, account_id=account_id) url = client.prepare_url(resource_url=resource_url) self.assertEqual( '{base}a/{account}/c/{folder}/contacts/'.format( folder=folder_id, account=account_id, base=baseurl), url)
def test_unsubscribe(self): # note, you can't unsubscribe, you can only move them to a holding list s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email': email}) contact_id = contacts.contacts[0].contactId result = s.move_subscriber(settings.ICONTACT_MAIN_LIST_ID, contact_id, settings.ICONTACT_HOLDING_LIST_ID) self.assertTrue( result.subscription.listId == settings.ICONTACT_HOLDING_LIST_ID)
def test_find_or_create_contact(self): s = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) email = '*****@*****.**' contacts = s.search_contacts({'email': email}) if contacts.total == 0: contacts = s.create_contact(email, firstName='Firstname', lastName='Lastname') self.assertTrue(contacts.contacts[0].email == email, "Contacts=%s" % (contacts, )) else: self.assertTrue(contacts.contacts[0].email == email)
def client(self): """ Instantiate the client class to make authenticated calls to icontact. """ if self._client is None: self._client = IContactClient() return self._client
def setUp(self): self.ICONTACT_API_KEY = os.environ['ICONTACT_API_KEY'] self.ICONTACT_USERNAME = os.environ['ICONTACT_USERNAME'] self.ICONTACT_PASSWORD = os.environ['ICONTACT_PASSWORD'] self.ICONTACT_ACCOUNT_ID = os.environ.get('ICONTACT_ACCOUNT_ID', None) self.ICONTACT_CLIENT_FOLDER_ID = os.environ.get( 'ICONTACT_CLIENT_FOLDER_ID', None) self.ICONTACT_MAIN_LIST_ID = os.environ.get('ICONTACT_MAIN_LIST_ID', None) self.ICONTACT_HOLDING_LIST_ID = os.environ.get( 'ICONTACT_HOLDING_LIST_ID', None) self.client = IContactClient( self.ICONTACT_API_KEY, self.ICONTACT_USERNAME, self.ICONTACT_PASSWORD, account_id=self.ICONTACT_ACCOUNT_ID, client_folder_id=self.ICONTACT_CLIENT_FOLDER_ID, url=IContactClient.ICONTACT_SANDBOX_API_URL, )
def setUp(self): self.ICONTACT_API_KEY = os.environ['ICONTACT_API_KEY'] self.ICONTACT_USERNAME = os.environ['ICONTACT_USERNAME'] self.ICONTACT_PASSWORD = os.environ['ICONTACT_PASSWORD'] self.ICONTACT_ACCOUNT_ID = os.environ.get('ICONTACT_ACCOUNT_ID', None) self.ICONTACT_CLIENT_FOLDER_ID = os.environ.get( 'ICONTACT_CLIENT_FOLDER_ID', None) self.ICONTACT_MAIN_LIST_ID = os.environ.get('ICONTACT_MAIN_LIST_ID', None) self.ICONTACT_HOLDING_LIST_ID = os.environ.get( 'ICONTACT_HOLDING_LIST_ID', None) self.client = IContactClient( self.ICONTACT_API_KEY, self.ICONTACT_USERNAME, self.ICONTACT_PASSWORD, account_id=self.ICONTACT_ACCOUNT_ID, client_folder_id=self.ICONTACT_CLIENT_FOLDER_ID, url='https://api.icpro.co/icp/', api_version='2.3', )
def setUp(self): self._client = IContactClient() self.data = {"email": "*****@*****.**"} self.create_data = {'contact': {"email": "*****@*****.**"}}
class IContactClientTests(TestCase): """ Tests for the Icontact Client """ def setUp(self): self._client = IContactClient() self.data = {"email": "*****@*****.**"} self.create_data = {'contact': {"email": "*****@*****.**"}} def test_get_headers(self): headers = self._client._get_headers() self.assertEqual(6, len(headers)) needed_headers = ['Accept', 'Content-Type', 'Api-Version', 'App-AppId', 'Api-Username', 'API-PASSWORD'] for header in headers: self.assertIn(header, headers) self.assertNotIn('Crazy-header', headers) self.assertIsInstance(headers, dict) def test_prepare_url(self): baseurl = settings.ICONTACT_URL account_id = settings.ICONTACT_ACCOUNT_ID folder_id = settings.ICONTACT_FOLDER_ID resource_url = 'contacts/' client = IContactClient(folder_id=folder_id, account_id=account_id) url = client.prepare_url(resource_url=resource_url) self.assertEqual( '{base}a/{account}/c/{folder}/contacts/'.format( folder=folder_id, account=account_id, base=baseurl), url) def test_process_response(self): #lets try it out with an real url url = self._client.prepare_url(resource_url='contacts/') r = requests.get(url, headers=self._client._get_headers()) json_response = self._client.process_response(r) self.assertIsInstance(json_response, dict) #accesing a resource that doent exists should rise an error url = self._client.prepare_url(resource_url='contacts/1/') r = requests.get(url, headers=self._client._get_headers()) self.assertRaises(IContactException, self._client.process_response, r) #accesing crazy url should raise exception url = self._client.prepare_url(resource_url='contactus/1/') r = requests.get(url, headers=self._client._get_headers()) self.assertRaises(IContactException, self._client.process_response, r) def test_create_contact(self): client = self._client r = client.create_contact(payload=self.create_data) contact = r['contacts'][0] self.assertEqual('*****@*****.**', contact['email']) self.assertTrue(contact['contactId']) #it would rise an exception to created a client without the required #email or with bad formatting data = {'contact': {"email": ""}} self.assertRaises(IContactException, client.create_contact, payload=data) def test_get_contacts(self): client = self._client r = client.get_contacts() self.assertIsInstance(r, dict) total = r['total'] contacts = r['contacts'] self.assertEqual(total, len(contacts)) #TODO: find a way around this @unittest.skip("""icontact keeps old data and this function doesnt work properly""") def test_update_contact(self): client = self._client r = client.create_contact(payload=self.create_data) contact = r['contacts'][0] contact_id = contact['contactId'] self.assertEqual('*****@*****.**', contact['email']) r = client.update_contact(contact_id=contact_id, payload=self.data) contact = r['contact'] self.assertEqual(contact['email'], self.data['email']) def test_get_contact(self): client = self._client #lets create a client to retrive it r = client.create_contact(payload=self.create_data) contact = r['contacts'][0] contact_id = contact['contactId'] self.assertEqual('*****@*****.**', contact['email']) #retriving client r = client.get_contact(contact_id) new_contact = r['contact'] self.assertEqual('*****@*****.**', contact['email']) new_contact_id = new_contact['contactId'] self.assertEqual(contact_id, new_contact_id) #retriving a client that doesn't exists should rise an exception self.assertRaises(IContactException, client.get_contact, 23) def test_delete_contact(self): client = self._client #create contact r = client.create_contact(payload=self.create_data) contact = r['contacts'][0] contact_id = contact['contactId'] #delete contact r = client.delete_contact(contact_id=contact_id) self.assertFalse(len(r)) #deleting client that doesnt exists raises exception self.assertRaises(IContactException, client.delete_contact, contact_id) def test_subscription(self): client = self._client r = client.create_contact(payload=self.create_data) contact = r['contacts'][0] contact_id = contact['contactId'] subs = client.subscribe(contact_id=contact_id) num_subscribtions = len(subs) self.assertIn('subscriptions', subs) #subscribing again raises an exception self.assertRaises(IContactException, client.subscribe, contact_id)
class ClientTestCase(unittest.TestCase): def setUp(self): self.ICONTACT_API_KEY = os.environ['ICONTACT_API_KEY'] self.ICONTACT_USERNAME = os.environ['ICONTACT_USERNAME'] self.ICONTACT_PASSWORD = os.environ['ICONTACT_PASSWORD'] self.ICONTACT_ACCOUNT_ID = os.environ.get('ICONTACT_ACCOUNT_ID', None) self.ICONTACT_CLIENT_FOLDER_ID = os.environ.get( 'ICONTACT_CLIENT_FOLDER_ID', None) self.ICONTACT_MAIN_LIST_ID = os.environ.get('ICONTACT_MAIN_LIST_ID', None) self.ICONTACT_HOLDING_LIST_ID = os.environ.get( 'ICONTACT_HOLDING_LIST_ID', None) self.client = IContactClient( self.ICONTACT_API_KEY, self.ICONTACT_USERNAME, self.ICONTACT_PASSWORD, account_id=self.ICONTACT_ACCOUNT_ID, client_folder_id=self.ICONTACT_CLIENT_FOLDER_ID, url=IContactClient.ICONTACT_SANDBOX_API_URL, ) def test_account(self): account = self.client.account() self.assertIsNotNone(account, "Did not get account object") self.assertTrue( long(account.accountId) > 0, "Did not get valid accountId") def test_folder(self): account = self.client.account() folder = self.client.clientfolder(account.accountId) self.assertIsNotNone(folder.clientFolderId, "Did not get clientFolderId") def test_find_or_create_contact(self): email = '*****@*****.**' contacts = self.client.search_contacts({'email': email}) if contacts.total == 0: contacts = self.client.create_contact(email, firstName='Firstname', lastName='Lastname') self.assertTrue(contacts.contacts[0].email == email, "Contacts=%s" % (contacts, )) else: self.assertTrue(contacts.contacts[0].email == email) def test_subscribe(self): email = '*****@*****.**' contacts = self.client.search_contacts({'email': email}) contact_id = contacts.contacts[0].contactId result = self.client.subscriptions(filters={'contactId': contact_id}) if result.total == 0: result = self.client.create_subscription( contact_id, self.ICONTACT_MAIN_LIST_ID) self.assertTrue(len(result.subscriptions) == 1) def test_unsubscribe(self): # note, you can't un-subscribe, you can only move them to a holding list email = '*****@*****.**' contacts = self.client.search_contacts({'email': email}) contact_id = contacts.contacts[0].contactId try: result = self.client.move_subscriber(self.ICONTACT_MAIN_LIST_ID, contact_id, self.ICONTACT_HOLDING_LIST_ID) self.assertTrue(result.subscription.listId == str( self.ICONTACT_HOLDING_LIST_ID)) except IContactServerError, e: if e.http_status == 400 and 'No Changes Made' in e.errors: pass else: raise e
class ClientTestCase(unittest.TestCase): def setUp(self): self.ICONTACT_API_KEY = os.environ['ICONTACT_API_KEY'] self.ICONTACT_USERNAME = os.environ['ICONTACT_USERNAME'] self.ICONTACT_PASSWORD = os.environ['ICONTACT_PASSWORD'] self.ICONTACT_ACCOUNT_ID = os.environ.get('ICONTACT_ACCOUNT_ID', None) self.ICONTACT_CLIENT_FOLDER_ID = os.environ.get( 'ICONTACT_CLIENT_FOLDER_ID', None) self.ICONTACT_MAIN_LIST_ID = os.environ.get('ICONTACT_MAIN_LIST_ID', None) self.ICONTACT_HOLDING_LIST_ID = os.environ.get( 'ICONTACT_HOLDING_LIST_ID', None) self.client = IContactClient( self.ICONTACT_API_KEY, self.ICONTACT_USERNAME, self.ICONTACT_PASSWORD, account_id=self.ICONTACT_ACCOUNT_ID, client_folder_id=self.ICONTACT_CLIENT_FOLDER_ID, url='https://api.icpro.co/icp/', api_version='2.3', ) def test_account(self): account = self.client.account() self.assertIsNotNone(account, "Did not get account object") self.assertTrue( long(account.accountId) > 0, "Did not get valid accountId") def test_folder(self): account = self.client.account() folder = self.client.clientfolder(account.accountId) self.assertIsNotNone(folder.clientFolderId, "Did not get clientFolderId") def TEST_CONTACT(self): email = '*****@*****.**' contact = { 'email': email, 'firstName': 'Firstname', 'lastName': 'Lastname' } contacts = self.client.create_or_update_contact(data=[contact]) self.assertTrue(contacts.contacts[0].email == email, "Contacts=%s" % (contacts, )) def TEST_SUBSCRIPTION(self): email = '*****@*****.**' contacts = self.client.search_contacts({'email': email}) contact_id = contacts.contacts[0].contactId subscription = { 'contactId': contact_id, 'listId': self.ICONTACT_MAIN_LIST_ID, 'status': 'normal' } subscriptions = self.client.subscriptions( filters={'contactId': contact_id}) if subscriptions.total == 0: # test `create_or_update_subscription` result = self.client.create_or_update_subscription( data=[subscription]) self.assertTrue( len(result.subscriptions) == 1, "Subscriptions=%s" % (result, )) else: self.assertTrue( subscriptions.subscriptions[0].contactId == contact_id) ''' # @TODO: fix me, API returns error as "No changes detected" # test `move_subscriber` result = self.client.move_subscriber( self.ICONTACT_MAIN_LIST_ID, contact_id, self.ICONTACT_HOLDING_LIST_ID) self.assertTrue(result.subscription.listId == str(self.ICONTACT_HOLDING_LIST_ID)) ''' # test delete contact result = self.client.delete_contact(contact_id) def test_contact_and_subscription(self): self.TEST_CONTACT() self.TEST_SUBSCRIPTION()
def get_client(self): client = IContactClient(settings.ICONTACT_API_KEY, settings.ICONTACT_USERNAME, settings.ICONTACT_PASSWORD) return client
class IContactObserver(object): """ Class that utilizes icontact client to sync model with icontact service """ def __init__(self, client=None): """ Initialize an instance of the CalendarObserver class. """ self.adapters = {} self._client = client def observe(self, model, adapter): """ Establishes a connection between the model and Google Calendar, using adapter to transform data. """ self.adapters[model] = adapter signals.post_save.connect(self.on_update, sender=model) signals.post_delete.connect(self.on_delete, sender=model) def on_update(self, **kwargs): """ Called by Django's signal mechanism when an observed model is updated. """ created = kwargs.get('created', False) if created: logging.debug("Created") self.create(kwargs['sender'], kwargs['instance']) return logging.debug("Updating") self.update(kwargs['sender'], kwargs['instance']) def on_delete(self, **kwargs): """ Called by Django's signal mechanism when an observed model is deleted. """ self.delete(kwargs['sender'], kwargs['instance']) def client(self): """ Instantiate the client class to make authenticated calls to icontact. """ if self._client is None: self._client = IContactClient() return self._client def get_contact(self, instance): """ gets a contact from icontact service """ contact_id = IContact.objects.get_contact_id(instance) logging.debug("contact id: {id}".format(id=contact_id)) try: contact = self._client.get_contact(contact_id) except IContactException: return None logging.debug('contact retrived') logging.debug(contact) return contact def create(self, sender, instance): """ creates a new contact on icontact's datata base as well as a iContact instance """ adapter = self.adapters[sender] logging.debug('Adapter: {adapter}'.format(adapter=adapter)) client = self.client() contact = adapter.get_contact_data(instance) #IcontactData instance data = contact.get_data() logging.debug("contact's data: %s"%data) try: icontact = client.create_contact(payload=data) contact_id = icontact['contacts'][0]['contactId'] subscription = client.subscribe(contact_id) except IContactException: return None IContact.objects.set_contact_id(instance, contact_id) def update(self, sender, instance): """ Update or create an Icontact Contact. By default the client subscribes to the deault list specified in settings.py """ adapter = self.adapters[sender] client = self.client() contact = adapter.get_contact_data(instance) #IcontactData instance data = contact.get_data() logging.debug(data) logging.debug(data['contact']) try: icontact = self.get_contact(instance) contact_id = icontact['contact']['contactId'] client.update_contact(contact_id=contact_id, payload=data['contact']) except IContactException: return None IContact.objects.set_contact_id(instance, contact_id) def delete(self, sender, instance): """ Deletes iContact record from their service and from our database """ adapter = self.adapters[sender] client = self.client() contact = adapter.get_contact_data(instance) #IcontactData instance icontact = self.get_contact(instance) if not icontact: return None contact_id = icontact['contact']['contactId'] try: client.delete_contact(contact_id) #delete from icontact except IContactException: pass IContact.objects.delete_contact_id(instance) #delete from database