diff --git a/opentech/apply/determinations/tests/test_views.py b/opentech/apply/determinations/tests/test_views.py index 5f3f0c00523e6d466094e84bd86924ac5d4e2af2..b5d8f49823dc05300e77ebbc06123f79a183ff9d 100644 --- a/opentech/apply/determinations/tests/test_views.py +++ b/opentech/apply/determinations/tests/test_views.py @@ -1,42 +1,18 @@ -from django.test import TestCase, RequestFactory from django.urls import reverse from opentech.apply.activity.models import Activity from opentech.apply.determinations.models import ACCEPTED from opentech.apply.users.tests.factories import StaffFactory, UserFactory from opentech.apply.funds.tests.factories import ApplicationSubmissionFactory +from opentech.apply.utils.testing import BaseViewTestCase from .factories import DeterminationFactory -class BaseTestCase(TestCase): - url_name = '' - user_factory = None - - def setUp(self): - self.factory = RequestFactory() - self.user = self.user_factory() - self.client.force_login(self.user) - - def url(self, instance, view_name='detail'): - full_url_name = self.url_name.format(view_name) - url = reverse(full_url_name, kwargs=self.get_kwargs(instance)) - request = self.factory.get(url, secure=True) - return request.build_absolute_uri() - - def get_page(self, instance, view_name='detail'): - return self.client.get(self.url(instance, view_name), secure=True, follow=True) - - def post_page(self, instance, data, view_name='detail'): - return self.client.post(self.url(instance, view_name), data, secure=True, follow=True) - - def refresh(self, instance): - return instance.__class__.objects.get(id=instance.id) - - -class StaffDeterminationsTestCase(BaseTestCase): +class StaffDeterminationsTestCase(BaseViewTestCase): user_factory = StaffFactory url_name = 'funds:submissions:determinations:{}' + base_view_name = 'detail' def get_kwargs(self, instance): return {'submission_pk': instance.submission.id} @@ -60,9 +36,10 @@ class StaffDeterminationsTestCase(BaseTestCase): self.assertTrue(response.context['can_view_extended_data']) -class DeterminationFormTestCase(BaseTestCase): +class DeterminationFormTestCase(BaseViewTestCase): user_factory = StaffFactory url_name = 'funds:submissions:determinations:{}' + base_view_name = 'detail' def get_kwargs(self, instance): return {'submission_pk': instance.id} @@ -141,9 +118,10 @@ class DeterminationFormTestCase(BaseTestCase): self.assertEqual(submission_next.status, 'draft_proposal') -class UserDeterminationFormTestCase(BaseTestCase): +class UserDeterminationFormTestCase(BaseViewTestCase): user_factory = UserFactory url_name = 'funds:submissions:determinations:{}' + base_view_name = 'detail' def get_kwargs(self, instance): return {'submission_pk': instance.id} diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py index 05e972613c8e43636b4cfad614a334589f68c2e9..f4f661f340210cd0f09e24aca5f65729045adcae 100644 --- a/opentech/apply/funds/tests/factories/models.py +++ b/opentech/apply/funds/tests/factories/models.py @@ -21,6 +21,7 @@ from opentech.apply.funds.models.forms import ( ) from opentech.apply.users.tests.factories import StaffFactory, UserFactory from opentech.apply.stream_forms.testing.factories import FormDataFactory +from opentech.apply.home.factories import ApplyHomePageFactory from . import blocks @@ -69,6 +70,21 @@ class FundTypeFactory(wagtail_factories.PageFactory): # Will need to update how the stages are identified as Fund Page changes workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1]) + @factory.post_generation + def parent(self, create, extracted_parent, **parent_kwargs): + # THIS MUST BE THE FIRST POST GENERATION METHOD OR THE OBJECT WILL BE UNSAVED + if create: + if extracted_parent and parent_kwargs: + raise ValueError('Cant pass a parent instance and attributes') + + if not extracted_parent: + parent = ApplyHomePageFactory(**parent_kwargs) + else: + # Assume root node if no parent passed + parent = extracted_parent + + parent.add_child(instance=self) + @factory.post_generation def forms(self, create, extracted, **kwargs): if create: @@ -84,6 +100,7 @@ class FundTypeFactory(wagtail_factories.PageFactory): ReviewFormFactory(**review_fields) + class RequestForPartnersFactory(FundTypeFactory): class Meta: model = RequestForPartners @@ -98,7 +115,7 @@ class AbstractRelatedFormFactory(factory.DjangoModelFactory): class ApplicationBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = ApplicationBaseForm - application = factory.SubFactory(FundTypeFactory, parent=None) + application = factory.SubFactory(FundTypeFactory) class ApplicationFormFactory(factory.DjangoModelFactory): @@ -120,7 +137,7 @@ class RoundFactory(wagtail_factories.PageFactory): ) title = factory.Sequence('Round {}'.format) - start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * n)) + start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * n + 1)) end_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * (n + 1))) lead = factory.SubFactory(StaffFactory) @@ -149,7 +166,7 @@ class TodayRoundFactory(RoundFactory): class RoundBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = RoundBaseForm - round = factory.SubFactory(RoundFactory, parent=None) + round = factory.SubFactory(RoundFactory) class LabFactory(wagtail_factories.PageFactory): @@ -179,7 +196,7 @@ class LabFactory(wagtail_factories.PageFactory): class LabBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = LabBaseForm - lab = factory.SubFactory(LabFactory, parent=None) + lab = factory.SubFactory(LabFactory) class ApplicationFormDataFactory(FormDataFactory): diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py index 4570f9a12ded04f3def74fa8c46884fe8ad440d4..44b07e3891733bd7d965a3a58d94d785edb59433 100644 --- a/opentech/apply/funds/tests/test_models.py +++ b/opentech/apply/funds/tests/test_models.py @@ -179,6 +179,7 @@ class TestRoundModelWorkflowAndForms(TestCase): self.assertNotEqual(round_form, fund_form) +@override_settings(ROOT_URLCONF='opentech.apply.urls') class TestFormSubmission(TestCase): def setUp(self): self.site = Site.objects.first() diff --git a/opentech/apply/home/factories.py b/opentech/apply/home/factories.py new file mode 100644 index 0000000000000000000000000000000000000000..aa53b814af17d25b41e4a9a896fa12f3892c0df5 --- /dev/null +++ b/opentech/apply/home/factories.py @@ -0,0 +1,14 @@ +import factory +import wagtail_factories + +from .models import ApplyHomePage + + +class ApplyHomePageFactory(wagtail_factories.PageFactory): + class Meta: + model = ApplyHomePage + + @factory.post_generation + def site(self, create, extracted_site, **site_kwargs): + if create: + wagtail_factories.SiteFactory(root_page=self, is_default_site=True) diff --git a/opentech/apply/users/tests/test_oauth_access.py b/opentech/apply/users/tests/test_oauth_access.py index 92d3f2ae25fa42123fb5d1530574e3604a1c2d72..1cc2f13ab373fe94f72bb9e3b4d09a753bba97e8 100644 --- a/opentech/apply/users/tests/test_oauth_access.py +++ b/opentech/apply/users/tests/test_oauth_access.py @@ -4,6 +4,7 @@ from django.test import TestCase, override_settings from django.urls import reverse +@override_settings(ROOT_URLCONF='opentech.apply.urls') class TestOAuthAccess(TestCase): def login(self): email = 'test@email.com' @@ -19,8 +20,12 @@ class TestOAuthAccess(TestCase): """ oauth_page = reverse('users:oauth') response = self.client.get(oauth_page, follow=True) - self.assertRedirects(response, reverse( - 'users:login') + '?next=' + reverse('users:oauth'), status_code=301, target_status_code=200) + self.assertRedirects( + response, + reverse('users_public:login') + '?next=' + reverse('users:oauth'), + status_code=301, + target_status_code=200, + ) @override_settings() def test_oauth_not_set_up(self): diff --git a/opentech/apply/users/tests/test_views.py b/opentech/apply/users/tests/test_views.py index 1943e508315cfd891b11d2095dd1b5e2639c4af0..caf7fa8a03aef0e7c3f669886493fbcd80d3430f 100644 --- a/opentech/apply/users/tests/test_views.py +++ b/opentech/apply/users/tests/test_views.py @@ -1,9 +1,10 @@ -from django.test import TestCase +from django.test import override_settings, TestCase from django.urls import reverse from .factories import OAuthUserFactory, StaffFactory, UserFactory +@override_settings(ROOT_URLCONF='opentech.apply.urls') class BaseTestProfielView(TestCase): @classmethod def setUpTestData(cls): @@ -19,7 +20,7 @@ class TestProfileView(BaseTestProfielView): 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) + self.assertRedirects(response, reverse('users_public:login') + '?next=' + self.url, status_code=301) def test_includes_change_password(self): response = self.client.get(self.url, follow=True) diff --git a/opentech/apply/users/views.py b/opentech/apply/users/views.py index 8f8e3dab59ca43446f461283062957c5c640f132..7dadd850d5bac0ad6c823836d608641d699e36a5 100644 --- a/opentech/apply/users/views.py +++ b/opentech/apply/users/views.py @@ -49,7 +49,7 @@ class AccountView(UpdateView): ) -@login_required(login_url=reverse_lazy('users:login')) +@login_required() def become(request): if request.POST: id = request.POST['user'] @@ -57,7 +57,7 @@ def become(request): return redirect('users:account') -@login_required(login_url=reverse_lazy('users:login')) +@login_required() @require_oauth_whitelist def oauth(request): """Generic, empty view for the OAuth associations.""" diff --git a/opentech/apply/utils/testing/tests.py b/opentech/apply/utils/testing/tests.py index 624a0e774709a6132effa56141744a85f062d82c..c0b0edd1cfd75239c459eedb1d0ae8c0911950d6 100644 --- a/opentech/apply/utils/testing/tests.py +++ b/opentech/apply/utils/testing/tests.py @@ -1,6 +1,6 @@ from django.contrib.messages.storage.fallback import FallbackStorage from django.contrib.auth.models import AnonymousUser -from django.test import TestCase, RequestFactory +from django.test import override_settings, TestCase, RequestFactory from django.urls import reverse @@ -17,6 +17,7 @@ def make_request(user=AnonymousUser(), data={}, method='get', site=None): return request +@override_settings(ROOT_URLCONF='opentech.apply.urls') class BaseViewTestCase(TestCase): url_name = '' # resolvable url, you should use "path:to:view:{}" and {} with be replaced with base_view_name base_view_name = '' diff --git a/opentech/settings/base.py b/opentech/settings/base.py index 96dbe0fa65ac84e3afcefe49d24d58ae369f59ae..ee5936c07b073ef82777fcf99cf1cdeaa6f0cc33 100644 --- a/opentech/settings/base.py +++ b/opentech/settings/base.py @@ -320,7 +320,7 @@ SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = STAFF_EMAIL_DOMAINS SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '' SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '' -SOCIAL_AUTH_LOGIN_ERROR_URL = 'users:login' +SOCIAL_AUTH_LOGIN_ERROR_URL = 'users_public:login' SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = 'users:account' # For pipelines, see http://python-social-auth.readthedocs.io/en/latest/pipeline.html?highlight=pipelines#authentication-pipeline