from django.contrib.auth import get_user_model
from django.test import TestCase

from faker import Faker

from conf_site.proposals.tests.factories import ProposalFactory
from symposion.schedule.tests.factories import (
    ConferenceFactory,
    SectionFactory,
)
from symposion.speakers.models import Speaker


class ProposalTestCase(TestCase):
    def setUp(self):
        # Create base conference infrastructure that has to exist in
        # order to create a Proposal.
        self.conference = ConferenceFactory()
        self.section = SectionFactory()
        self.proposal = ProposalFactory()


class ProposalSpeakerTestCase(ProposalTestCase):
    """Abstract test case where user is the proposal's speaker."""

    def setUp(self):
        super().setUp()

        self.faker = Faker()

        USER_EMAIL = self.faker.email()
        USER_PASSWORD = self.faker.password()
        self.user = get_user_model().objects.create_user(
            username=self.faker.profile()["username"],
            email=USER_EMAIL,
            password=USER_PASSWORD,
        )
        speaker = Speaker.objects.create(name=self.faker.name())
        speaker.user = self.user
        speaker.save()

        # Overwrite speaker for this case's proposal.
        self.proposal.speaker = speaker
        self.proposal.save()

        self.assertTrue(
            self.client.login(username=USER_EMAIL, password=USER_PASSWORD)
        )