From 38cc13634cfa3341a41e03972eea3a7fa9124f2c Mon Sep 17 00:00:00 2001 From: John Keyes Date: Thu, 26 Mar 2015 10:47:38 +0000 Subject: [PATCH] Updating integrations tests. Fixing conversation reply. Adding company delete. --- intercom/company.py | 3 +- intercom/extended_api_operations/reply.py | 5 +- tests/integration/__init__.py | 48 ++++++++++++ tests/integration/test_company.py | 39 +++++----- tests/integration/test_conversations.py | 89 +++++++++++++---------- tests/integration/test_notes.py | 17 ++++- tests/integration/test_segments.py | 12 ++- tests/integration/test_tags.py | 31 ++++---- tests/integration/test_user.py | 24 +++--- 9 files changed, 168 insertions(+), 100 deletions(-) diff --git a/intercom/company.py b/intercom/company.py index f34f5cfe..6c59d15a 100644 --- a/intercom/company.py +++ b/intercom/company.py @@ -2,6 +2,7 @@ from intercom.api_operations.all import All from intercom.api_operations.count import Count +from intercom.api_operations.delete import Delete from intercom.api_operations.find import Find from intercom.api_operations.load import Load from intercom.api_operations.save import Save @@ -9,6 +10,6 @@ from intercom.traits.api_resource import Resource -class Company(Resource, Count, Find, All, Save, Load, Users): +class Company(Resource, Delete, Count, Find, All, Save, Load, Users): update_verb = 'post' identity_vars = ['id', 'company_id'] diff --git a/intercom/extended_api_operations/reply.py b/intercom/extended_api_operations/reply.py index d265854b..db836d0d 100644 --- a/intercom/extended_api_operations/reply.py +++ b/intercom/extended_api_operations/reply.py @@ -5,11 +5,10 @@ class Reply(object): - @property - def reply(self, reply_data): + def reply(self, **reply_data): from intercom import Intercom collection = utils.resource_class_to_collection_name(self.__class__) url = "/%s/%s/reply" % (collection, self.id) reply_data['conversation_id'] = self.id - response = Intercom.post(url, reply_data) + response = Intercom.post(url, **reply_data) return self.from_response(response) diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 40a96afc..c0bea9eb 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -1 +1,49 @@ # -*- coding: utf-8 -*- + +import time + +from datetime import datetime +from intercom import Company +from intercom import ResourceNotFound +from intercom import User + + +def get_timestamp(): + now = datetime.utcnow() + return int(time.mktime(now.timetuple())) + + +def get_or_create_user(timestamp): + # get user + email = '%s@example.com' % (timestamp) + try: + user = User.find(email=email) + except ResourceNotFound: + # Create a user + user = User.create( + email=email, + user_id=timestamp, + name="Ada %s" % (timestamp)) + time.sleep(5) + return user + + +def get_or_create_company(timestamp): + name = 'Company %s' % (timestamp) + + # get company + try: + company = Company.find(name=name) + except ResourceNotFound: + # Create a company + company = Company.create( + company_id=timestamp, name=name) + return company + + +def delete(resource): + try: + resource.delete() + except ResourceNotFound: + # not much we can do here + pass diff --git a/tests/integration/test_company.py b/tests/integration/test_company.py index ea2956aa..839e76c9 100644 --- a/tests/integration/test_company.py +++ b/tests/integration/test_company.py @@ -1,46 +1,45 @@ # -*- coding: utf-8 -*- -from datetime import datetime import os -import time import unittest -from intercom import Intercom from intercom import Company +from intercom import Intercom from intercom import User +from . import delete +from . import get_or_create_user +from . import get_or_create_company +from . import get_timestamp Intercom.app_id = os.environ.get('INTERCOM_APP_ID') Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY') class CompanyTest(unittest.TestCase): - email = "ada@example.com" @classmethod def setup_class(cls): - # get company - cls.company = Company.all()[0] - # get user - cls.user = User.find(email=cls.email) - if not hasattr(cls.user, 'user_id'): - # Create a user - cls.user = User.create( - email=cls.email, - user_id="ada", - name="Ada Lovelace") + nowstamp = get_timestamp() + cls.company = get_or_create_company(nowstamp) + cls.user = get_or_create_user(nowstamp) + + @classmethod + def teardown_class(cls): + delete(cls.company) + delete(cls.user) def test_add_user(self): - user = User.find(email=self.email) + user = User.find(email=self.user.email) user.companies = [ {"company_id": 6, "name": "Intercom"}, {"company_id": 9, "name": "Test Company"} ] user.save() - user = User.find(email=self.email) + user = User.find(email=self.user.email) self.assertEqual(len(user.companies), 2) self.assertEqual(user.companies[0].company_id, "9") def test_add_user_custom_attributes(self): - user = User.find(email=self.email) + user = User.find(email=self.user.email) user.companies = [ { "id": 6, @@ -51,7 +50,7 @@ def test_add_user_custom_attributes(self): } ] user.save() - user = User.find(email=self.email) + user = User.find(email=self.user.email) self.assertEqual(len(user.companies), 2) self.assertEqual(user.companies[0].company_id, "9") @@ -74,8 +73,8 @@ def test_update(self): # Find a company by id company = Company.find(id=self.company.id) # Update a company - now = datetime.utcnow() - updated_name = 'Company %s' % (time.mktime(now.timetuple())) + now = get_timestamp() + updated_name = 'Company %s' % (now) company.name = updated_name company.save() company = Company.find(id=self.company.id) diff --git a/tests/integration/test_conversations.py b/tests/integration/test_conversations.py index eea023de..8adeae64 100644 --- a/tests/integration/test_conversations.py +++ b/tests/integration/test_conversations.py @@ -5,40 +5,53 @@ from intercom import Intercom from intercom import Admin from intercom import Conversation -from intercom import User +from intercom import Message +from . import delete +from . import get_or_create_user +from . import get_timestamp Intercom.app_id = os.environ.get('INTERCOM_APP_ID') Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY') class ConversationTest(unittest.TestCase): - email = "ada@example.com" - @classmethod def setup_class(cls): # get admin - cls.admin = Admin.all()[0] + cls.admin = Admin.all()[1] + # get user - cls.user = User.find(email=cls.email) - if not hasattr(cls.user, 'user_id'): - # Create a user - cls.user = User.create( - email=cls.email, - user_id="ada", - name="Ada Lovelace") - cls.user.companies = [ - {"company_id": 6, "name": "Intercom"}, - {"company_id": 9, "name": "Test Company"} - ] - cls.user.save() + timestamp = get_timestamp() + cls.user = get_or_create_user(timestamp) + cls.email = cls.user.email + + # send user message + message_data = { + 'from': { + 'type': "user", + 'id': cls.user.id + }, + 'body': "Hey" + } + cls.user_message = Message.create(**message_data) + + conversations = Conversation.find_all() + user_init_conv = conversations[0] + # send admin reply + cls.admin_conv = user_init_conv.reply( + type='admin', admin_id=cls.admin.id, + message_type='comment', body='There') + + @classmethod + def teardown_class(cls): + delete(cls.user) def test_find_all_admin(self): # FINDING CONVERSATIONS FOR AN ADMIN # Iterate over all conversations (open and closed) assigned to an admin - for convo in Conversation.find_all(type='admin', id=self.admin.id): self.assertIsNotNone(convo.id) - self.__class__.convo_id = convo.id + self.admin_conv.id = convo.id def test_find_all_open_admin(self): # Iterate over all open conversations assigned to an admin @@ -99,33 +112,29 @@ def test_conversation_parts(self): # There is a body self.assertIsNotNone(part.body) - # def test_reply(self): - # # REPLYING TO CONVERSATIONS - # convo_id = Conversation.find_all( - # type='admin', id=self.admin.id)[0].id - # conversation = Conversation.find(id=convo_id) - # num_parts = len(conversation.conversation_parts) - # # User (identified by email) replies with a comment - # conversation.reply( - # type='user', email=self.email, - # message_type='comment', body='foo') - # # Admin (identified by email) replies with a comment - # conversation.reply( - # type='admin', email=self.admin.email, - # message_type='comment', body='bar') - # conversation = Conversation.find(id=convo_id) - # self.assertEqual(num_parts + 2, len(conversation.conversation_parts)) + def test_reply(self): + # REPLYING TO CONVERSATIONS + conversation = Conversation.find(id=self.admin_conv.id) + num_parts = len(conversation.conversation_parts) + # User (identified by email) replies with a comment + conversation.reply( + type='user', email=self.email, + message_type='comment', body='foo') + # Admin (identified by admin_id) replies with a comment + conversation.reply( + type='admin', admin_id=self.admin.id, + message_type='comment', body='bar') + conversation = Conversation.find(id=self.admin_conv.id) + self.assertEqual(num_parts + 2, len(conversation.conversation_parts)) def test_mark_read(self): # MARKING A CONVERSATION AS READ - convo_id = Conversation.find_all(type='admin', id=self.admin.id)[0].id - conversation = Conversation.find(id=convo_id) + conversation = Conversation.find(id=self.admin_conv.id) conversation.read = False conversation.save() - conversation = Conversation.find(id=convo_id) - # CANNOT MARK AS UNREAD VIA API - # self.assertFalse(conversation.read) + conversation = Conversation.find(id=self.admin_conv.id) + self.assertFalse(conversation.read) conversation.read = True conversation.save() - conversation = Conversation.find(id=convo_id) + conversation = Conversation.find(id=self.admin_conv.id) self.assertTrue(conversation.read) diff --git a/tests/integration/test_notes.py b/tests/integration/test_notes.py index 8214a5bf..eba0a03b 100644 --- a/tests/integration/test_notes.py +++ b/tests/integration/test_notes.py @@ -4,13 +4,24 @@ import unittest from intercom import Intercom from intercom import Note +from . import delete +from . import get_or_create_user +from . import get_timestamp Intercom.app_id = os.environ.get('INTERCOM_APP_ID') Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY') class NoteTest(unittest.TestCase): - email = "ada@example.com" + @classmethod + def setup_class(cls): + timestamp = get_timestamp() + cls.user = get_or_create_user(timestamp) + cls.email = cls.user.email + + @classmethod + def teardown_class(cls): + delete(cls.user) def test_create_note(self): # Create a note for a user @@ -29,10 +40,12 @@ def test_find_note(self): def test_find_all_email(self): # Iterate over all notes for a user via their email address - for note in Note.find_all(email=self.email): + notes = Note.find_all(email=self.email) + for note in notes: self.assertTrue(note.id is not None) user = note.user.load() self.assertEqual(user.email, self.email) + break def test_find_all_id(self): from intercom.user import User diff --git a/tests/integration/test_segments.py b/tests/integration/test_segments.py index 7fdb203f..d9b54f80 100644 --- a/tests/integration/test_segments.py +++ b/tests/integration/test_segments.py @@ -12,26 +12,24 @@ class SegmentTest(unittest.TestCase): - email = "ada@example.com" @classmethod def setup_class(cls): - # get user - cls.segment_id = "5425e77db351e072bb000017" + cls.segment = Segment.all()[0] def test_find_segment(self): # Find a segment - segment = Segment.find(id=self.segment_id) - self.assertEqual(segment.id, self.segment_id) + segment = Segment.find(id=self.segment.id) + self.assertEqual(segment.id, self.segment.id) def test_save_segment(self): # Update a segment - segment = Segment.find(id=self.segment_id) + segment = Segment.find(id=self.segment.id) now = datetime.utcnow() updated_name = 'Updated %s' % (time.mktime(now.timetuple())) segment.name = updated_name segment.save() - segment = Segment.find(id=self.segment_id) + segment = Segment.find(id=self.segment.id) self.assertEqual(segment.name, updated_name) def test_iterate(self): diff --git a/tests/integration/test_tags.py b/tests/integration/test_tags.py index 62de5e84..0ad615d3 100644 --- a/tests/integration/test_tags.py +++ b/tests/integration/test_tags.py @@ -4,30 +4,31 @@ import unittest from intercom import Intercom from intercom import Tag -from intercom import User +from . import delete +from . import get_or_create_company +from . import get_or_create_user +from . import get_timestamp Intercom.app_id = os.environ.get('INTERCOM_APP_ID') Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY') class TagTest(unittest.TestCase): - email = "ada@example.com" @classmethod def setup_class(cls): - # get user - cls.user = User.find(email=cls.email) - if not hasattr(cls.user, 'user_id'): - # Create a user - cls.user = User.create( - email=cls.email, - user_id="ada", - name="Ada Lovelace") - cls.user.companies = [ - {"company_id": 6, "name": "Intercom"}, - {"company_id": 9, "name": "Test Company"} - ] - cls.user.save() + nowstamp = get_timestamp() + cls.company = get_or_create_company(nowstamp) + cls.user = get_or_create_user(nowstamp) + cls.user.companies = [ + {"company_id": cls.company.id, "name": cls.company.name} + ] + cls.user.save() + + @classmethod + def teardown_class(cls): + delete(cls.company) + delete(cls.user) def test_tag_users(self): # Tag users diff --git a/tests/integration/test_user.py b/tests/integration/test_user.py index 3921239d..e61b11b6 100644 --- a/tests/integration/test_user.py +++ b/tests/integration/test_user.py @@ -4,25 +4,25 @@ import unittest from intercom import Intercom from intercom import User +from . import get_timestamp +from . import get_or_create_user +from . import delete Intercom.app_id = os.environ.get('INTERCOM_APP_ID') Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY') class UserTest(unittest.TestCase): - email = "ada@example.com" @classmethod def setup_class(cls): - # get user - cls.user = User.find(email=cls.email) - if not hasattr(cls.user, 'user_id'): - # Create a user - cls.user = User.create( - email=cls.email, - user_id="ada", - name="Ada Lovelace") - print cls.user.id + nowstamp = get_timestamp() + cls.user = get_or_create_user(nowstamp) + cls.email = cls.user.email + + @classmethod + def teardown_class(cls): + delete(cls.user) def test_find_by_email(self): # Find user by email @@ -31,8 +31,8 @@ def test_find_by_email(self): self.assertEqual(self.email, user.email) def test_find_by_user_id(self): - # Find user by email - user = User.find(user_id="ada") + # Find user by user id + user = User.find(user_id=self.user.user_id) self.assertEqual(self.email, user.email) def test_find_by_id(self):