Skip to content

Commit

Permalink
merged with master
Browse files Browse the repository at this point in the history
  • Loading branch information
YunxiAmey committed Jun 1, 2016
2 parents 8121ab2 + f75a416 commit da00cc6
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 13 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -66,3 +66,7 @@ venv_test/

# Spyder IDE
.spyderproject

# Pylint
pylint.out

31 changes: 20 additions & 11 deletions flask_mailgun.py
Expand Up @@ -11,6 +11,7 @@
import hmac
import os
import json
from collections import defaultdict
from decorator import decorator
from threading import Thread
from werkzeug.utils import secure_filename
Expand Down Expand Up @@ -216,19 +217,19 @@ def send_email(self, **kwargs):
return responce

def list_routes(self):
request = requests.get(os.path.join([self.api_url, 'routes']),
request = requests.get(self.routepoint,
auth=self.auth)
return json.loads(request.text).get('items')

def route_exists(self, route):
routes = self.list_routes()

if routes:
expressions = [r['expression'] for r in routes]
actions = [r['actions'] for r in routes]
return route['expression'] in expressions and route['action'] in actions
else:
return False
expression_action = defaultdict(list)
for r in routes:
expression_action[r['expression']].extend(r['actions'])

current_actions = expression_action[route['expression']]
return set(route['action']) <= set(current_actions)

def create_route(self, dest='/messages/', data=None,):
self.dest = dest
Expand All @@ -237,8 +238,9 @@ def create_route(self, dest='/messages/', data=None,):
if self.route_exists(route):
return None
else:
return requests.post(self.api_url + 'routes', auth=self.auth,
data=data)
return requests.post(self.routepoint,
auth=self.auth,
data=data)

def destroy_route(self, dest):
route_id = self.get_route_id(self._build_route(dest))
Expand Down Expand Up @@ -287,10 +289,17 @@ def verify_email(self, email):
if signature != signature_calc:
raise MailGunException("Mailbox Error: credential verification failed.", "Signature doesn't match")

def api_route(self, *pieces):
pieces = [self.api_url] + [p for p in pieces]
return '/'.join(s.strip('/') for s in pieces)

@property
def sendpoint(self):
url_pieces = [self.api_url, self.domain, '/messages']
return '/'.join(s.strip('/') for s in url_pieces)
return self.api_route(self.domain, 'messages')

@property
def routepoint(self):
return self.api_route('routes')

@property
def auth(self):
Expand Down
16 changes: 14 additions & 2 deletions tests/test_flask_mailgun.py
Expand Up @@ -12,7 +12,7 @@
import flask_mailgun
from tests import config
from tests.fixtures.email import make_email_request, make_email, sign_email

import time

def get_app(name):
app = Flask(name)
Expand All @@ -27,13 +27,23 @@ def setUp(self):
self.mailgun = flask_mailgun.MailGun()
self.mailgun.init_app(app)
self.post_patcher = patch('flask_mailgun.requests.post')
self.mailgun.routes = MagicMock(return_value=None)
self.mailgun.mailgun_api.list_routes = MagicMock(return_value=[])
self.mock_post = self.post_patcher.start()

def tearDown(self):
self.post_patcher.stop()


class MailGunApiTest(MailgunTestBase):
def test_sendpoint(self):
self.assertEqual(self.mailgun.mailgun_api.sendpoint,
'https://api.mailgun.net/v3/example.com/messages')

def test_routpoint(self):
self.assertEqual(self.mailgun.mailgun_api.routepoint,
'https://api.mailgun.net/v3/routes')


class SendMessageTest(MailgunTestBase):
def test_send_simple_message(self):
message = {"from": "from@example.com",
Expand Down Expand Up @@ -115,6 +125,7 @@ class ReceiveMessageSyncTest(ReceiveMessageCallbacksTest):
def test_receive_message(self):
response = self.appclient.post('/upload', data=self.email)
self.assertEqual(response.status_code, 200)
time.sleep(1)
self.assertEqual(self.receve_email_mock.call_count, 1)
self.assertEqual(self.attachment_mock.call_count, 1)
print "reveved email"
Expand All @@ -133,6 +144,7 @@ def test_receive_2_messages(self):
self.assertEqual(response.status_code, 200)
response = self.appclient.post('/upload', data=self.email2)
self.assertEqual(response.status_code, 200)
time.sleep(1)
self.assertEqual(self.receve_email_mock.call_count, 2)
self.assertEqual(self.attachment_mock.call_count, 2)
print "reveved 2 emails"
Expand Down

0 comments on commit da00cc6

Please sign in to comment.