Skip to content
This repository was archived by the owner on Sep 19, 2018. It is now read-only.

Commit 652ea4f

Browse files
committed
Merge pull request #402 from gandalfar/ialja-more-tests
Merged "Added tests for scoreboard and ambassadors views, fixed a few typos"
2 parents c8b3f30 + 40d05ac commit 652ea4f

File tree

6 files changed

+214
-41
lines changed

6 files changed

+214
-41
lines changed

web/templates/avatar/add.html

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
{% load url from future %}
44

55
{% block content %}
6-
<p>{% trans "Your current avatar: " %}</p>
7-
{% avatar user %}
8-
{% if not avatars %}
9-
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
10-
{% endif %}
11-
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
12-
{{ upload_avatar_form.as_p }}
13-
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
14-
<input type="hidden" name="next" value="{% url 'profile' %}" />
15-
</form>
6+
<div class="container">
7+
<h1>Add new profile avatar</h1>
8+
<p>{% trans "Your current avatar: " %}</p>
9+
{% avatar user %}
10+
{% if not avatars %}
11+
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
12+
{% endif %}
13+
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
14+
{{ upload_avatar_form.as_p }}
15+
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
16+
<input type="hidden" name="next" value="{% url 'profile' %}" />
17+
</form>
18+
</div>
1619
{% endblock %}

web/templates/avatar/change.html

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@
22
{% load i18n avatar_tags %}
33

44
{% block content %}
5-
<p>{% trans "Your current avatar: " %}</p>
6-
{% avatar user %}
5+
<div class="container">
6+
<h1>Change your profile avatar</h1>
7+
<p>{% trans "Your current avatar: " %}</p>
8+
{% avatar user %}
79

8-
{% if not avatars %}
9-
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
10-
{% else %}
11-
<form method="POST" action="{% url 'avatar_change' %}">
12-
<ul>
13-
{{ primary_avatar_form.as_ul }}
14-
</ul>
15-
<p>{% csrf_token %}<input type="submit" value="{% trans "Choose new Default" %}" /></p>
10+
{% if not avatars %}
11+
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
12+
{% else %}
13+
<form method="POST" action="{% url 'avatar_change' %}">
14+
<ul>
15+
{{ primary_avatar_form.as_ul }}
16+
</ul>
17+
<p>{% csrf_token %}<input type="submit" value="{% trans "Choose new Default" %}" /></p>
18+
<input type="hidden" name="next" value="{% url 'profile' %}" />
19+
</form>
20+
{% endif %}
21+
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
22+
{{ upload_avatar_form.as_p }}
23+
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
1624
<input type="hidden" name="next" value="{% url 'profile' %}" />
1725
</form>
18-
{% endif %}
19-
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
20-
{{ upload_avatar_form.as_p }}
21-
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
22-
<input type="hidden" name="next" value="{% url 'profile' %}" />
23-
</form>
26+
</div>
2427
{% endblock %}

web/templates/avatar/confirm_delete.html

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
{% load url from future %}
44

55
{% block content %}
6-
<p>{% trans "Please select the avatars that you would like to delete." %}</p>
7-
{% if not avatars %}
8-
{% url 'avatar_change' as avatar_change_url %}
9-
<p>{% blocktrans %}You have no avatars to delete. Please <a href="{{ avatar_change_url }}">upload one</a> now.{% endblocktrans %}</p>
10-
{% else %}
11-
<form method="POST" action="{% url 'avatar_delete' %}">
12-
<ul>
13-
{{ delete_avatar_form.as_ul }}
14-
</ul>
15-
<p>{% csrf_token %}<input type="submit" value="{% trans "Delete These" %}" /></p>
16-
</form>
17-
{% endif %}
6+
<div class="container">
7+
<h1>Delete your avatar</h1>
8+
<p>{% trans "Please select the avatars that you would like to delete." %}</p>
9+
{% if not avatars %}
10+
{% url 'avatar_change' as avatar_change_url %}
11+
<p>{% blocktrans %}You have no avatars to delete. Please <a href="{{ avatar_change_url }}">upload one</a> now.{% endblocktrans %}</p>
12+
{% else %}
13+
<form method="POST" action="{% url 'avatar_delete' %}">
14+
<ul>
15+
{{ delete_avatar_form.as_ul }}
16+
</ul>
17+
<p>{% csrf_token %}<input type="submit" value="{% trans "Delete These" %}" /></p>
18+
</form>
19+
{% endif %}
20+
</div>
1821
{% endblock %}

