"""Tests for Questrade parser."""
import pytest
import os
from datetime import datetime
from src.parsers.questrade_parser import QuestradeParser
@pytest.fixture
def sample_pdf_path():
"""Path to sample Questrade PDF."""
return "/Users/jasonlo/Nextcloud/00_Personal/20_Finances/20_Financial_Statements/Investment Statements/Questrade/Questrade TFSA-51516162 Statement 2025-09.pdf"
@pytest.fixture
def parser():
"""Create parser instance."""
return QuestradeParser()
def test_parser_initialization(parser):
"""Test parser initializes correctly."""
assert parser.institution == "Questrade"
@pytest.mark.skipif(
not os.path.exists("/Users/jasonlo/Nextcloud/00_Personal/20_Finances/20_Financial_Statements/Investment Statements/Questrade/Questrade TFSA-51516162 Statement 2025-09.pdf"),
reason="Sample PDF not available"
)
def test_parse_sample_statement(parser, sample_pdf_path):
"""Test parsing the sample Questrade statement."""
statement = parser.parse(sample_pdf_path)
# Check basic fields
assert statement.institution == "Questrade"
assert statement.file_path == sample_pdf_path
assert statement.statement_id.startswith("questrade_")
# Check summary
assert statement.summary.account_number == "51516162"
assert statement.summary.account_type == "TFSA"
assert statement.summary.statement_date.year == 2025
assert statement.summary.statement_date.month == 9
assert statement.summary.current_balance_cad > 0
# Check we have some holdings
assert len(statement.holdings) > 0
# Check for expected holdings
symbols = [h.symbol for h in statement.holdings]
assert "SPY" in symbols or "CMR" in symbols
# Print parsed data for manual verification
print(f"\nParsed Statement:")
print(f" ID: {statement.statement_id}")
print(f" Account: {statement.summary.account_number}")
print(f" Date: {statement.summary.statement_date}")
print(f" Balance: ${statement.summary.current_balance_cad:,.2f}")
print(f" Holdings: {len(statement.holdings)}")
print(f" Transactions: {len(statement.transactions)}")
if statement.holdings:
print(f"\nHoldings:")
for holding in statement.holdings:
print(f" {holding.symbol}: {holding.quantity} @ ${holding.market_price} = ${holding.market_value_cad:,.2f} CAD")
if __name__ == "__main__":
# Run test directly
parser = QuestradeParser()
pdf_path = "/Users/jasonlo/Nextcloud/00_Personal/20_Finances/20_Financial_Statements/Investment Statements/Questrade/Questrade TFSA-51516162 Statement 2025-09.pdf"
if os.path.exists(pdf_path):
print(f"Testing parser with: {pdf_path}")
statement = parser.parse(pdf_path)
print(f"\n✓ Successfully parsed statement!")
print(f" ID: {statement.statement_id}")
print(f" Account: {statement.summary.account_number}")
print(f" Date: {statement.summary.statement_date}")
print(f" Balance: ${statement.summary.current_balance_cad:,.2f}")
print(f" Holdings: {len(statement.holdings)}")
print(f" Transactions: {len(statement.transactions)}")
else:
print(f"Sample PDF not found at: {pdf_path}")