# coding=utf-8 """Unit tests for salmon.py. TODO: test error handling """ from __future__ import unicode_literals import copy import datetime import urllib from django_salmon import magicsigs import mock from oauth_dropins.webutil.testutil import requests_response, UrlopenResult import requests import common import models from salmon import app import testutil @mock.patch('requests.post') @mock.patch('requests.get') @mock.patch('urllib2.urlopen') class SalmonTest(testutil.TestCase): def test_slap(self, mock_urlopen, mock_get, mock_post): # salmon magic key discovery. first host-meta, then webfinger key = models.MagicKey.get_or_create('alice') mock_urlopen.side_effect = [ UrlopenResult(200, """\ """), UrlopenResult(200, """\ alice@fedsoc.net """ % key.href()), ] # webmention discovery mock_get.return_value = requests_response( '') # webmention post mock_post.return_value = requests_response() # send slap! atom_reply = """\ https://my/reply Alice alice@fedsoc.net http://orig/post I hereby reply. My Reply %s """ % datetime.datetime.now().isoformat(b'T') slap = magicsigs.magic_envelope(atom_reply, common.ATOM_CONTENT_TYPE, key) got = app.get_response('/me@foo.com/salmon', method='POST', body=slap) self.assertEquals(200, got.status_int) # check salmon magic key discovery mock_urlopen.assert_has_calls(( mock.call('http://fedsoc.net/.well-known/host-meta'), mock.call('http://webfinger/alice@fedsoc.net'), )) # check webmention discovery and post expected_headers = copy.deepcopy(common.HEADERS) expected_headers['Accept'] = '*/*' mock_get.assert_called_once_with( 'http://orig/post', headers=common.HEADERS, verify=False) mock_post.assert_called_once_with( 'http://orig/webmention', data={ 'source': 'https://my/reply', 'target': 'http://orig/post', }, allow_redirects=False, headers=expected_headers, verify=False)