示例#1
0
 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")
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 def client(self):
     """
     Instantiate the client class to make authenticated calls to icontact.
     """
     if self._client is None:
         self._client = IContactClient()
     return self._client
示例#10
0
    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,
        )
示例#11
0
    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',
        )
示例#12
0
 def setUp(self):
     self._client = IContactClient()
     self.data = {"email": "*****@*****.**"}
     self.create_data = {'contact': {"email": "*****@*****.**"}}
示例#13
0
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)
示例#14
0
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
示例#15
0
 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")
示例#16
0
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()
示例#17
0
 def get_client(self):
     client = IContactClient(settings.ICONTACT_API_KEY,
                             settings.ICONTACT_USERNAME,
                             settings.ICONTACT_PASSWORD)
     return client
示例#18
0
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