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

# Create your tests here.


class SavedJobsPageTests(TestCase):
    def setUp(self):
        from accounts.models import User
        from jobs.models import Job, JobCategory, SavedJob

        self.user = User.objects.create_user(username='sv', email='sv@x.com', password='pw12345!', role=User.Role.SEEKER)
        self.other = User.objects.create_user(username='sv2', email='sv2@x.com', password='pw12345!', role=User.Role.SEEKER)
        owner = User.objects.create_user(username='ow', email='ow@x.com', password='pw12345!', role=User.Role.COMPANY)
        cat = JobCategory.objects.create(name='Saved Cat', slug='saved-cat')
        self.jobs = [Job.objects.create(title=f'Role {i}', slug=f'role-s{i}', company_name='Acme', company_slug='acme', company_initials='A',
                                        location='Lusaka', category=cat, description='d', requirements='r', posted_by=owner, is_active=True)
                     for i in range(2)]
        SavedJob.objects.create(user=self.user, job=self.jobs[0])
        SavedJob.objects.create(user=self.other, job=self.jobs[1])
        self.url = reverse('seekers:saved')

    def test_lists_only_my_saved_jobs_and_is_linked_from_the_sidebar(self):
        self.client.force_login(self.user)
        html = self.client.get(self.url).content.decode()
        self.assertIn('Role 0', html)
        self.assertNotIn('Role 1', html)
        self.assertIn(self.url, html)
        self.assertIn('Saved Jobs', html)

    def test_remove_button_unsaves_and_returns_to_the_list(self):
        from jobs.models import SavedJob

        self.client.force_login(self.user)
        response = self.client.post(reverse('jobs:save', args=[self.jobs[0].slug]), {'next': self.url})
        self.assertRedirects(response, self.url)
        self.assertFalse(SavedJob.objects.filter(user=self.user, job=self.jobs[0]).exists())
        self.assertContains(self.client.get(self.url), 'not saved any jobs')

    def test_requires_sign_in(self):
        self.assertEqual(self.client.get(self.url).status_code, 302)


class BackToSiteButtonTests(TestCase):
    def test_public_pages_do_not_show_back_to_site(self):
        from accounts.models import User

        user = User.objects.create_user(username='bt', email='bt@x.com', password='pw12345!', role=User.Role.SEEKER)
        self.client.force_login(user)
        for name in ('seekers:list', 'subscriptions:pricing', 'jobs:list', 'companies:list'):
            self.assertNotIn('back-to-site', self.client.get(reverse(name)).content.decode(), name)
