Skip to main content
Glama
sigaihealth

RealVest Real Estate MCP Server

1031-exchange.test.js13.3 kB
import { test } from 'node:test'; import assert from 'node:assert'; import { Exchange1031Calculator } from '../src/calculators/1031-exchange.js'; test('Exchange1031Calculator - Basic 1031 Exchange Analysis', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 500000, original_cost_basis: 300000, improvements_made: 50000, depreciation_taken: 80000, selling_expenses: 30000, property_type: 'residential_rental', ownership_years: 5 }, replacement_property: { purchase_price: 600000, closing_costs: 18000, property_type: 'residential_rental' }, taxpayer_info: { filing_status: 'married_filing_jointly', ordinary_income: 150000, depreciation_recapture_rate: 25, capital_gains_rate: 20 } }); // Test structure assert(result.relinquished_property_analysis, 'Should have relinquished property analysis'); assert(result.tax_analysis, 'Should have tax analysis'); assert(result.exchange_requirements, 'Should have exchange requirements'); assert(result.cash_flow_analysis, 'Should have cash flow analysis'); assert(result.qualification_analysis, 'Should have qualification analysis'); assert(result.long_term_analysis, 'Should have long-term analysis'); assert(result.risk_analysis, 'Should have risk analysis'); assert(result.alternative_scenarios, 'Should have alternative scenarios'); assert(result.recommendations, 'Should have recommendations'); // Test basic calculations assert(result.relinquished_property_analysis.adjusted_basis === 270000, 'Adjusted basis should be cost + improvements - depreciation'); assert(result.relinquished_property_analysis.total_gain === 200000, 'Total gain should be net proceeds - adjusted basis'); assert(result.tax_analysis.without_exchange.total_tax > 0, 'Should calculate tax liability without exchange'); assert(result.exchange_requirements.fully_qualified === true, 'Should qualify for full exchange with higher value replacement'); }); test('Exchange1031Calculator - Partial Exchange with Boot', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 400000, original_cost_basis: 250000, depreciation_taken: 50000, selling_expenses: 24000, property_type: 'commercial' }, replacement_property: { purchase_price: 350000, // Less than net proceeds closing_costs: 10000, property_type: 'commercial' } }); // Test boot calculation assert(result.exchange_requirements.fully_qualified === false, 'Should not be fully qualified with lower replacement value'); assert(result.exchange_requirements.cash_boot > 0, 'Should have cash boot with lower replacement value'); assert(result.exchange_requirements.total_boot > 0, 'Should calculate total boot'); // Boot should be taxable const bootAmount = result.exchange_requirements.total_boot; assert(bootAmount === 16000, 'Boot should equal excess cash received'); // 376k - 360k }); test('Exchange1031Calculator - Like-Kind Qualification Analysis', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 300000, original_cost_basis: 200000, property_type: 'residential_rental', ownership_years: 2 }, replacement_property: { purchase_price: 350000, property_type: 'commercial' // Different type but still like-kind } }); // Test like-kind qualification assert(result.qualification_analysis.overall_qualified === true, 'Residential rental and commercial should be like-kind'); const likeKindReq = result.qualification_analysis.requirements.find( req => req.requirement === 'Like-Kind Property'); assert(likeKindReq.met === true, 'Like-kind requirement should be met'); }); test('Exchange1031Calculator - Timing Requirements', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 400000, original_cost_basis: 300000, property_type: 'multi_family' }, replacement_property: { purchase_price: 450000, property_type: 'multi_family' }, exchange_details: { identification_period_days: 45, exchange_period_days: 180, exchange_type: 'delayed' } }); // Test timing requirements const idReq = result.qualification_analysis.requirements.find( req => req.requirement === '45-Day Identification Rule'); assert(idReq.met === true, '45-day rule should be met'); const exchangeReq = result.qualification_analysis.requirements.find( req => req.requirement === '180-Day Exchange Rule'); assert(exchangeReq.met === true, '180-day rule should be met'); // Test risk analysis for delayed exchange const timingRisk = result.risk_analysis.identified_risks.find( risk => risk.risk === 'Timing Risk'); assert(timingRisk, 'Should identify timing risk for delayed exchange'); }); test('Exchange1031Calculator - Tax Calculation Accuracy', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 600000, original_cost_basis: 400000, depreciation_taken: 100000, selling_expenses: 36000, property_type: 'residential_rental' }, replacement_property: { purchase_price: 700000, property_type: 'residential_rental' }, taxpayer_info: { depreciation_recapture_rate: 25, capital_gains_rate: 20 }, analysis_options: { net_investment_income_tax: true } }); // Test tax calculations const taxAnalysis = result.tax_analysis.without_exchange; // Adjusted basis = 400k + 0 - 100k = 300k // Net proceeds = 600k - 36k = 564k // Total gain = 564k - 300k = 264k // Depreciation recapture = min(100k, 264k) = 100k // Capital gain = 264k - 100k = 164k assert(result.relinquished_property_analysis.depreciation_recapture === 100000, 'Depreciation recapture should be $100k'); assert(result.relinquished_property_analysis.capital_gain === 164000, 'Capital gain should be $164k'); // Tax calculations assert(taxAnalysis.depreciation_recapture_tax === 25000, // 100k * 25% 'Depreciation recapture tax should be $25k'); assert(taxAnalysis.capital_gains_tax === 32800, // 164k * 20% 'Capital gains tax should be $32.8k'); assert(taxAnalysis.niit_tax > 0, 'Should include NIIT when specified'); }); test('Exchange1031Calculator - Cash Flow Impact Analysis', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 500000, original_cost_basis: 300000, depreciation_taken: 60000, selling_expenses: 30000, property_type: 'commercial' }, replacement_property: { purchase_price: 600000, closing_costs: 18000, property_type: 'commercial', financing: { loan_amount: 450000, interest_rate: 7.0, loan_term_years: 30 } } }); // Test cash flow calculations const cashFlow = result.cash_flow_analysis; assert(cashFlow.cash_from_sale === 470000, // 500k - 30k 'Cash from sale should equal sale price minus expenses'); // Cash needed = 600k + 18k = 618k (total needed), minus loan = 168k net cash needed // But the calculator stores total cash needed for comparison assert(cashFlow.cash_needed_for_replacement > 0, 'Should calculate cash needed after financing'); assert(cashFlow.cash_advantage_of_1031 > 0, '1031 exchange should provide cash advantage due to tax savings'); }); test('Exchange1031Calculator - Long-Term Benefits Analysis', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 400000, original_cost_basis: 250000, depreciation_taken: 50000, property_type: 'residential_rental' }, replacement_property: { purchase_price: 450000, property_type: 'residential_rental' }, analysis_options: { holding_period_years: 10 } }); // Test long-term analysis const longTerm = result.long_term_analysis; assert(longTerm.holding_period_years === 10, 'Should use specified holding period'); assert(longTerm.projected_future_value > 450000, 'Future value should be higher than current value'); assert(longTerm.tax_deferral_benefit !== undefined, 'Should calculate tax deferral benefit'); assert(longTerm.effective_tax_rate_reduction > 0, 'Should show effective tax rate reduction'); }); test('Exchange1031Calculator - Risk Analysis', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 800000, original_cost_basis: 500000, property_type: 'industrial' }, replacement_property: { purchase_price: 900000, property_type: 'industrial', financing: { loan_amount: 600000 } }, exchange_details: { exchange_type: 'delayed' } }); // Test risk identification const risks = result.risk_analysis.identified_risks; const timingRisk = risks.find(r => r.risk === 'Timing Risk'); assert(timingRisk, 'Should identify timing risk for delayed exchange'); const financingRisk = risks.find(r => r.risk === 'Financing Risk'); assert(financingRisk, 'Should identify financing risk when loan is involved'); // Market risk is only identified for properties > $1M, so adjust test const hasMarketRisk = risks.find(r => r.risk === 'Market Risk'); // $900k property is close but not quite at the $1M threshold assert(risks.length > 0, 'Should identify some risks'); assert(result.risk_analysis.mitigation_strategies.length > 0, 'Should provide mitigation strategies'); assert(result.risk_analysis.success_probability > 0, 'Should estimate success probability'); }); test('Exchange1031Calculator - Alternative Scenarios', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 500000, original_cost_basis: 300000, depreciation_taken: 40000, selling_expenses: 30000, property_type: 'residential_rental' }, replacement_property: { purchase_price: 550000, property_type: 'residential_rental' }, analysis_options: { alternative_scenario: 'installment_sale' } }); // Test alternative scenarios const alternatives = result.alternative_scenarios; const taxableSale = alternatives.find(alt => alt.strategy === 'Taxable Sale'); assert(taxableSale, 'Should include taxable sale alternative'); assert(taxableSale.immediate_tax > 0, 'Taxable sale should have immediate tax'); const installmentSale = alternatives.find(alt => alt.strategy === 'Installment Sale'); assert(installmentSale, 'Should include installment sale when specified'); assert(installmentSale.immediate_tax === 0, 'Installment sale should defer taxes'); const opportunityZone = alternatives.find(alt => alt.strategy === 'Opportunity Zone Investment'); assert(opportunityZone, 'Should include opportunity zone alternative'); }); test('Exchange1031Calculator - Reverse Exchange Scenario', () => { const calc = new Exchange1031Calculator(); const result = calc.calculate({ relinquished_property: { sale_price: 600000, original_cost_basis: 400000, property_type: 'commercial' }, replacement_property: { purchase_price: 650000, property_type: 'commercial' }, exchange_details: { exchange_type: 'reverse', qualified_intermediary_fee: 5000 } }); // Test reverse exchange handling assert(result.exchange_requirements.qi_fee === 5000, 'Should use specified QI fee'); // Check that qualification analysis is performed assert(result.qualification_analysis.qualification_percentage >= 0, 'Should calculate qualification percentage for reverse exchange'); // Reverse exchanges typically have different risk profile assert(result.risk_analysis.identified_risks.length >= 1, 'Should identify at least one risk for complex exchange types'); }); test('Exchange1031Calculator - Schema Validation', () => { const calc = new Exchange1031Calculator(); const schema = calc.getSchema(); assert(schema.type === 'object', 'Schema should be an object'); assert(schema.properties.relinquished_property, 'Should have relinquished_property'); assert(schema.properties.replacement_property, 'Should have replacement_property'); assert(schema.properties.taxpayer_info, 'Should have taxpayer_info'); assert(schema.properties.exchange_details, 'Should have exchange_details'); assert(schema.properties.analysis_options, 'Should have analysis_options'); assert(schema.required.includes('relinquished_property'), 'relinquished_property should be required'); assert(schema.required.includes('replacement_property'), 'replacement_property should be required'); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sigaihealth/realvestmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server