web/templates/pages/ambassadors.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ <h2 class="clearfix" id="{{country}}">{{country}}</h2>
1818
{% for ambassador in ambassadors %}
1919
<div class="ambassador clearfix">
2020
{% avatar ambassador.user.username %}
21-
<h4>{{ambassador.user.first_name}} {{ambassador.user.last_name}}&nbsp;<span>{% if ambassador.user.email %}&nbsp;<a href="mailto:{{ambassador.user.email}}" alt="Send me an emails"><i class="fa fa-envelope"></i></a>{% endif %} {% if ambassador.website %}&nbsp;<a href="{{ambassador.website}}" target="_blank"><i class="fa fa-link"></i></a>{% endif %} {% if ambassador.twitter %}&nbsp;<a href="http://twitter.com/{{ambassador.twitter}}" target="_blank"><i class="fa fa-twitter"></i></a>{% endif %}</span></h4>
21+
<h4>{{ambassador.user.first_name}} {{ambassador.user.last_name}}&nbsp;<span>{% if ambassador.user.email %}&nbsp;<a href="mailto:{{ambassador.user.email}}" alt="Send me an email"><i class="fa fa-envelope"></i></a>{% endif %} {% if ambassador.website %}&nbsp;<a href="{{ambassador.website}}" target="_blank"><i class="fa fa-link"></i></a>{% endif %} {% if ambassador.twitter %}&nbsp;<a href="http://twitter.com/{{ambassador.twitter}}" target="_blank"><i class="fa fa-twitter"></i></a>{% endif %}</span></h4>
2222
<p>{{ambassador.bio}}</p>
2323
</div>
2424
{% endfor %}

web/tests/test_event_views.py

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@
1010
from django.test import Client
1111
from django.core.urlresolvers import reverse
1212
from django.core.files.uploadedfile import InMemoryUploadedFile
13-
from django.contrib.auth.models import User
13+
from django.contrib.auth.models import User, Group
1414

1515
from api.models.events import Event
1616
from api.models import UserProfile
1717

18+
from avatar.models import Avatar
19+
from avatar.util import get_primary_avatar
20+
21+
from web.processors.event import create_or_update_event
22+
from web.processors.event import count_approved_events_for_country
23+
1824
from web.tests import EventFactory, ApprovedEventFactory
1925

2026
class EventViewsTestCase(TestCase):
@@ -49,13 +55,40 @@ def test_index_view_without_approved_events(self):
4955
def test_index_view_changing_remote_in_request(self):
5056
#setup
5157
response = self.client.get(reverse('web.index'), {},
52-
HTTP_X_FORWARDED_FOR='93.103.53.11, 93.103.53.11')
58+
HTTP_X_FORWARDED_FOR='93.103.53.11, 93.103.53.11')
5359

5460
#assert
5561
self.assertEquals(200, response.status_code)
5662
self.assertEquals((46.0, 15.0), response.context['lan_lon'])
5763

5864

