diff options
Diffstat (limited to 'macaroonbakery/tests/test_bakery.py')
-rw-r--r-- | macaroonbakery/tests/test_bakery.py | 87 |
1 files changed, 70 insertions, 17 deletions
diff --git a/macaroonbakery/tests/test_bakery.py b/macaroonbakery/tests/test_bakery.py index 5a13cff..a6c3e58 100644 --- a/macaroonbakery/tests/test_bakery.py +++ b/macaroonbakery/tests/test_bakery.py @@ -2,19 +2,11 @@ # Licensed under the LGPLv3, see LICENCE file for details. 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 +21,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 +33,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 +49,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,6 +159,17 @@ 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 assert_cookie_security(self, cookies, name, secure): @@ -185,12 +188,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 +205,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 +271,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) |