You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.7 KiB
86 lines
3.7 KiB
from decimal import Decimal
|
|
from django.test import TestCase
|
|
from django.contrib.auth import get_user_model
|
|
from rest_framework.test import APIClient
|
|
from rest_framework import status
|
|
|
|
from apps.profiles.models import Institution
|
|
from apps.donations.models import DonationCampaign, DonationTransaction, CampaignCategory, CampaignPriority, PaymentStatus
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class Phase9DonationsAPITests(TestCase):
|
|
"""
|
|
Automated test suite for Phase 9: Donations & Financial Campaigns
|
|
- Campaign Listing & Filtering
|
|
- Campaign Detail & Progress Calculation
|
|
- Charitable Contribution Flow & Automatic Balance Increment
|
|
"""
|
|
|
|
def setUp(self):
|
|
self.client = APIClient()
|
|
|
|
self.donor = User.objects.create_user(
|
|
email="donor@charitynet.org",
|
|
password="Password123!",
|
|
fullname="Haj Ahmad Karimi",
|
|
)
|
|
self.institution = Institution.objects.create(
|
|
name="Imam Reza Humanitarian Center",
|
|
country="Afghanistan",
|
|
city="Herat",
|
|
type=Institution.InstitutionType.CHARITY,
|
|
)
|
|
self.campaign = DonationCampaign.objects.create(
|
|
title="Clean Water Wells & Winter Food Baskets for Displaced Families",
|
|
description="Emergency humanitarian appeal to construct 15 solar-powered clean water wells.",
|
|
target_amount=Decimal('50000.00'),
|
|
raised_amount=Decimal('12500.00'),
|
|
currency='USD',
|
|
category=CampaignCategory.HUMANITARIAN_RELIEF,
|
|
priority=CampaignPriority.URGENT,
|
|
institution=self.institution,
|
|
organization_name="Astan Relief Foundation",
|
|
is_active=True,
|
|
is_featured=True,
|
|
)
|
|
|
|
def test_campaign_listing_and_filtering(self):
|
|
# 1. List
|
|
response = self.client.get("/api/v1/donations/campaigns/")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(len(response.data), 1)
|
|
self.assertEqual(response.data[0]["title"], self.campaign.title)
|
|
self.assertEqual(response.data[0]["progress_percentage"], 25)
|
|
|
|
# 2. Filter by category
|
|
res_cat = self.client.get(f"/api/v1/donations/campaigns/?category={CampaignCategory.HUMANITARIAN_RELIEF}")
|
|
self.assertEqual(res_cat.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(len(res_cat.data), 1)
|
|
|
|
def test_campaign_detail_view(self):
|
|
response = self.client.get(f"/api/v1/donations/campaigns/{self.campaign.slug}/")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.data["id"], self.campaign.id)
|
|
self.assertEqual(response.data["target_amount"], "50000.00")
|
|
self.assertEqual(response.data["progress_percentage"], 25)
|
|
|
|
def test_donation_contribution_flow(self):
|
|
self.client.force_authenticate(user=self.donor)
|
|
|
|
payload = {
|
|
"amount": 2500.00,
|
|
"donor_name": "Haj Ahmad Karimi",
|
|
}
|
|
response = self.client.post(f"/api/v1/donations/campaigns/{self.campaign.slug}/contribute/", payload, format="json")
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
self.assertTrue(response.data["transaction_reference"].startswith("DON-RAZAVI-"))
|
|
self.assertEqual(response.data["amount"], "2500.00")
|
|
self.assertEqual(response.data["payment_status"], PaymentStatus.COMPLETED)
|
|
|
|
# Check campaign raised amount incremented: 12500 + 2500 = 15000
|
|
self.campaign.refresh_from_db()
|
|
self.assertEqual(self.campaign.raised_amount, Decimal('15000.00'))
|
|
self.assertEqual(self.campaign.progress_percentage, 30)
|
|
self.assertEqual(self.campaign.donors_count, 1)
|