-
Notifications
You must be signed in to change notification settings - Fork 28
/
test_project_views.py
385 lines (316 loc) · 13.5 KB
/
test_project_views.py
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
import pytest
import mock
@pytest.fixture
def project_client(app, session, client):
"""Fixture for wiki tests.
"""
from pygameweb.project.views import add_project_blueprint
from pygameweb.user.views import add_user_blueprint
from pygameweb.sidebar.views import add_sidebar
from pygameweb.thumb.views import add_thumb_blueprint
add_sidebar(app)
add_user_blueprint(app)
add_project_blueprint(app)
add_thumb_blueprint(app)
return client
def a_user(app, session, project_client, name, email,
logged_in, disabled, active):
""" gives us a user who is a member.
"""
from pygameweb.user.models import User, Group
from flask_security.utils import encrypt_password
group = Group(name='members', title='Member')
user = User(name=name,
email=email,
password=encrypt_password('password'),
disabled=disabled,
active=active,
roles=[group])
session.add(user)
session.commit()
# https://flask-login.readthedocs.org/en/latest/#fresh-logins
with project_client.session_transaction() as sess:
sess['user_id'] = user.id
sess['_fresh'] = True
return user
@pytest.fixture
def user(app, session, project_client):
""" gives us a user who is a member.
"""
return a_user(app, session, project_client, 'joe', 'asdf@example.com',
logged_in=True,
disabled=0,
active=True)
@pytest.fixture
def user_banned(app, session, project_client):
""" gives us a user who is a member.
"""
return a_user(app, session, project_client,
'joebanned',
'asdf2@example.com',
logged_in=False,
disabled=1,
active=False)
@pytest.fixture
def project(session, user):
""" links up a Project with releases, tags, and comments for testing.
"""
import datetime
from pygameweb.project.models import Project, Release, Projectcomment, Tags
the_project = Project(
title='Some project title 1',
summary='Summary of some project 1.',
description='Description of some project.',
uri='http://some.example.com/',
datetimeon=datetime.datetime(2017, 1, 5),
image='1.png',
user=user
)
tag1 = Tags(project=the_project, value='game')
tag2 = Tags(project=the_project, value='arcade')
session.add(tag1)
session.add(tag2)
release1 = Release(datetimeon=datetime.datetime(2017, 1, 5),
description='Some release.',
srcuri='http://example.com/source.tar.gz',
winuri='http://example.com/win.exe',
macuri='http://example.com/mac.dmg',
version='A release title.')
release2 = Release(datetimeon=datetime.datetime(2017, 1, 6),
description='Some release with new things.',
srcuri='http://example.com/source.tar.gz',
winuri='http://example.com/win.exe',
macuri='http://example.com/mac.dmg',
version='A second release title.')
the_project.releases.append(release1)
the_project.releases.append(release2)
comment1 = Projectcomment(user=user, content="Some comment 1.", rating=5)
comment2 = Projectcomment(user=user, content="Some comment 2.", rating=3)
the_project.comments.append(comment1)
the_project.comments.append(comment2)
session.add(the_project)
session.commit()
return the_project
def a_project(session, title, version, user):
""" adds a second project with a couple of tags.
"""
import datetime
from pygameweb.project.models import Project, Tags, Release
the_project2 = Project(
title=title,
summary='Summary of some project 2.',
description='Description of some project 2.',
uri='http://some.example.com/',
datetimeon=datetime.datetime(2017, 1, 8),
image='1.png',
user=user
)
release1 = Release(datetimeon=datetime.datetime(2017, 1, 5),
description='Description of some release 2.',
srcuri='http://example.com/source.tar.gz',
winuri='http://example.com/win.exe',
macuri='http://example.com/mac.dmg',
version=version)
the_project2.releases.append(release1)
tag3 = Tags(project=the_project2, value='2d')
tag4 = Tags(project=the_project2, value='arcade')
return the_project2, release1, tag3, tag4
@pytest.fixture
def project2(session, project, user):
""" adds a second project with a couple of tags.
"""
title = 'Some project title 2'
version = 'some version'
(the_project2,
release1,
tag3,
tag4) = a_project(session, title, version, user)
session.add(release1)
session.add(tag3)
session.add(tag4)
session.add(the_project2)
return the_project2
@pytest.fixture
def project3(session, project, user_banned):
""" adds a second project with a couple of tags.
"""
title = 'Some project title 3'
version = 'some version 3'
(the_project2,
release1,
tag3,
tag4) = a_project(session, title, version, user_banned)
session.add(release1)
session.add(tag3)
session.add(tag4)
session.add(the_project2)
return the_project2
def test_project_hidden(project_client, session, project, project2, project3):
""" when user account has been disabled.
"""
resp = project_client.get(f'/project/{project.id}/')
assert resp.status_code == 200
resp = project_client.get(f'/project/{project3.id}/')
assert resp.status_code == 404
resp = project_client.get('/tags/all')
assert b'Some project title 3' not in resp.data, 'because user is banned'
def test_project_index(project_client, session, user, project, project2):
""" is shown as the default.
"""
assert project.releases
assert project.tags
assert project.comments
assert project.user
assert project.user.projects
assert project.user.projectcomments
assert project.tag_counts == [('arcade', 2, 16), ('game', 1, 14)]
resp = project_client.get(f'/project/{project.id}/')
assert resp.status_code == 200
assert b'<h1>Some project title 1' in resp.data
assert b'<h1>Some project title 2' not in resp.data
assert project.description.encode('utf8') in resp.data
assert b'game' in resp.data
assert b'arcade' in resp.data
resp = project_client.get(f'/project-blabla+bla-{project.id}-.html')
assert resp.status_code == 200, 'because this url works too.'
assert b'<h1>Some project title 1' in resp.data
url = f'/project/{project.id}/{project.releases[0].id}'
resp = project_client.get(url)
assert resp.status_code == 200
assert b'A release title.' in resp.data
assert b'Some release.' in resp.data
url = (f'/project-blabla+blasbla+-'
f'{project.id}-{project.releases[0].id}.html')
resp = project_client.get(url)
assert resp.status_code == 200, 'because this url works too.'
assert b'A release title.' in resp.data
resp = project_client.get('/project/66/')
assert resp.status_code == 404, 'when the project is not there'
resp = project_client.get('/project/1/66')
assert resp.status_code == 404, 'when the release is not there either'
def test_tags(project_client, session, project, project2):
""" shows a list of projects for that tag.
"""
session.commit()
resp = project_client.get('/tags/game')
assert resp.status_code == 200
assert project.title.encode('utf-8') + b'</a>' in resp.data
assert (project2.title.encode('utf-8') +
b'</a>') not in resp.data, 'because only first tagged.'
resp = project_client.get('/tags/arcade')
assert resp.status_code == 200
assert project.title.encode('utf-8') + b'</a>' in resp.data
assert (project2.title.encode('utf-8') +
b'</a>') in resp.data, 'because both are in arcade.'
resp = project_client.get('/tags/all')
assert (resp.status_code ==
200), 'because all is a special tag meaning show all.'
assert project.title.encode('utf-8') + b'</a>' in resp.data
assert (project2.title.encode('utf-8') +
b'</a>') in resp.data, 'both are in all'
assert project_client.get('/tags/').status_code == 200, 'big list of tags'
assert project_client.get('/tags').status_code == 200
def test_project_new(project_client, session, user):
""" adds a new project for the user.
"""
from io import BytesIO
from pygameweb.project.models import Project, Tags
resp = project_client.get('/members/projects/new')
assert resp.status_code == 200
assert b'New Project' in resp.data
assert b'Windows URL' in resp.data
png = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00'
b'\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\x0cIDAT'
b'\x08\x99c```\x00\x00\x00\x04\x00\x01\xa3\n\x15\xe3\x00\x00'
b'\x00\x00IEND\xaeB`\x82')
image = (BytesIO(png), 'helloworld.png')
data = dict(image=image, title='title', version='1.0.2',
tags='tags', summary='summary',
description='description of project',
uri='http://example.com/')
with mock.patch('pygameweb.project.views.save_image') as save_image:
resp = project_client.post('/members/projects/new',
data=data,
follow_redirects=True)
project = (session
.query(Project)
.filter(Project.title == 'title')
.first())
assert (save_image.call_args[0][1] ==
f'frontend/www/shots/{project.id}.png')
resp = project_client.get(f'/project/{project.id}/')
assert project.description.encode('utf8') in resp.data
assert resp.status_code == 200
assert project.title == 'title'
assert project.releases[0].version == '1.0.2', 'a release was added too'
url = f'/members/projects/edit/{project.id}'
resp = project_client.get(url)
assert resp.status_code == 200
image = (BytesIO(png), 'helloworld.png')
data = dict(image=image, title='titlechanged',
tags='tag1, tag2, tag3', summary='summary',
description='description', uri='http://example.com/')
with mock.patch('pygameweb.project.views.save_image') as save_image:
resp = project_client.post(f'/members/projects/edit/{project.id}',
data=data,
follow_redirects=True)
project = (session
.query(Project)
.filter(Project.title == 'titlechanged')
.first())
assert (save_image.call_args[0][1] ==
f'frontend/www/shots/{project.id}.png')
data = dict(title='titlechangedagain',
tags='tag1, tag2, tag3', summary='summary',
description='description', uri='http://example.com/')
with mock.patch('pygameweb.project.views.save_image') as save_image:
resp = project_client.post(f'/members/projects/edit/{project.id}',
data=data,
follow_redirects=True)
project = (session
.query(Project)
.filter(Project.title == 'titlechangedagain')
.first())
assert not save_image.called, 'no image sent or saved'
tags = (session
.query(Tags)
.filter(Tags.project_id == project.id)
.all())
assert len(tags) == 3
assert [tag.value for tag in tags] == ['tag1', 'tag2', 'tag3']
url = f'/members/projects/{project.id}/releases/new'
resp = project_client.get(url)
assert resp.status_code == 200
data = dict(description='updated description',
version='2.0.0',
srcuri='http://example.com/')
release = project.releases[0]
url = f'/members/projects/{project.id}/releases/edit/{release.id}'
resp = project_client.post(url, data=data, follow_redirects=True)
assert resp.status_code == 200
session.refresh(project)
session.refresh(project.releases[0])
assert data['description'] == project.releases[0].description
assert project.releases[0].version == '2.0.0', 'edited a release version'
assert len(project.releases) == 1
data = dict(description='new release',
version='3.0.0',
srcuri='http://example.com/')
url = f'/members/projects/{project.id}/releases/new'
resp = project_client.post(url, data=data, follow_redirects=True)
assert resp.status_code == 200
session.refresh(project)
assert len(project.releases) == 2
assert project.releases[1].version == '3.0.0', 'we added a release version'
def test_new_project_comment(project_client, session, project, project2, user):
""" adds the thoughtful and supportive comment to the project page for the
interesting creative work someone is trying to share with the world.
"""
with mock.patch('pygameweb.project.views.classify_comment'):
url = f'/project/{project.id}/comment'
data = {'message':
'<p>Gidday matey. Keeping busy are ya? This. Is. Awesome.</p>'}
resp = project_client.post(url, data=data, follow_redirects=True)
assert resp.status_code == 200
assert (b'Gidday matey.' in
resp.data), 'because the comment should be there.'