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")