65+
def test_search_events_with_search_query(self):
66+
ApprovedEventFactory.create(title='Event Arglebargle - Approved')
67+
response = self.client.get(reverse('web.search_events'), {'q':'arglebargle'}, REMOTE_ADDR='93.103.53.11')
68+
69+
self.assertEquals(1,response.context['events'].count())
70+
self.assertEquals('SI', response.context['country'])
71+
72+
def test_search_events_with_unicode_tag_in_search_query(self):
73+
ApprovedEventFactory.create(tags=["jabolčna čežana","José", "Django"])
74+
response = self.client.get(reverse('web.search_events'), {'q':'čežana'}, REMOTE_ADDR='93.103.53.11')
75+
76+
self.assertEquals(1,response.context['events'].count())
77+
self.assertEquals('SI', response.context['country'])
78+
79+
def test_search_events_with_search_query_multiple_events(self):
80+
approved1 = ApprovedEventFactory.create(title="Event Arglebargle - Approved", country="SI")
81+
approved2 = ApprovedEventFactory.create(title="Event Arglebargle - Approved", country="AT")
82+
83+
response = self.client.get(reverse('web.search_events'), {'q':'arglebargle'}, REMOTE_ADDR='93.103.53.11')
84+
85+
self.assertEquals(1,response.context['events'].count())
86+
self.assertEquals('SI', response.context['country'])
87+
88+
approved1.delete()
89+
approved2.delete()
90+
91+
5992
def test_view_event_without_picture(self):
6093
test_event = EventFactory.create()
6194
response = self.client.get(reverse('web.view_event', args=[test_event.pk, test_event.slug]))
@@ -66,6 +99,7 @@ def test_view_event_without_picture(self):
6699
test_event.delete()
67100

68101

102+
69103
@pytest.mark.django_db
70104
def test_create_event_with_image(admin_user, admin_client, db):
71105
with open(local(__file__).dirname + '/../../static/img/team/alja.jpg') as fp:
@@ -98,6 +132,7 @@ def test_create_event_with_image(admin_user, admin_client, db):
98132
response = admin_client.get(response.url)
99133
assert 'event_picture/alja' in response.content
100134

135+
101136
@pytest.mark.django_db
102137
def test_edit_event_with_image(admin_user, admin_client, db):
103138
# First create event
@@ -192,27 +227,138 @@ def test_edit_event_with_image(admin_user, admin_client, db):
192227
response = admin_client.get(event.get_absolute_url())
193228
assert 'event_picture/ercchy' not in response.content
194229

230+
231+
@pytest.mark.django_db
232+
def test_scoreboard_links_and_results(admin_user, db, client):
233+
234+
test_country_name = "Slovenia"
235+
test_country_code = "SI"
236+
237+
search_url = (reverse('web.search_events') +
238+
"?country_code=%s&amp;past=yes" % test_country_code)
239+
240+
event_data = {
241+
'audience': [3],
242+
'theme': [1,2],
243+
'country': test_country_code,
244+
'description': u'Lorem ipsum dolor sit amet.',
245+
'location': test_country_name,
246+
'organizer': u'testko',
247+
"creator": admin_user,
248+
'start_date': datetime.datetime.now(),
249+
'end_date': datetime.datetime.now() + datetime.timedelta(days=3, hours=3),
250+
'title': u'Test Approved Event',
251+
'status':"APPROVED",
252+
}
253+
254+
test_approved_event = create_or_update_event(event_id=None, **event_data)
255+
256+
for country in count_approved_events_for_country():
257+
if country['country_code'] == test_country_code:
258+
event_count = country['events']
259+
260+
response = client.get(reverse('web.scoreboard'))
261+
262+
# We're expecting to see this bit of HTML code with the right
263+
# search URL and the right count for events
264+
expected_result = '''
265+
<span class="country-name">%s</span><p> is participating with </p>
266+
<a href="%s">
267+
<span class="event-number">%s event
268+
''' % (test_country_name, search_url, event_count)
269+
270+
expected_result = expected_result.replace('\t', '').replace('\n', '')
271+
scoreboard_content = response.content.replace('\t', '').replace('\n', '')
272+
273+
# The search URL shown on scoreboard also has to match search results
274+
search_response = client.get(search_url)
275+
expected_search_result = '<div class="search-counter">%s event' % event_count
276+
277+
assert expected_result in scoreboard_content
278+
assert expected_search_result in search_response.content
279+
280+
test_approved_event.delete()
281+
282+
283+
@pytest.mark.django_db
284+
def test_ambassadors_list(db, client):
285+
test_country_name = "Austria"
286+
test_country_code = "AT"
287+
288+
test_username = 'test-amb'
289+
test_email = '[email protected]'
290+
test_first_name = 'Testko'
291+
test_last_name = 'Test'
292+
test_full_name = test_first_name + " " + test_last_name
293+
294+
test_ambassador = User.objects.create(username=test_username,
295+
email=test_email,
296+
first_name=test_first_name,
297+
last_name=test_last_name)
298+
test_ambassador_profile = UserProfile.objects.create(user=test_ambassador,
299+
country=test_country_code)
300+
301+
group = Group.objects.get(name="ambassadors")
302+
group.user_set.add(test_ambassador)
303+
304+
with open(local(__file__).dirname + '/../../static/img/team/alja.jpg') as fp:
305+
io = StringIO.StringIO()
306+
io.write(fp.read())
307+
uploaded_picture = InMemoryUploadedFile(io, None, "alja17.jpg", "jpeg", io.len, None)
308+
uploaded_picture.seek(0)
309+
310+
avatar = Avatar(user=test_ambassador, primary=True)
311+
avatar.avatar.save(uploaded_picture.name, uploaded_picture)
312+
avatar.save()
313+
314+
new_avatar = get_primary_avatar(test_ambassador, size=80)
315+
test_amb_avatar = new_avatar.avatar_url(80)
316+
317+
response = client.get(reverse('web.ambassadors'))
318+
319+
# We're expecting to the Ambassador under the right country,
320+
# with the right avatar and the right email contact
321+
expected_result = '''
322+
<h2 class="clearfix" id="%s">%s</h2>
323+
<div class="ambassador clearfix">
324+
<img src="%s" alt="%s" width="80" height="80" class="img-circle" />
325+
<h4>%s&nbsp;<span>&nbsp;<a href="mailto:%s" alt="Send me an email"><i class="fa fa-envelope"></i></a>
326+
''' % (test_country_name, test_country_name, test_amb_avatar, test_username, test_full_name, test_email)
327+
328+
expected_result = expected_result.replace('\t', '').replace('\n', '')
329+
ambassadors_content = response.content.replace('\t', '').replace('\n', '')
330+
331+
assert expected_result in ambassadors_content
332+
333+
test_ambassador.delete()
334+
avatar.delete()
335+
336+
195337
@pytest.mark.django_db
196338
def test_nonexistent_event(db, client):
197339
response = client.get(reverse('web.view_event', args=[1234, 'shouldnt-exist']))
198340

