forked from GoogleCloudPlatform/getting-started-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_auth.py
More file actions
133 lines (111 loc) · 4.24 KB
/
test_auth.py
File metadata and controls
133 lines (111 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Copyright 2015 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import contextlib
import bookshelf
from conftest import flaky_filter
from flaky import flaky
import mock
from oauth2client.client import OAuth2Credentials
import pytest
@pytest.fixture
def client_with_credentials(app):
"""This fixture provides a Flask app test client that has a session
pre-configured with use credentials."""
credentials = OAuth2Credentials(
'access_token',
'client_id',
'client_secret',
'refresh_token',
'3600',
None,
'Test',
id_token={'sub': '123', 'email': 'user@example.com'},
scopes=('email', 'profile'))
@contextlib.contextmanager
def inner():
with app.test_client() as client:
with client.session_transaction() as session:
session['profile'] = {'id': 'abc', 'displayName': 'Test User'}
session['google_oauth2_credentials'] = credentials.to_json()
yield client
return inner
# Mark all test cases in this class as flaky, so that if errors occur they
# can be retried. This is useful when databases are temporarily unavailable.
@flaky(rerun_filter=flaky_filter)
# Tell pytest to use both the app and model fixtures for all test cases.
# This ensures that configuration is properly applied and that all database
# resources created during tests are cleaned up. These fixtures are defined
# in conftest.py
@pytest.mark.usefixtures('app', 'model')
class TestAuth(object):
def test_not_logged_in(self, app):
with app.test_client() as c:
rv = c.get('/books/')
assert rv.status == '200 OK'
body = rv.data.decode('utf-8')
assert 'Login' in body
def test_logged_in(self, client_with_credentials):
with client_with_credentials() as c:
rv = c.get('/books/')
assert rv.status == '200 OK'
body = rv.data.decode('utf-8')
assert 'Test User' in body
def test_add_anonymous(self, app):
data = {
'title': 'Test Book',
}
with app.test_client() as c:
rv = c.post('/books/add', data=data, follow_redirects=True)
assert rv.status == '200 OK'
body = rv.data.decode('utf-8')
assert 'Test Book' in body
assert 'Added by Anonymous' in body
def test_add_logged_in(self, client_with_credentials):
data = {
'title': 'Test Book',
}
with client_with_credentials() as c:
rv = c.post('/books/add', data=data, follow_redirects=True)
assert rv.status == '200 OK'
body = rv.data.decode('utf-8')
assert 'Test Book' in body
assert 'Added by Test User' in body
def test_mine(self, model, client_with_credentials):
# Create two books, one created by the logged in user and one
# created by another user.
model.create({
'title': 'Book 1',
'createdById': 'abc'
})
model.create({
'title': 'Book 2',
'createdById': 'def'
})
# Check the "My Books" page and make sure only one of the books
# appears.
with client_with_credentials() as c:
rv = c.get('/books/mine')
assert rv.status == '200 OK'
body = rv.data.decode('utf-8')
assert 'Book 1' in body
assert 'Book 2' not in body
@mock.patch("httplib2.Http")
def test_request_user_info(self, HttpMock):
httpObj = mock.MagicMock()
responseMock = mock.MagicMock(status=200)
httpObj.request = mock.MagicMock(
return_value=(responseMock, b'{"name": "bill"}'))
HttpMock.return_value = httpObj
credentials = mock.MagicMock()
bookshelf._request_user_info(credentials)