164 lines
5.1 KiB
TypeScript
164 lines
5.1 KiB
TypeScript
import { requireAuth } from '@/server/utils/auth';
|
|
import {
|
|
convertToUSD,
|
|
getCurrencySymbol,
|
|
formatPriceWithCurrency,
|
|
createDisplayPrice,
|
|
getExchangeRates,
|
|
processExpenseWithCurrency
|
|
} from '@/server/utils/currency';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
await requireAuth(event);
|
|
|
|
console.log('[currency/test] Running currency conversion tests...');
|
|
|
|
try {
|
|
const testResults = {
|
|
timestamp: new Date().toISOString(),
|
|
tests: [] as any[]
|
|
};
|
|
|
|
// Test 1: Get exchange rates
|
|
console.log('[currency/test] Test 1: Getting exchange rates...');
|
|
const rates = await getExchangeRates();
|
|
testResults.tests.push({
|
|
name: 'Get Exchange Rates',
|
|
success: !!rates,
|
|
data: rates ? {
|
|
cached: true,
|
|
ratesCount: Object.keys(rates.rates).length,
|
|
lastUpdated: rates.lastUpdated,
|
|
sampleRates: {
|
|
EUR: rates.rates.EUR,
|
|
GBP: rates.rates.GBP,
|
|
JPY: rates.rates.JPY
|
|
}
|
|
} : null
|
|
});
|
|
|
|
// Test 2: Currency symbol mapping
|
|
console.log('[currency/test] Test 2: Testing currency symbols...');
|
|
const symbolTests = ['EUR', 'USD', 'GBP', 'JPY', 'CHF'];
|
|
const symbols = symbolTests.map(code => ({
|
|
code,
|
|
symbol: getCurrencySymbol(code)
|
|
}));
|
|
testResults.tests.push({
|
|
name: 'Currency Symbols',
|
|
success: true,
|
|
data: symbols
|
|
});
|
|
|
|
// Test 3: Currency conversion
|
|
console.log('[currency/test] Test 3: Testing currency conversion...');
|
|
const conversionTests = [
|
|
{ amount: 100, from: 'EUR' },
|
|
{ amount: 50, from: 'GBP' },
|
|
{ amount: 1000, from: 'JPY' },
|
|
{ amount: 100, from: 'USD' } // Should be 1:1 conversion
|
|
];
|
|
|
|
const conversions = [];
|
|
for (const test of conversionTests) {
|
|
try {
|
|
const result = await convertToUSD(test.amount, test.from);
|
|
conversions.push({
|
|
original: `${test.amount} ${test.from}`,
|
|
result: result ? {
|
|
usdAmount: result.usdAmount,
|
|
rate: result.rate,
|
|
formatted: formatPriceWithCurrency(result.usdAmount, 'USD')
|
|
} : null,
|
|
success: !!result
|
|
});
|
|
} catch (error) {
|
|
conversions.push({
|
|
original: `${test.amount} ${test.from}`,
|
|
result: null,
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error'
|
|
});
|
|
}
|
|
}
|
|
testResults.tests.push({
|
|
name: 'Currency Conversions',
|
|
success: conversions.every(c => c.success),
|
|
data: conversions
|
|
});
|
|
|
|
// Test 4: Display price formatting
|
|
console.log('[currency/test] Test 4: Testing display price formatting...');
|
|
const displayTests = [
|
|
{ amount: 45.99, currency: 'EUR', usd: 48.12 },
|
|
{ amount: 100, currency: 'USD' }, // No USD conversion needed
|
|
{ amount: 85.50, currency: 'GBP', usd: 103.25 }
|
|
];
|
|
|
|
const displayPrices = displayTests.map(test => ({
|
|
original: { amount: test.amount, currency: test.currency },
|
|
display: createDisplayPrice(test.amount, test.currency, test.usd),
|
|
formatted: formatPriceWithCurrency(test.amount, test.currency)
|
|
}));
|
|
testResults.tests.push({
|
|
name: 'Display Price Formatting',
|
|
success: true,
|
|
data: displayPrices
|
|
});
|
|
|
|
// Test 5: Full expense processing
|
|
console.log('[currency/test] Test 5: Testing full expense processing...');
|
|
const mockExpense = {
|
|
Id: 999,
|
|
'Establishment Name': 'Test Restaurant',
|
|
Price: '45.99',
|
|
currency: 'EUR',
|
|
'Payment Method': 'Card',
|
|
Category: 'Food/Drinks',
|
|
Payer: 'Test User',
|
|
Time: new Date().toISOString(),
|
|
Contents: 'Test expense for currency conversion',
|
|
Receipt: [],
|
|
Paid: false,
|
|
CreatedAt: new Date().toISOString(),
|
|
UpdatedAt: new Date().toISOString()
|
|
};
|
|
|
|
const processedExpense = await processExpenseWithCurrency(mockExpense);
|
|
testResults.tests.push({
|
|
name: 'Full Expense Processing',
|
|
success: !!(processedExpense.PriceUSD && processedExpense.DisplayPrice),
|
|
data: {
|
|
original: mockExpense,
|
|
processed: {
|
|
PriceNumber: processedExpense.PriceNumber,
|
|
CurrencySymbol: processedExpense.CurrencySymbol,
|
|
PriceUSD: processedExpense.PriceUSD,
|
|
ConversionRate: processedExpense.ConversionRate,
|
|
DisplayPrice: processedExpense.DisplayPrice,
|
|
DisplayPriceUSD: processedExpense.DisplayPriceUSD
|
|
}
|
|
}
|
|
});
|
|
|
|
// Calculate overall success
|
|
const overallSuccess = testResults.tests.every(test => test.success);
|
|
|
|
console.log(`[currency/test] Tests completed. Overall success: ${overallSuccess}`);
|
|
|
|
return {
|
|
success: overallSuccess,
|
|
message: overallSuccess ? 'All currency tests passed' : 'Some currency tests failed',
|
|
results: testResults
|
|
};
|
|
|
|
} catch (error: any) {
|
|
console.error('[currency/test] Error during currency tests:', error);
|
|
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: error.message || 'Currency test failed'
|
|
});
|
|
}
|
|
});
|