Skip to content

Commit 2e74433

Browse files
committed
Fixing broken integration tests.
1 parent 27e271f commit 2e74433

File tree

19 files changed

+242
-278
lines changed

19 files changed

+242
-278
lines changed

intercom/api_operations/delete.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ class Delete(object):
88
def delete(self, obj):
99
collection = utils.resource_class_to_collection_name(
1010
self.collection_class)
11-
self.client.delete("/%s/%s/" % (collection, obj.id))
11+
self.client.delete("/%s/%s/" % (collection, obj.id), {})
1212
return obj

intercom/api_operations/save.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ def create(self, **params):
3737

3838
def save(self, obj):
3939
collection = utils.resource_class_to_collection_name(
40-
self.collection_class)
40+
obj.__class__)
4141
params = obj.attributes
42-
if hasattr(obj, 'id_present') and not hasattr(obj, 'posted_updates'):
42+
if self.id_present(obj) and not self.posted_updates(obj):
4343
# update
4444
response = self.client.put('/%s/%s' % (collection, obj.id), params)
4545
else:
@@ -49,13 +49,11 @@ def save(self, obj):
4949
if response:
5050
return obj.from_response(response)
5151

52-
@property
53-
def id_present(self):
54-
return getattr(self, 'id', None) and self.id != ""
52+
def id_present(self, obj):
53+
return getattr(obj, 'id', None) and obj.id != ""
5554

56-
@property
57-
def posted_updates(self):
58-
return getattr(self, 'update_verb', None) == 'post'
55+
def posted_updates(self, obj):
56+
return getattr(obj, 'update_verb', None) == 'post'
5957

6058
def identity_hash(self, obj):
6159
identity_vars = getattr(obj, 'identity_vars', [])

intercom/client.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ def notes(self):
4848
from intercom.service import note
4949
return note.Note(self)
5050

51+
@property
52+
def segments(self):
53+
from intercom.service import segment
54+
return segment.Segment(self)
55+
5156
@property
5257
def subscriptions(self):
5358
from intercom.service import subscription
@@ -78,6 +83,11 @@ def post(self, path, params):
7883
req = request.Request('POST', path)
7984
return self._execute_request(req, params)
8085

86+
def put(self, path, params):
87+
from intercom import request
88+
req = request.Request('PUT', path)
89+
return self._execute_request(req, params)
90+
8191
def delete(self, path, params):
8292
from intercom import request
8393
req = request.Request('DELETE', path)

intercom/errors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class UnexpectedError(IntercomError):
5757
'unauthorized': AuthenticationError,
5858
'forbidden': AuthenticationError,
5959
'bad_request': BadRequestError,
60+
'action_forbidden': BadRequestError,
6061
'missing_parameter': BadRequestError,
6162
'parameter_invalid': BadRequestError,
6263
'parameter_not_found': BadRequestError,
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# -*- coding: utf-8 -*-
22

33
from intercom import utils
4-
from intercom.user import User
54
from intercom.collection_proxy import CollectionProxy
65

76

87
class Users(object):
98

10-
@property
11-
def users(self):
12-
collection = utils.resource_class_to_collection_name(self.__class__)
13-
finder_url = "/%s/%s/users" % (collection, self.id)
14-
return CollectionProxy(User, "users", finder_url)
9+
def users(self, id):
10+
collection = utils.resource_class_to_collection_name(
11+
self.collection_class)
12+
finder_url = "/%s/%s/users" % (collection, id)
13+
return CollectionProxy(
14+
self.client, self.collection_class, "users", finder_url)

intercom/request.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,24 @@ def send_request_to_path(self, base_url, auth, params=None):
6363
resp.encoding, resp.status_code)
6464
logger.debug(" content:\n%s", resp.content)
6565

66+
parsed_body = self.parse_body(resp)
6667
self.raise_errors_on_failure(resp)
6768
self.set_rate_limit_details(resp)
68-
69-
if resp.content and resp.content.strip():
70-
# parse non empty bodies
71-
return self.parse_body(resp)
69+
return parsed_body
7270

