faber-finances/app/pages/test.vue

206 lines
5.3 KiB
Vue

<template>
<div class="min-h-screen bg-gray-50">
<div class="max-w-4xl mx-auto px-4 py-8">
<h1 class="text-2xl font-bold mb-6">Cash Flow Test Page</h1>
<!-- Test Results -->
<UCard class="mb-6">
<template #header>
<h2 class="text-lg font-semibold">Component Test Results</h2>
</template>
<div class="space-y-4">
<div
v-for="test in testResults"
:key="test.name"
class="flex items-center justify-between">
<span>{{ test.name }}</span>
<UBadge :color="test.passed ? 'green' : 'red'">
{{ test.passed ? "PASS" : "FAIL" }}
</UBadge>
</div>
</div>
</UCard>
<!-- Cash Flow Summary -->
<UCard class="mb-6">
<template #header>
<h2 class="text-lg font-semibold">Cash Flow Summary</h2>
</template>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="text-center">
<p class="text-sm text-gray-600">Current Balance</p>
<p class="text-xl font-bold">
{{ formatCurrency(cashFlow.currentBalance.value) }}
</p>
</div>
<div class="text-center">
<p class="text-sm text-gray-600">Transactions</p>
<p class="text-xl font-bold">
{{ cashFlow.transactions.value.length }}
</p>
</div>
<div class="text-center">
<p class="text-sm text-gray-600">Monthly Burn</p>
<p class="text-xl font-bold">
{{ formatCurrency(cashFlow.monthlyBurnRate.value) }}
</p>
</div>
<div class="text-center">
<p class="text-sm text-gray-600">Runway Days</p>
<p class="text-xl font-bold">
{{ Math.round(cashFlow.runwayDays.value) }}
</p>
</div>
</div>
</UCard>
<!-- Mini Chart Test -->
<UCard class="mb-6">
<template #header>
<h2 class="text-lg font-semibold">Chart Test (8 weeks)</h2>
</template>
<CashFlowChart :data="testProjections" :critical-balance="30000" />
</UCard>
<!-- Mini Transaction Manager Test -->
<UCard>
<template #header>
<h2 class="text-lg font-semibold">Transaction Manager Test</h2>
</template>
<RecurringTransactionManager
:transactions="cashFlow.transactions.value"
@add-transaction="handleAddTransaction"
@edit-transaction="handleEditTransaction" />
</UCard>
</div>
</div>
</template>
<script setup lang="ts">
import type { Transaction } from "~/types/cashflow";
// SEO
useSeoMeta({
title: "Test Page",
description: "Testing cash flow functionality",
});
// Initialize cash flow
const cashFlow = useCashFlow();
// Test data
const testTransactions: Transaction[] = [
{
id: "test-1",
date: new Date("2024-01-01"),
description: "Test Salary",
amount: 10000,
category: "Income",
type: "recurring",
frequency: "monthly",
probability: 1.0,
isConfirmed: true,
status: "committed",
},
{
id: "test-2",
date: new Date("2024-01-01"),
description: "Test Rent",
amount: -2000,
category: "Expense: Need",
type: "recurring",
frequency: "monthly",
probability: 1.0,
isConfirmed: true,
status: "committed",
},
];
// Test results
const testResults = computed(() => {
const results = [];
// Test 1: Composable loads
try {
results.push({
name: "useCashFlow composable loads",
passed: !!cashFlow,
});
} catch {
results.push({
name: "useCashFlow composable loads",
passed: false,
});
}
// Test 2: Transaction updates work
try {
results.push({
name: "Transaction updates work",
passed: typeof cashFlow.updateTransactions === "function",
});
} catch {
results.push({
name: "Transaction updates work",
passed: false,
});
}
// Test 3: Projections generate
try {
const projections = cashFlow.generateWeeklyProjections(4);
results.push({
name: "Weekly projections generate",
passed: Array.isArray(projections) && projections.length > 0,
});
} catch {
results.push({
name: "Weekly projections generate",
passed: false,
});
}
// Test 4: Runway calculation works
try {
const runway = cashFlow.runwayDays.value;
results.push({
name: "Runway calculation works",
passed: typeof runway === "number",
});
} catch {
results.push({
name: "Runway calculation works",
passed: false,
});
}
return results;
});
const testProjections = computed(() => {
return cashFlow.generateWeeklyProjections(8);
});
const handleAddTransaction = () => {
console.log("Add transaction test");
};
const handleEditTransaction = (transaction: Transaction) => {
console.log("Edit transaction test:", transaction.description);
};
const formatCurrency = (amount: number) => {
return new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(amount);
};
// Initialize test data
onMounted(() => {
cashFlow.setCurrentBalance(75000);
cashFlow.updateTransactions(testTransactions);
});
</script>