Skip to content

Commit 5137d7e

Browse files
pferateJon Wayne Parrott
authored and
Jon Wayne Parrott
committed
Complete branches from partial test coverages (googleapis#629)
1 parent c9b4b07 commit 5137d7e

File tree

2 files changed

+66
-19
lines changed

2 files changed

+66
-19
lines changed

tests/contrib/test_sqlalchemy.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import datetime
1616
import unittest
1717

18+
import mock
1819
import sqlalchemy
1920
import sqlalchemy.ext.declarative
2021
import sqlalchemy.orm
@@ -66,7 +67,8 @@ def compare_credentials(self, result):
6667
self.assertEqual(result.token_uri, self.credentials.token_uri)
6768
self.assertEqual(result.user_agent, self.credentials.user_agent)
6869

69-
def test_get(self):
70+
@mock.patch('oauth2client.client.OAuth2Credentials.set_store')
71+
def test_get(self, set_store):
7072
session = self.session()
7173
credentials_storage = oauth2client.contrib.sqlalchemy.Storage(
7274
session=session,
@@ -75,24 +77,42 @@ def test_get(self):
7577
key_value=1,
7678
property_name='credentials',
7779
)
80+
# No credentials stored
7881
self.assertIsNone(credentials_storage.get())
82+
83+
# Invalid credentials stored
84+
session.add(DummyModel(
85+
key=1,
86+
credentials=oauth2client.client.Credentials(),
87+
))
88+
session.commit()
89+
bad_credentials = credentials_storage.get()
90+
self.assertIsInstance(bad_credentials, oauth2client.client.Credentials)
91+
set_store.assert_not_called()
92+
93+
# Valid credentials stored
94+
session.query(DummyModel).filter_by(key=1).delete()
7995
session.add(DummyModel(
8096
key=1,
8197
credentials=self.credentials,
8298
))
8399
session.commit()
84100

85101
self.compare_credentials(credentials_storage.get())
102+
set_store.assert_called_with(credentials_storage)
86103

87104
def test_put(self):
88105
session = self.session()
89-
oauth2client.contrib.sqlalchemy.Storage(
106+
storage = oauth2client.contrib.sqlalchemy.Storage(
90107
session=session,
91108
model_class=DummyModel,
92109
key_name='key',
93110
key_value=1,
94111
property_name='credentials',
95-
).put(self.credentials)
112+
)
113+
# Store invalid credentials first to verify overwriting
114+
storage.put(oauth2client.client.Credentials())
115+
storage.put(self.credentials)
96116
session.commit()
97117

98118
entity = session.query(DummyModel).filter_by(key=1).first()

tests/test_client.py

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,9 @@ def setUp(self):
16191619
user_agent='unittest-sample/1.0',
16201620
revoke_uri='dummy_revoke_uri',
16211621
)
1622+
self.bad_verifier = b'__NOT_THE_VERIFIER_YOURE_LOOKING_FOR__'
1623+
self.good_verifier = b'__TEST_VERIFIER__'
1624+
self.good_challenger = b'__TEST_CHALLENGE__'
16221625

16231626
def test_construct_authorize_url(self):
16241627
authorize_url = self.flow.step1_get_authorize_url(state='state+1')
@@ -1691,19 +1694,42 @@ def test_step1_get_authorize_url_redirect_override(self, logger):
16911694
@mock.patch('oauth2client.client._pkce.code_challenge')
16921695
@mock.patch('oauth2client.client._pkce.code_verifier')
16931696
def test_step1_get_authorize_url_pkce(self, fake_verifier, fake_challenge):
1694-
fake_verifier.return_value = b'__TEST_VERIFIER__'
1695-
fake_challenge.return_value = b'__TEST_CHALLENGE__'
1697+
fake_verifier.return_value = self.good_verifier
1698+
fake_challenge.return_value = self.good_challenger
16961699
flow = client.OAuth2WebServerFlow(
1697-
'client_id+1',
1698-
scope='foo',
1699-
redirect_uri='http://example.com',
1700-
pkce=True)
1700+
'client_id+1',
1701+
scope='foo',
1702+
redirect_uri='http://example.com',
1703+
pkce=True)
1704+
auth_url = urllib.parse.urlparse(flow.step1_get_authorize_url())
1705+
self.assertEqual(flow.code_verifier, self.good_verifier)
1706+
results = dict(urllib.parse.parse_qsl(auth_url.query))
1707+
self.assertEqual(
1708+
results['code_challenge'], self.good_challenger.decode())
1709+
self.assertEqual(results['code_challenge_method'], 'S256')
1710+
fake_verifier.assert_called()
1711+
fake_challenge.assert_called_with(self.good_verifier)
1712+
1713+
@mock.patch('oauth2client.client._pkce.code_challenge')
1714+
@mock.patch('oauth2client.client._pkce.code_verifier')
1715+
def test_step1_get_authorize_url_pkce_invalid_verifier(
1716+
self, fake_verifier, fake_challenge):
1717+
fake_verifier.return_value = self.good_verifier
1718+
fake_challenge.return_value = self.good_challenger
1719+
flow = client.OAuth2WebServerFlow(
1720+
'client_id+1',
1721+
scope='foo',
1722+
redirect_uri='http://example.com',
1723+
pkce=True,
1724+
code_verifier=self.bad_verifier)
17011725
auth_url = urllib.parse.urlparse(flow.step1_get_authorize_url())
1702-
self.assertEqual(flow.code_verifier, b'__TEST_VERIFIER__')
1726+
self.assertEqual(flow.code_verifier, self.bad_verifier)
17031727
results = dict(urllib.parse.parse_qsl(auth_url.query))
1704-
self.assertEqual(results['code_challenge'], '__TEST_CHALLENGE__')
1728+
self.assertEqual(
1729+
results['code_challenge'], self.good_challenger.decode())
17051730
self.assertEqual(results['code_challenge_method'], 'S256')
1706-
fake_challenge.assert_called_with(b'__TEST_VERIFIER__')
1731+
fake_verifier.assert_not_called()
1732+
fake_challenge.assert_called_with(self.bad_verifier)
17071733

17081734
def test_step1_get_authorize_url_without_redirect(self):
17091735
flow = client.OAuth2WebServerFlow('client_id+1', scope='foo',
@@ -1955,17 +1981,18 @@ def test_exchange_with_pkce(self):
19551981
({'status': http_client.OK}, b'access_token=SlAV32hkKG'),
19561982
])
19571983
flow = client.OAuth2WebServerFlow(
1958-
'client_id+1',
1959-
scope='foo',
1960-
redirect_uri='http://example.com',
1961-
pkce=True,
1962-
code_verifier=b'__TEST_VERIFIER__'
1963-
)
1984+
'client_id+1',
1985+
scope='foo',
1986+
redirect_uri='http://example.com',
1987+
pkce=True,
1988+
code_verifier=self.good_verifier)
19641989
flow.step2_exchange(code='some random code', http=http)
19651990

19661991
self.assertEqual(len(http.requests), 1)
19671992
test_request = http.requests[0]
1968-
self.assertIn('code_verifier=__TEST_VERIFIER__', test_request['body'])
1993+
self.assertIn(
1994+
'code_verifier={0}'.format(self.good_verifier.decode()),
1995+
test_request['body'])
19691996

19701997
def test_exchange_using_authorization_header(self):
19711998
auth_header = 'Basic Y2xpZW50X2lkKzE6c2Vjexc_managerV0KzE=',

0 commit comments

Comments
 (0)