summaryrefslogtreecommitdiff
path: root/macaroonbakery/tests/test_bakery.py
diff options
context:
space:
mode:
Diffstat (limited to 'macaroonbakery/tests/test_bakery.py')
-rw-r--r--macaroonbakery/tests/test_bakery.py93
1 files changed, 76 insertions, 17 deletions
diff --git a/macaroonbakery/tests/test_bakery.py b/macaroonbakery/tests/test_bakery.py
index 5a13cff..72a6928 100644
--- a/macaroonbakery/tests/test_bakery.py
+++ b/macaroonbakery/tests/test_bakery.py
@@ -1,20 +1,13 @@
# Copyright 2017 Canonical Ltd.
# Licensed under the LGPLv3, see LICENCE file for details.
+import os
from unittest import TestCase
+import macaroonbakery.httpbakery as httpbakery
import requests
+from mock import patch
-from mock import (
- patch,
-)
-
-from httmock import (
- HTTMock,
- urlmatch,
- response
-)
-
-import macaroonbakery.httpbakery as httpbakery
+from httmock import HTTMock, response, urlmatch
ID_PATH = 'http://example.com/someprotecteurl'
@@ -29,7 +22,7 @@ json_macaroon = {
}, {
u'cid': u'allow read-no-terms write'
}, {
- u'cid': u'time-before 2016-07-19T14:29:14.312669464Z'
+ u'cid': u'time-before 2158-07-19T14:29:14.312669464Z'
}],
u'location': u'charmstore',
u'signature': u'52d17cb11f5c84d58441bc0ffd7cc396'
@@ -41,7 +34,7 @@ discharge_token = [{
u'caveats': [{
u'cid': u'declared username someone'
}, {
- u'cid': u'time-before 2016-08-15T15:55:52.428319076Z'
+ u'cid': u'time-before 2158-08-15T15:55:52.428319076Z'
}, {
u'cid': u'origin '
}],
@@ -57,7 +50,7 @@ discharged_macaroon = {
}, {
u'cid': u'declared username someone'
}, {
- u'cid': u'time-before 2016-07-19T15:55:52.432439055Z'
+ u'cid': u'time-before 2158-07-19T15:55:52.432439055Z'
}],
u'location': u'',
u'signature': u'3513db5503ab17f9576760cd28'
@@ -167,7 +160,23 @@ def wait_after_401(url, request):
}
+@urlmatch(path='.*/wait')
+def wait_on_error(url, request):
+ return {
+ 'status_code': 500,
+ 'content': {
+ 'DischargeToken': discharge_token,
+ 'Macaroon': discharged_macaroon
+ }
+ }
+
+
class TestBakery(TestCase):
+ def setUp(self):
+ super(TestBakery, self).setUp()
+ # http_proxy would cause requests to talk to the proxy, which is
+ # unlikely to know how to talk to the test server.
+ os.environ.pop('http_proxy', None)
def assert_cookie_security(self, cookies, name, secure):
for cookie in cookies:
@@ -185,12 +194,14 @@ class TestBakery(TestCase):
auth=client.auth())
resp.raise_for_status()
assert 'macaroon-test' in client.cookies.keys()
- self.assert_cookie_security(client.cookies, 'macaroon-test', secure=False)
+ self.assert_cookie_security(client.cookies, 'macaroon-test',
+ secure=False)
@patch('webbrowser.open')
def test_407_then_401_on_discharge(self, mock_open):
client = httpbakery.Client()
- with HTTMock(first_407_then_200), HTTMock(discharge_401), HTTMock(wait_after_401):
+ with HTTMock(first_407_then_200), HTTMock(discharge_401), \
+ HTTMock(wait_after_401):
resp = requests.get(
ID_PATH,
cookies=client.cookies,
@@ -200,6 +211,53 @@ class TestBakery(TestCase):
mock_open.assert_called_once_with(u'http://example.com/visit', new=1)
assert 'macaroon-test' in client.cookies.keys()
+ @patch('webbrowser.open')
+ def test_407_then_error_on_wait(self, mock_open):
+ client = httpbakery.Client()
+ with HTTMock(first_407_then_200), HTTMock(discharge_401),\
+ HTTMock(wait_on_error):
+ with self.assertRaises(httpbakery.InteractionError) as exc:
+ requests.get(
+ ID_PATH,
+ cookies=client.cookies,
+ auth=client.auth(),
+ )
+ self.assertEqual(str(exc.exception),
+ 'cannot start interactive session: cannot get '
+ 'http://example.com/wait')
+ mock_open.assert_called_once_with(u'http://example.com/visit', new=1)
+
+ def test_407_then_no_interaction_methods(self):
+ client = httpbakery.Client(interaction_methods=[])
+ with HTTMock(first_407_then_200), HTTMock(discharge_401):
+ with self.assertRaises(httpbakery.InteractionError) as exc:
+ requests.get(
+ ID_PATH,
+ cookies=client.cookies,
+ auth=client.auth(),
+ )
+ self.assertEqual(str(exc.exception),
+ 'cannot start interactive session: interaction '
+ 'required but not possible')
+
+ def test_407_then_unknown_interaction_methods(self):
+ class UnknownInteractor(httpbakery.Interactor):
+ def kind(self):
+ return 'unknown'
+ client = httpbakery.Client(interaction_methods=[UnknownInteractor()])
+ with HTTMock(first_407_then_200), HTTMock(discharge_401):
+ with self.assertRaises(httpbakery.InteractionError) as exc:
+ requests.get(
+ ID_PATH,
+ cookies=client.cookies,
+ auth=client.auth(),
+ )
+ self.assertEqual(
+ str(exc.exception),
+ 'cannot start interactive session: no methods supported; '
+ 'supported [unknown]; provided [interactive]'
+ )
+
def test_cookie_with_port(self):
client = httpbakery.Client()
with HTTMock(first_407_then_200_with_port):
@@ -219,4 +277,5 @@ class TestBakery(TestCase):
auth=client.auth())
resp.raise_for_status()
assert 'macaroon-test' in client.cookies.keys()
- self.assert_cookie_security(client.cookies, 'macaroon-test', secure=True)
+ self.assert_cookie_security(client.cookies, 'macaroon-test',
+ secure=True)