fitaiProto/apps/admin/src/lib/pdf/__tests__/test-pdf-generation.ts
2026-03-19 03:37:15 +01:00

237 lines
5.5 KiB
TypeScript

import type { UserReport, User, Client, FitnessProfile } from "@fitai/shared";
// Mock data for testing
const mockUser: User = {
id: "user_123",
email: "john.doe@example.com",
firstName: "John",
lastName: "Doe",
role: "client",
phone: "555-1234",
createdAt: new Date("2024-01-15"),
updatedAt: new Date("2024-01-15"),
};
const mockClient: Client = {
id: "client_123",
userId: "user_123",
membershipType: "premium",
membershipStatus: "active",
joinDate: new Date("2024-01-15"),
};
const mockProfile: FitnessProfile = {
id: "profile_123",
userId: "user_123",
height: 175,
weight: 70,
age: 30,
gender: "male",
activityLevel: "moderately_active",
createdAt: new Date("2024-01-15"),
updatedAt: new Date("2024-01-15"),
};
const mockReport: UserReport = {
userId: "user_123",
user: mockUser,
client: mockClient,
fitnessProfile: mockProfile,
reportPeriod: {
startDate: "2024-01-01",
endDate: "2024-01-31",
},
weeklyCheckIns: [
{
weekStart: "2024-01-01",
weekEnd: "2024-01-07",
totalCheckIns: 4,
totalTimeMinutes: 240,
averageDurationMinutes: 60,
checkInsByType: [
{ type: "gym", count: 3 },
{ type: "class", count: 1 },
],
},
{
weekStart: "2024-01-08",
weekEnd: "2024-01-14",
totalCheckIns: 5,
totalTimeMinutes: 300,
averageDurationMinutes: 60,
checkInsByType: [
{ type: "gym", count: 4 },
{ type: "class", count: 1 },
],
},
],
nutrition: {
dailySummaries: [
{
date: "2024-01-01",
totalCalories: 2000,
calorieGoal: 2200,
caloriesDelta: -200,
mealsCount: 3,
},
{
date: "2024-01-02",
totalCalories: 2300,
calorieGoal: 2200,
caloriesDelta: 100,
mealsCount: 4,
},
],
averageDailyCalories: 2150,
totalDays: 2,
daysMetGoal: 1,
},
hydration: {
dailySummaries: [
{
date: "2024-01-01",
totalWater: 2000,
waterGoal: 2500,
hydrationPercentage: 80,
},
{
date: "2024-01-02",
totalWater: 2600,
waterGoal: 2500,
hydrationPercentage: 104,
},
],
averageDailyWater: 2300,
totalDays: 2,
daysMetGoal: 1,
},
goals: {
active: [
{
id: "goal_1",
userId: "user_123",
goalType: "weight_target",
title: "Lose 5kg",
description: "Lose weight for summer",
targetValue: 65,
currentValue: 70,
unit: "kg",
startDate: new Date("2024-01-01"),
status: "active",
progress: 0,
priority: "high",
createdAt: new Date("2024-01-01"),
updatedAt: new Date("2024-01-01"),
},
],
completed: [
{
id: "goal_2",
userId: "user_123",
goalType: "strength_milestone",
title: "Bench press 100kg",
targetValue: 100,
currentValue: 100,
unit: "kg",
startDate: new Date("2023-11-01"),
completedDate: new Date("2023-12-15"),
status: "completed",
progress: 100,
priority: "medium",
createdAt: new Date("2023-11-01"),
updatedAt: new Date("2023-12-15"),
},
],
totalActive: 1,
totalCompleted: 1,
averageProgress: 0,
},
profileHistory: [
{
changeType: "weight",
fieldName: "weight",
previousValue: "72",
newValue: "70",
changedAt: new Date("2024-01-15"),
},
],
recommendations: {
accepted: [
{
id: "rec_1",
userId: "user_123",
fitnessProfileId: "profile_123",
recommendationText: "Increase protein intake to 150g per day",
activityPlan: "High protein diet",
dietPlan: "Protein focused",
status: "approved",
generatedAt: new Date("2024-01-10"),
approvedAt: new Date("2024-01-11"),
approvedBy: "user_trainer",
createdAt: new Date("2024-01-10"),
updatedAt: new Date("2024-01-11"),
},
],
rejected: [],
pending: [
{
id: "rec_2",
userId: "user_123",
fitnessProfileId: "profile_123",
recommendationText: "Try HIIT workouts 3 times per week",
activityPlan: "HIIT training",
dietPlan: "No change",
status: "pending",
generatedAt: new Date("2024-01-20"),
createdAt: new Date("2024-01-20"),
updatedAt: new Date("2024-01-20"),
},
],
totalAccepted: 1,
totalRejected: 0,
totalPending: 1,
},
generatedAt: new Date(),
};
// Test function
export async function testPDFGeneration() {
try {
const { generateReportPDFBase64 } = await import(
"@/lib/pdf/report-helpers"
);
console.log("Generating PDF from mock report...");
const pdfBase64 = generateReportPDFBase64(mockReport);
console.log(`PDF generated successfully!`);
console.log(`PDF size: ${Math.round(pdfBase64.length / 1024)} KB`);
// Verify it's a valid base64 string
if (pdfBase64.startsWith("JVBERi0")) {
console.log("✓ PDF is valid (starts with PDF header)");
} else {
console.log("✗ PDF is invalid");
}
return true;
} catch (error) {
console.error("✗ PDF generation failed:", error);
return false;
}
}
// Run if executed directly
if (typeof window === "undefined" && process.argv[1]?.includes("test-pdf")) {
testPDFGeneration()
.then((success) => {
process.exit(success ? 0 : 1);
})
.catch((err) => {
console.error(err);
process.exit(1);
});
}
export default testPDFGeneration;