from unittest.mock import patch from django.test import TestCase from django.urls import reverse from factories import CustomUserFactory from nosystemd.models import Donation, DonatorStatus from membership.models import StripeCustomer class LandingViewTests(TestCase): def test_landing_page(self): response = self.client.get( reverse("nosystemd:landing") ) self.assertEqual(response.status_code, 200) class LoginViewTests(TestCase): def test_login_page(self): response = self.client.get( reverse("nosystemd:login") ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/login.html", ) class SignupViewTests(TestCase): def test_signup_page(self): response = self.client.get( reverse("nosystemd:signup") ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/signup.html", ) class DonationViewTests(TestCase): def setUp(self): self.user = CustomUserFactory() self.client.force_login(self.user) def test_donation_page(self): response = self.client.get( reverse("nosystemd:make_donation") ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/donation.html", ) def test_donation_page_contains_stripe_key(self): response = self.client.get( reverse("nosystemd:make_donation") ) self.assertIn( "stripe_key", response.context, ) def test_invalid_donation_form(self): response = self.client.post( reverse("nosystemd:make_donation"), {}, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/donation.html", ) self.assertFalse( response.context["form"].is_valid() ) @patch("nosystemd.views.StripeUtils") @patch("nosystemd.views.StripeCustomer.get_or_create") def test_successful_donation( self, mock_get_or_create, mock_stripe_utils, ): customer = mock_get_or_create.return_value customer.stripe_id = "cus_test_123" customer.id = 1 mock_stripe_utils.return_value.make_charge.return_value = { "response_object": type( "StripeCharge", (), { "id": "ch_test_123", "source": type( "StripeSource", (), { "brand": "Visa", "last4": "4242", }, )(), }, )(), } self.client.post( reverse("nosystemd:make_donation"), { "token": "tok_test", "donation_amount": 10, }, ) class DonationListViewTests(TestCase): def setUp(self): self.user = CustomUserFactory() self.client.force_login(self.user) def test_donation_list_page(self): response = self.client.get( reverse("nosystemd:donations") ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/donations.html", ) self.assertIn( "donations", response.context, ) self.assertIn( "donator_status", response.context, ) def test_donation_list_requires_login(self): self.client.logout() response = self.client.get( reverse("nosystemd:donations") ) self.assertEqual(response.status_code, 302) class DonationDetailViewTests(TestCase): def setUp(self): self.user = CustomUserFactory() self.client.force_login(self.user) def test_donation_detail_requires_login(self): self.client.logout() response = self.client.get( reverse( "nosystemd:donation_detail", kwargs={"pk": 1}, ) ) self.assertEqual(response.status_code, 302) class DonatorStatusDetailViewTests(TestCase): def setUp(self): self.user = CustomUserFactory() self.client.force_login(self.user) def test_status_page_without_status(self): response = self.client.get( reverse("nosystemd:donator_status") ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( response, "nosystemd/donator_status.html", ) def test_status_page_requires_login(self): self.client.logout() response = self.client.get( reverse("nosystemd:donator_status") ) self.assertEqual(response.status_code, 302) class ChangeDonatorStatusViewTests(TestCase): def setUp(self): self.user = CustomUserFactory() self.client.force_login(self.user) def test_change_status(self): status = DonatorStatus.objects.create( user=self.user, status=DonatorStatus.ACTIVE, ) response = self.client.post( reverse( "nosystemd:change_donator_status", kwargs={"pk": status.pk}, ) ) self.assertEqual(response.status_code, 302) self.assertRedirects( response, reverse("nosystemd:donations"), ) status.refresh_from_db() self.assertEqual( status.status, DonatorStatus.CANCELED, )