105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
from io import BytesIO
|
|
|
|
from django.test import TestCase
|
|
from openpyxl import load_workbook
|
|
|
|
from apps.reports.services.export_i18n import build_export_locale
|
|
from apps.reports.services.exporters import build_excel_report, build_pdf_report
|
|
|
|
|
|
def make_report_data(*, user_name="Owner User", mobile="09129990001", hourly_rate=None):
|
|
return {
|
|
"scope": {
|
|
"workspace": {"name": "Exports", "thumbnail_path": None},
|
|
"period": "this_month",
|
|
"from_date": "2026-04-01",
|
|
"to_date": "2026-04-30",
|
|
"user": {"name": user_name, "mobile": mobile} if user_name else None,
|
|
},
|
|
"summary": {
|
|
"total_duration": "02:00:00",
|
|
"billable_duration": "02:00:00",
|
|
"non_billable_duration": "00:00:00",
|
|
"income_totals": [{"amount": "30.00", "currency": "USD"}],
|
|
},
|
|
"days": [
|
|
{
|
|
"date": "2026-04-12",
|
|
"billable_duration": "02:00:00",
|
|
"non_billable_duration": "00:00:00",
|
|
"total_duration": "02:00:00",
|
|
"latest_hourly_rate": hourly_rate,
|
|
"income_totals": [{"amount": "30.00", "currency": "USD"}],
|
|
}
|
|
],
|
|
"clients": [
|
|
{
|
|
"name": "Acme",
|
|
"billable_duration": "02:00:00",
|
|
"non_billable_duration": "00:00:00",
|
|
"total_duration": "02:00:00",
|
|
"income_totals": [{"amount": "30.00", "currency": "USD"}],
|
|
}
|
|
],
|
|
"projects": [],
|
|
"tags": [],
|
|
}
|
|
|
|
|
|
class ReportExporterTests(TestCase):
|
|
def test_excel_export_adds_per_user_sheets_and_daily_rate_column(self):
|
|
locale = build_export_locale("en")
|
|
report_data = make_report_data(
|
|
hourly_rate={"amount": "15.00", "currency": "USD"},
|
|
)
|
|
per_user_reports = [
|
|
make_report_data(user_name="Owner User", mobile="09129990001"),
|
|
make_report_data(user_name="Team Mate", mobile="09129990002"),
|
|
]
|
|
|
|
workbook = load_workbook(
|
|
BytesIO(
|
|
build_excel_report(
|
|
report_data=report_data,
|
|
locale=locale,
|
|
per_user_reports=per_user_reports,
|
|
)
|
|
)
|
|
)
|
|
|
|
self.assertEqual(workbook.sheetnames[0], "Overall Report")
|
|
self.assertIn("Owner User", workbook.sheetnames[1])
|
|
self.assertIn("Team Mate", workbook.sheetnames[2])
|
|
|
|
worksheet = workbook.active
|
|
values = list(worksheet.iter_rows(values_only=True))
|
|
|
|
self.assertTrue(any(row[:2] == ("User", "Owner User") for row in values if row))
|
|
self.assertTrue(any(row[:2] == ("Mobile", "09129990001") for row in values if row))
|
|
|
|
daily_header = next(row[:6] for row in values if row and row[0] == "Date")
|
|
self.assertEqual(
|
|
daily_header,
|
|
(
|
|
"Date",
|
|
"Billable hours",
|
|
"Non-billable hours",
|
|
"Total hours",
|
|
"Hourly rate",
|
|
"Income",
|
|
),
|
|
)
|
|
|
|
daily_row = next(row[:6] for row in values if row and row[0] == "2026/04/12")
|
|
self.assertEqual(daily_row[4], "15 USD")
|
|
|
|
def test_pdf_export_supports_persian_locale(self):
|
|
locale = build_export_locale("fa")
|
|
report_data = make_report_data(
|
|
hourly_rate={"amount": "15.00", "currency": "USD"},
|
|
)
|
|
|
|
content = build_pdf_report(report_data=report_data, locale=locale)
|
|
|
|
self.assertEqual(content[:4], b"%PDF")
|