7371
def parse_body(self, resp):
74-
try:
75-
# use supplied or inferred encoding to decode the
76-
# response content
77-
decoded_body = resp.content.decode(
78-
resp.encoding or resp.apparent_encoding)
79-
body = json.loads(decoded_body)
80-
if body.get('type') == 'error.list':
81-
self.raise_application_errors_on_failure(body, resp.status_code) # noqa
82-
return body
83-
except ValueError:
84-
self.raise_errors_on_failure(resp)
72+
if resp.content and resp.content.strip():
73+
try:
74+
# use supplied or inferred encoding to decode the
75+
# response content
76+
decoded_body = resp.content.decode(
77+
resp.encoding or resp.apparent_encoding)
78+
body = json.loads(decoded_body)
79+
if body.get('type') == 'error.list':
80+
self.raise_application_errors_on_failure(body, resp.status_code) # noqa
81+
return body
82+
except ValueError:
83+
self.raise_errors_on_failure(resp)
8584

8685
def set_rate_limit_details(self, resp):
8786
rate_limit_details = {}

intercom/service/company.py

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,20 @@
22

33
from intercom import company
44
from intercom.api_operations.all import All
5+
from intercom.api_operations.delete import Delete
56
from intercom.api_operations.find import Find
67
from intercom.api_operations.find_all import FindAll
78
from intercom.api_operations.save import Save
89
from intercom.api_operations.load import Load
10+
from intercom.extended_api_operations.users import Users
911
from intercom.service.base_service import BaseService
1012

1113

12-
class Company(BaseService, All, Find, FindAll, Save, Load):
14+
class Company(BaseService, All, Delete, Find, FindAll, Save, Load, Users):
1315

1416
@property
1517
def collection_class(self):
1618
return company.Company
1719

18-
# require 'intercom/extended_api_operations/users'
1920
# require 'intercom/extended_api_operations/tags'
2021
# require 'intercom/extended_api_operations/segments'
21-
22-
# module Intercom
23-
# module Service
24-
# class Company < BaseService
25-
# include ApiOperations::Find
26-
# include ApiOperations::FindAll
27-
# include ApiOperations::Load
28-
# include ApiOperations::List
29-
# include ApiOperations::Save
30-
# include ExtendedApiOperations::Users
31-
# include ExtendedApiOperations::Tags
32-
# include ExtendedApiOperations::Segments
33-
34-
# def collection_class
35-
# Intercom::Company
36-
# end
37-
# end
38-
# end
39-
# end

intercom/service/conversation.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
from intercom import conversation
4+
from intercom import utils
45
from intercom.api_operations.find import Find
56
from intercom.api_operations.find_all import FindAll
67
from intercom.api_operations.save import Save
@@ -14,30 +15,33 @@ class Conversation(BaseService, Find, FindAll, Save, Load):
1415
def collection_class(self):
1516
return conversation.Conversation
1617

18+
def reply(self, **reply_data):
19+
return self.__reply(reply_data)
1720

18-
# def mark_read(id)
19-
# @client.put("/conversations/#{id}", read: true)
20-
# end
21+
def assign(self, **reply_data):
22+
reply_data['type'] = 'admin'
23+
reply_data['message_type'] = 'assignment'
24+
return self.__reply(reply_data)
2125

22-
# def reply(reply_data)
23-
# id = reply_data.delete(:id)
24-
# collection_name = Utils.resource_class_to_collection_name(collection_class) # noqa
25-
# response = @client.post("/#{collection_name}/#{id}/reply", reply_data.merge(:conversation_id => id)) # noqa
26-
# collection_class.new.from_response(response)
27-
# end
26+
def open(self, **reply_data):
27+
reply_data['type'] = 'admin'
28+
reply_data['message_type'] = 'open'
29+
return self.__reply(reply_data)
2830

29-
# def open(reply_data)
30-
# reply reply_data.merge(message_type: 'open', type: 'admin')
31-
# end
31+
def close(self, **reply_data):
32+
reply_data['type'] = 'admin'
33+
reply_data['message_type'] = 'close'
34+
return self.__reply(reply_data)
35+
36+
def __reply(self, reply_data):
37+
_id = reply_data.pop('id')
38+
collection = utils.resource_class_to_collection_name(self.collection_class) # noqa
39+
url = "/%s/%s/reply" % (collection, _id)
40+
reply_data['conversation_id'] = _id
41+
response = self.client.post(url, reply_data)
42+
return self.collection_class().from_response(response)
3243

