101 lines
3 KiB
Python
101 lines
3 KiB
Python
|
from datetime import timedelta
|
||
|
from unittest import mock
|
||
|
|
||
|
from django.contrib.auth import get_user_model
|
||
|
from django.core import mail
|
||
|
from django.test import TestCase
|
||
|
from django.utils import timezone
|
||
|
|
||
|
from bda.models import (
|
||
|
Attribution, Participant, Salle, Spectacle, SpectacleRevente, Tirage,
|
||
|
)
|
||
|
|
||
|
User = get_user_model()
|
||
|
|
||
|
|
||
|
class SpectacleReventeTests(TestCase):
|
||
|
fixtures = ['gestioncof/management/data/custommail.json']
|
||
|
|
||
|
def setUp(self):
|
||
|
now = timezone.now()
|
||
|
|
||
|
self.t = Tirage.objects.create(
|
||
|
title='Tirage',
|
||
|
ouverture=now - timedelta(days=7),
|
||
|
fermeture=now - timedelta(days=3),
|
||
|
active=True,
|
||
|
)
|
||
|
self.s = Spectacle.objects.create(
|
||
|
title='Spectacle',
|
||
|
date=now + timedelta(days=20),
|
||
|
location=Salle.objects.create(name='Salle', address='Address'),
|
||
|
price=10.5,
|
||
|
slots=5,
|
||
|
tirage=self.t,
|
||
|
listing=False,
|
||
|
)
|
||
|
|
||
|
self.seller = Participant.objects.create(
|
||
|
user=User.objects.create(
|
||
|
username='seller', email='seller@mail.net'),
|
||
|
tirage=self.t,
|
||
|
)
|
||
|
self.p1 = Participant.objects.create(
|
||
|
user=User.objects.create(username='part1', email='part1@mail.net'),
|
||
|
tirage=self.t,
|
||
|
)
|
||
|
self.p2 = Participant.objects.create(
|
||
|
user=User.objects.create(username='part2', email='part2@mail.net'),
|
||
|
tirage=self.t,
|
||
|
)
|
||
|
self.p3 = Participant.objects.create(
|
||
|
user=User.objects.create(username='part3', email='part3@mail.net'),
|
||
|
tirage=self.t,
|
||
|
)
|
||
|
|
||
|
self.attr = Attribution.objects.create(
|
||
|
participant=self.seller,
|
||
|
spectacle=self.s,
|
||
|
)
|
||
|
|
||
|
self.rev = SpectacleRevente.objects.create(
|
||
|
attribution=self.attr,
|
||
|
seller=self.seller,
|
||
|
)
|
||
|
|
||
|
def test_tirage(self):
|
||
|
revente = self.rev
|
||
|
|
||
|
wanted_by = [self.p1, self.p2, self.p3]
|
||
|
revente.answered_mail = wanted_by
|
||
|
|
||
|
with mock.patch('bda.models.random.choice') as mc:
|
||
|
# Set winner to self.p1.
|
||
|
mc.return_value = self.p1
|
||
|
|
||
|
revente.tirage()
|
||
|
|
||
|
# Call to random.choice used participants in wanted_by.
|
||
|
mc_args, _ = mc.call_args
|
||
|
|
||
|
self.assertEqual(set(mc_args[0]), set(wanted_by))
|
||
|
|
||
|
self.assertEqual(revente.soldTo, self.p1)
|
||
|
self.assertTrue(revente.tirage_done)
|
||
|
|
||
|
mails = {m.to[0]: m for m in mail.outbox}
|
||
|
|
||
|
self.assertEqual(len(mails), 4)
|
||
|
|
||
|
m_seller = mails['seller@mail.net']
|
||
|
self.assertListEqual(m_seller.to, ['seller@mail.net'])
|
||
|
self.assertListEqual(m_seller.reply_to, ['part1@mail.net'])
|
||
|
|
||
|
m_winner = mails['part1@mail.net']
|
||
|
self.assertListEqual(m_winner.to, ['part1@mail.net'])
|
||
|
|
||
|
self.assertCountEqual(
|
||
|
[mails['part2@mail.net'].to, mails['part3@mail.net'].to],
|
||
|
[['part2@mail.net'], ['part3@mail.net']],
|
||
|
)
|