Initial commit

This commit is contained in:
2025-11-18 03:36:49 +08:00
commit d17c7efb3c
7078 changed files with 831480 additions and 0 deletions

72
billing/tests.py Normal file
View File

@@ -0,0 +1,72 @@
from django.test import TestCase, Client
from django.contrib.auth import get_user_model
from django.core.management import call_command
from django.urls import reverse
from decimal import Decimal
from django.utils import timezone
from plans.models import Plan
from domains.models import Domain, DomainTrafficDaily
from billing.models import Invoice
User = get_user_model()
class BillingFlowTests(TestCase):
def setUp(self):
self.user = User.objects.create_user(username='u2', email='u2@example.com', password='p', is_staff=True)
self.plan = Plan.objects.create(name='P', base_price_per_domain=Decimal('10.00'), included_traffic_gb_per_domain=1, overage_price_per_gb=Decimal('1.00'))
today = timezone.now().date()
month_start = today.replace(day=1)
next_month = (month_start.replace(year=month_start.year + 1, month=1) if month_start.month == 12 else month_start.replace(month=month_start.month + 1))
cycle_end = next_month - timezone.timedelta(days=1)
self.domain = Domain.objects.create(user=self.user, name='ex2.com', status=Domain.STATUS_ACTIVE, current_plan=self.plan, current_cycle_start=month_start, current_cycle_end=cycle_end)
DomainTrafficDaily.objects.create(domain=self.domain, day=month_start, bytes=2 * (1024 ** 3))
def test_generate_invoice_and_apply_policy_dry(self):
call_command('generate_invoices')
inv = Invoice.objects.filter(user=self.user).first()
self.assertIsNotNone(inv)
self.assertEqual(inv.status, Invoice.STATUS_UNPAID)
call_command('apply_invoice_policies', dry_run=True)
inv.refresh_from_db()
self.assertEqual(inv.status, Invoice.STATUS_UNPAID)
def test_mark_paid_via_admin_view(self):
call_command('generate_invoices')
inv = Invoice.objects.filter(user=self.user).first()
c = Client()
c.login(username='u2', password='p')
resp = c.post(reverse('admin_panel:billing_detail', kwargs={'invoice_id': inv.id}), {'action': 'mark_paid'})
self.assertEqual(resp.status_code, 302)
inv.refresh_from_db()
self.assertEqual(inv.status, Invoice.STATUS_PAID)
def test_epay_notify_marks_paid(self):
call_command('generate_invoices')
inv = Invoice.objects.filter(user=self.user).first()
from core.models import SystemSettings
s = SystemSettings.objects.order_by('id').first()
if not s:
s = SystemSettings.objects.create()
s.epay_api_base_url = 'https://api.example.com'
s.epay_pid = 'pid1'
s.epay_key = 'k123'
s.save()
params = {
'pid': s.epay_pid,
'out_trade_no': f'INV{inv.id}',
'money': str(inv.amount_total),
'type': 'alipay',
'trade_status': 'SUCCESS',
'sign_type': 'MD5',
}
import hashlib
src = '&'.join(f"{k}={params[k]}" for k in sorted(params) if k not in ['sign', 'sign_type']) + '&key=' + s.epay_key
params['sign'] = hashlib.md5(src.encode('utf-8')).hexdigest().upper()
c = Client()
resp = c.get(reverse('billing:notify'), params)
self.assertEqual(resp.status_code, 200)
inv.refresh_from_db()
self.assertEqual(inv.status, Invoice.STATUS_PAID)