33-
# def close(reply_data)
34-
# reply reply_data.merge(message_type: 'close', type: 'admin')
35-
# end
3644

37-
# def assign(reply_data)
38-
# assignee_id = reply_data.fetch(:assignee_id) { fail 'assignee_id is required' } # noqa
39-
# reply reply_data.merge(message_type: 'assignment', assignee_id: assignee_id, type: 'admin') # noqa
45+
# def mark_read(id)
46+
# @client.put("/conversations/#{id}", read: true)
4047
# end
41-
# end
42-
# end
43-
# end

intercom/service/tag.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ class Tag(BaseService, All, Find, FindAll, Save):
1414
def collection_class(self):
1515
return tag.Tag
1616

17-
def tag(self, params):
17+
def tag(self, **params):
1818
params['tag_or_untag'] = 'tag'
19-
self.create(params)
19+
return self.create(**params)
2020

21-
def untag(self, params):
21+
def untag(self, **params):
2222
params['tag_or_untag'] = 'untag'
23-
for user_or_company in self.users_or_companies(params):
23+
for user_or_company in self._users_or_companies(params):
2424
user_or_company['untag'] = True
25-
self.create(params)
25+
return self.create(**params)
2626

2727
def _users_or_companies(self, params):
2828
if 'users' in params:

tests/integration/__init__.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,55 @@
33
import time
44

55
from datetime import datetime
6-
from intercom import Company
6+
# from intercom import Company
77
from intercom import ResourceNotFound
8-
from intercom import User
8+
# from intercom import User
99

1010

1111
def get_timestamp():
1212
now = datetime.utcnow()
1313
return int(time.mktime(now.timetuple()))
1414

1515

16-
def get_or_create_user(timestamp):
16+
def get_or_create_user(client, timestamp):
1717
# get user
1818
email = '%s@example.com' % (timestamp)
1919
try:
20-
user = User.find(email=email)
20+
user = client.users.find(email=email)
2121
except ResourceNotFound:
2222
# Create a user
23-
user = User.create(
23+
user = client.users.create(
2424
email=email,
2525
user_id=timestamp,
2626
name="Ada %s" % (timestamp))
2727
time.sleep(5)
2828
return user
2929

3030

31-
def get_or_create_company(timestamp):
31+
def get_or_create_company(client, timestamp):
3232
name = 'Company %s' % (timestamp)
3333

3434
# get company
3535
try:
36-
company = Company.find(name=name)
36+
company = client.companies.find(name=name)
3737
except ResourceNotFound:
3838
# Create a company
39-
company = Company.create(
39+
company = client.companies.create(
4040
company_id=timestamp, name=name)
4141
return company
4242

4343

44-
def delete(resource):
44+
def delete_user(client, resource):
4545
try:
46-
resource.delete()
46+
client.users.delete(resource)
47+
except ResourceNotFound:
48+
# not much we can do here
49+
pass
50+
51+
52+
def delete_company(client, resource):
53+
try:
54+
client.companies.delete(resource)
4755
except ResourceNotFound:
4856
# not much we can do here
4957
pass

tests/integration/test_admin.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
import os
44
import unittest
5-
from intercom import Intercom
6-
from intercom import Admin
5+
from intercom.client import Client
76

8-
Intercom.app_id = os.environ.get('INTERCOM_APP_ID')
9-
Intercom.app_api_key = os.environ.get('INTERCOM_APP_API_KEY')
7+
intercom = Client(
8+
os.environ.get('INTERCOM_APP_ID'),
9+
os.environ.get('INTERCOM_API_KEY'))
1010

1111

1212
class AdminTest(unittest.TestCase):
1313

1414
def test(self):
1515
# Iterate over all admins
16-
for admin in Admin.all():
16+
for admin in intercom.admins.all():
1717
self.assertIsNotNone(admin.id)
1818
self.assertIsNotNone(admin.email)

0 commit comments

Comments
 (0)