from django.test import TestCase
from django.urls import reverse

from .factories import OAuthUserFactory, StaffFactory, UserFactory


class BaseTestProfielView(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.url = reverse('users:account')


class TestProfileView(BaseTestProfielView):
    def setUp(self):
        self.user = UserFactory()
        self.client.force_login(self.user)

    def test_cant_acces_if_not_logged_in(self):
        self.client.logout()
        response = self.client.get(self.url, follow=True)
        # Initial redirect will be via to https through a 301
        self.assertRedirects(response, reverse('users:login') + '?next=' + self.url, status_code=301)

    def test_includes_change_password(self):
        response = self.client.get(self.url, follow=True)
        self.assertContains(response, reverse('users:password_change'))

    def test_doesnt_includes_change_password_for_oauth(self):
        self.client.force_login(OAuthUserFactory())
        response = self.client.get(self.url, follow=True)
        self.assertNotContains(response, reverse('users:password_change'))

    def test_cant_set_slack_name(self):
        response = self.client.get(self.url, follow=True)
        self.assertNotContains(response, 'Slack name')


class TestStaffProfileView(BaseTestProfielView):
    def setUp(self):
        self.staff = StaffFactory()
        self.client.force_login(self.staff)

    def test_can_set_slack_name(self):
        response = self.client.get(self.url, follow=True)
        self.assertContains(response, 'Slack name')

    def test_can_not_set_email(self):
        response = self.client.get(self.url, follow=True)
        self.assertNotContains(response, 'Email')