199341
assert response.status_code == 404
200342

343+
201344
@pytest.mark.django_db
202345
def test_geoip_slovenian_ip(db, client):
203346
response = client.get('/', REMOTE_ADDR='93.103.53.1')
204347

205348
assert 'List all events in <span id="country"> Slovenia' in response.content
206349

350+
207351
@pytest.mark.django_db
208352
def test_geoip_invalid_ip(db, client):
209353
response = client.get('/', REMOTE_ADDR='127.0.0.1')
210354

211355
assert 'List all events' in response.content
212356
assert 'List all events <span' not in response.content
213357

358+
214359
@pytest.mark.django_db
215360
def test_list_events_for_country_code(db, client):
216361
response = client.get(reverse('web.view_event_by_country', args=['SI']))
217362

218363
assert response.status_code == 200
364+

web/tests/test_events_processors.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,23 @@ def test_scoreboard_counter(admin_user, db):
515515

516516
test_pending_event = create_or_update_event(event_id=None, **event_data)
517517

518+
# and one event from another country, which shouldn't increase the counter
519+
event_data = {
520+
'audience': [3],
521+
'theme': [1,2],
522+
'country': u'IT',
523+
'description': u'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\r\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\r\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\r\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\r\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\r\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
524+
'location': u'Rome, Italy',
525+
'organizer': u'testko',
526+
"creator": admin_user,
527+
'start_date': datetime.datetime.now(),
528+
'end_date': datetime.datetime.now() + datetime.timedelta(days=3, hours=3),
529+
'title': u'Test Approved Event in other country',
530+
'status':"APPROVED",
531+
}
532+
533+
test_other_country_event = create_or_update_event(event_id=None, **event_data)
534+
518535
new_counter = count_approved_events_for_country()
519536

520537
counted_events_after = 0
@@ -535,3 +552,4 @@ def test_scoreboard_counter(admin_user, db):
535552

536553
test_approved_event.delete()
537554
test_pending_event.delete()
555+
test_other_country_event.delete()

0 commit comments

Comments
 (0)