Skip to content

Commit d518b3e

Browse files
authored
Add new talk voting tests. (EuroPython#1124)
* Add new talk voting tests. * Replace the get_default_conference implementation with a factory. * Address review comments.
1 parent 695d2ba commit d518b3e

7 files changed

+223
-84
lines changed

conference/talk_voting.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def talk_voting(request):
8787
def find_talks(user, conference, extra_filters):
8888
"""
8989
This prepares a queryset of Talks with custom data, with an option to pass
90-
addtinal filters related to which talks we want to show.
90+
additional filters related to which talks we want to show.
9191
"""
9292
talks = (
9393
Talk.objects.filter(

docker-compose.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ services:
1010
PYTHONDONTWRITEBYTECODE: 1
1111
DJANGO_SETTINGS_MODULE: "pycon.dev_settings"
1212
SECRET_KEY: "secret"
13-
command: ["./manage.py migrate --no-input && ./manage.py runserver 0.0.0.0:8000"]
13+
command: ["./manage.py migrate --no-input && ./manage.py runserver 0.0.0.0:8888"]
1414
volumes:
1515
- .:/code
1616
ports:
17-
- "8000:8000"
17+
- "8888:8888"

tests/common_tools.py

+16-22
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import http.client
2-
from datetime import date, timedelta
2+
from datetime import date
33
from urllib.parse import urlparse
44

55
from wsgiref.simple_server import make_server
66

77
from django.conf import settings
88
from django.core.cache import cache
9-
from django.utils import timezone
109

1110
from django_factory_boy import auth as auth_factories
1211

1312
from assopy.models import Vat, VatFare
13+
from conference.accounts import get_or_create_attendee_profile_for_new_user
1414
from conference.models import AttendeeProfile, Conference, TALK_STATUS, Fare
1515
from conference.fares import pre_create_typical_fares_for_conference
1616
from tests.factories import (
17-
AssopyUserFactory, OrderFactory, TalkFactory, SpeakerFactory, TalkSpeakerFactory,
17+
AssopyUserFactory, OrderFactory, TalkFactory, SpeakerFactory, TalkSpeakerFactory, ConferenceFactory,
1818
)
1919

2020
HTTP_OK = 200
@@ -190,28 +190,22 @@ def create_valid_ticket_for_user_and_fare(user, fare=None):
190190
return ticket
191191

192192

193-
def get_default_conference(end=None):
194-
if not end:
195-
end = timezone.now() + timedelta(days=35)
193+
def get_default_conference(**kwargs):
194+
return ConferenceFactory(**kwargs)
196195

197-
conference, _ = Conference.objects.get_or_create(
198-
code=settings.CONFERENCE_CONFERENCE,
199-
name="Europython 2020",
200-
# For easier testing open CFP
201-
cfp_start=timezone.now() - timedelta(days=3),
202-
cfp_end=timezone.now() + timedelta(days=3),
203-
conference_start=timezone.now() + timedelta(days=30),
204-
conference_end=end,
205-
# For easier testing also start with open voting
206-
voting_start=timezone.now() - timedelta(days=3),
207-
voting_end=timezone.now() + timedelta(days=3),
208-
)
209-
210-
return conference
211196

197+
def create_talk_for_user(user, **kwargs):
198+
if user is None:
199+
user = create_user()
212200

213-
def create_talk_for_user(user):
214-
talk = TalkFactory(status=TALK_STATUS.proposed, created_by=user)
201+
talk = TalkFactory(**{'status': TALK_STATUS.proposed, 'created_by': user, **kwargs})
215202
speaker = SpeakerFactory(user=user)
216203
TalkSpeakerFactory(talk=talk, speaker=speaker)
217204
return talk
205+
206+
207+
def create_user():
208+
user = auth_factories.UserFactory(is_active=True)
209+
AssopyUserFactory(user=user)
210+
get_or_create_attendee_profile_for_new_user(user)
211+
return user

tests/factories.py

+10-23
Original file line numberDiff line numberDiff line change
@@ -243,32 +243,19 @@ class Meta:
243243
class ConferenceFactory(factory.django.DjangoModelFactory):
244244
class Meta:
245245
model = "conference.Conference"
246+
django_get_or_create = ('code',)
246247

248+
name = 'EuroPython 2020'
247249
code = settings.CONFERENCE_CONFERENCE
248-
name = factory.Faker("sentence", nb_words=6, variable_nb_words=True)
249250

250-
cfp_start = factory.LazyAttribute(
251-
lambda conf: conf.conference_start - timedelta(days=50)
252-
)
253-
cfp_end = factory.LazyAttribute(
254-
lambda conf: conf.cfp_start + timedelta(days=+20)
255-
)
256-
257-
@factory.lazy_attribute
258-
def conference_start(self):
259-
return fake.date_time_this_decade(before_now=True, after_now=True).date()
260-
261-
# conference_start = factory.Faker('date_time_this_decade', before_now=True, after_now=True)
262-
conference_end = factory.LazyAttribute(
263-
lambda conf: (conf.conference_start + timedelta(days=+5))
264-
)
265-
266-
voting_start = factory.LazyAttribute(
267-
lambda conf: conf.cfp_end + timedelta(days=10)
268-
)
269-
voting_end = factory.LazyAttribute(
270-
lambda conf: conf.voting_start + timedelta(days=5)
271-
)
251+
conference_start = factory.LazyAttribute(lambda obj: timezone.now() + timedelta(days=30))
252+
conference_end = factory.LazyAttribute(lambda obj: obj.conference_start + timedelta(days=5))
253+
cfp_start = factory.LazyAttribute(lambda obj: obj.conference_start - timedelta(days=33))
254+
cfp_end = factory.LazyAttribute(lambda obj: obj.cfp_start + timedelta(days=6))
255+
# During a real conference, voting would start after the cfp ends, not run concurrently.
256+
# The opposite is the case here to make testing easier.
257+
voting_start = factory.LazyAttribute(lambda obj: obj.cfp_start)
258+
voting_end = factory.LazyAttribute(lambda obj: obj.cfp_end)
272259

273260

274261
class TicketFactory(factory.django.DjangoModelFactory):

tests/test_homepage.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from django.conf import settings
66
from django.utils import timezone
77
from tests.common_tools import template_used
8-
from conference.models import News
98
from tests.factories import ConferenceFactory, SponsorFactory, NewsFactory
109
from tests.common_tools import get_default_conference
1110

@@ -54,7 +53,7 @@ def test_homepage_contains_last_3_news_for_current_conference(db, client):
5453

5554
def test_homepage_doesnt_display_news_from_non_current_conference(db, client):
5655
current_conf = get_default_conference()
57-
other_conf = ConferenceFactory(code="other")
56+
other_conf = ConferenceFactory(code="other", name="other conf")
5857

5958
current_news = NewsFactory(
6059
conference=current_conf,

0 commit comments

Comments
 (0)