
    >j<                         d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZ ddlZddlmZ dZ G d d      Z G d	 d
      Zy)zCSV/TSV transaction parser tests.

Fixture: tests/fixtures/homedepot.csv
Source:  Home Depot TSV export (no header, tab-separated, UTF-8 BOM)
    N)Decimaldate)	parse_csvztests/fixtures/homedepot.csvc                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestHomDepotFixturec                    t        t              }|j                  }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )N==z.%(py2)s
{%(py2)s = %(py0)s.errors
} == %(py5)sresultpy0py2py5assert %(py7)spy7)r   
HD_FIXTUREerrors
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          >/var/www/html/financials/tests/test_parsers/test_csv_parser.pytest_no_errorsz"TestHomDepotFixture.test_no_errors   sy    :&}}""}""""}""""""v"""v"""}""""""""""    c                    t        t              }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}x}}y )	N   r
   zR%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.transactions
})
} == %(py8)slenr   r   py1py3r   py8assert %(py10)spy10)r   r   transactionsr+   r   r   r   r   r   r   r   r   )r   r   @py_assert2r!   @py_assert7@py_assert6@py_format9@py_format11s           r%   test_transaction_countz*TestHomDepotFixture.test_transaction_count   s    :&&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,r'   c                    t        t              }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr)   r
   )z1%(py2)s
{%(py2)s = %(py0)s.row_count
} == %(py5)sr   r   r   r   )r   r   	row_countr   r   r   r   r   r   r   r   r   s          r%   test_row_countz"TestHomDepotFixture.test_row_count   s~    :&$1$1$$$$1$$$$$$v$$$v$$$$$$1$$$$$$$r'   c                    t        t              }|j                  D ]  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}} y )Nz
Home Depotr
   )z;%(py2)s
{%(py2)s = %(py0)s.merchant_normalized
} == %(py5)str   r   r   )r   r   r2   merchant_normalizedr   r   r   r   r   r   r   r   r   r   r=   r    r!   r"   r#   r$   s           r%   &test_merchant_normalized_to_home_depotz:TestHomDepotFixture.test_merchant_normalized_to_home_depot   s    :&$$ 	9A((8L8(L8888(L88888818881888(888L8888888	9r'   c                    t        t              }t        d |j                  D              }t	        d      t	        d      g}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y )
Nc              3   4   K   | ]  }|j                     y wN)amount.0r=   s     r%   	<genexpr>z3TestHomDepotFixture.test_amounts.<locals>.<genexpr>%   s     ?a?   z839.20z1047.00r
   z%(py0)s == %(py3)samountsr   r.   assert %(py5)sr   )r   r   sortedr2   r   r   r   r   r   r   r   r   r   )r   r   rJ   r3   r    @py_format4r#   s          r%   test_amountsz TestHomDepotFixture.test_amounts#   s    :&?6+>+>??"8,gi.@AAwAAAAAwAAAAAAAwAAAwAAAAAAAAAAAr'   c                    t        t              }t        d |j                  D              }t	        ddd      t	        ddd      g}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}}y )Nc              3   4   K   | ]  }|j                     y wrC   r   rE   s     r%   rG   z1TestHomDepotFixture.test_dates.<locals>.<genexpr>*   s     ;!qvv;rH              r
   rI   datesrK   rL   r   )r   r   rM   r2   r   r   r   r   r   r   r   r   r   )r   r   rV   r3   r    rN   r#   s          r%   
test_dateszTestHomDepotFixture.test_dates(   s    :&;v':':;;dAr*Dq",=>>u>>>>>u>>>>>>>u>>>u>>>>>>>>>>>r'   c                    t        t              }|j                  D ]  }|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}} y )NFis)z1%(py2)s
{%(py2)s = %(py0)s.is_credit
} is %(py5)sr=   r   r   r   )r   r   r2   	is_creditr   r   r   r   r   r   r   r   r?   s           r%   test_purchases_not_creditsz.TestHomDepotFixture.test_purchases_not_credits-   s    :&$$ 	(A;;'%';%'''';%''''''1'''1''';'''%'''''''	(r'   c           	      h   t        t              }|j                  D cg c]  }|j                   }}t	        |      }t        |      }d}||k(  }|sSt        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}}y c c}w )
Nr)   r
   )zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)sr+   sethashes)r   r-   r   py4py6py9assert %(py11)spy11)r   r   r2   
dedup_hashr^   r+   r   r   r   r   r   r   r   r   )
r   r   r=   r_   r"   @py_assert5@py_assert8r4   @py_format10@py_format12s
             r%   test_dedup_hashes_uniquez,TestHomDepotFixture.test_dedup_hashes_unique2   s    :&(.(;(;<1!,,<<v;$s;$1$1$$$$1$$$$$$s$$$s$$$$$$3$$$3$$$$$$v$$$v$$$;$$$$$$1$$$$$$$ =s   F/c                    t        t              }|j                  D ]  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}} y )Ng      ?r
   )z8%(py2)s
{%(py2)s = %(py0)s.confidence_score
} == %(py5)sr=   r   r   r   )r   r   r2   confidence_scorer   r   r   r   r   r   r   r   r?   s           r%   test_confidence_is_1z(TestHomDepotFixture.test_confidence_is_17   s    :&$$ 	-A%%,,%,,,,%,,,,,,1,,,1,,,%,,,,,,,,,,	-r'   N)__name__
__module____qualname__r&   r8   r;   r@   rO   rW   r\   rj   rm    r'   r%   r   r      s0    #-%9
B
?
(
%
-r'   r   c                   ~    e Zd Zddededej                  fdZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zy)TestCsvParserGenericcontentbomreturnc                 X    |rd|z   }t        j                  |j                  d            S )Nu   ﻿zutf-8)ioBytesIOencode)r   rt   ru   s      r%   	_make_csvzTestCsvParserGeneric._make_csv>   s&    goGzz'..122r'   c                 &   | j                  d      }t        |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}x}}|j                  d
   }	|	j                  }d}
||
k(  }|st	        j
                  d|fd||
f      t	        j                  |	      t	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}x}}
|j                  d
   }	|	j                  }d}t        |      }||k(  }|st	        j
                  d|fd||f      t	        j                  |	      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}	x}x}x}}y )Nz@date,description,amount,type
2026-01-15,Starbucks,5.50,purchase
   r
   r*   r+   r   r,   r0   r1   r   	Starbucksz;%(py3)s
{%(py3)s = %(py1)s.merchant_normalized
} == %(py6)sr-   r.   ra   assert %(py8)sr/   z5.50zL%(py3)s
{%(py3)s = %(py1)s.amount
} == %(py9)s
{%(py9)s = %(py5)s(%(py7)s)
}r   r-   r.   r   r   rb   rc   rd   r{   r   r2   r+   r   r   r   r   r   r   r   r   r>   rD   r   )r   csvr   r3   r!   r4   r5   r6   r7   @py_assert0rf   @py_format7rg   rh   ri   s                  r%   test_comma_separatedz)TestCsvParserGeneric.test_comma_separatedC   s   nn3
 3&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,""1%H%99H[H9[HHHH9[HHH%HHH9HHH[HHHHHHH""1%?%,,???,????,???%???,???????????????????????r'   c                 &   | j                  d      }t        |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}x}}|j                  d
   }	|	j                  }d}
||
k(  }|st	        j
                  d|fd||
f      t	        j                  |	      t	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}x}}
|j                  d
   }	|	j                  }d}t        |      }||k(  }|st	        j
                  d|fd||f      t	        j                  |	      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}	x}x}x}}y )Nz#2026-02-01	$29.99	Netflix	purchase
r}   r
   r*   r+   r   r,   r0   r1   r   Netflixr   r   r   r/   z29.99r   r   r   rc   rd   r   )r   tsvr   r3   r!   r4   r5   r6   r7   r   rf   r   rg   rh   ri   s                  r%   test_tab_separatedz'TestCsvParserGeneric.test_tab_separatedM   s   nnFG3&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,""1%F%99FYF9YFFFF9YFFF%FFF9FFFYFFFFFFF""1%@%,,@@0@@,0@@@@@,0@@@@%@@@,@@@@@@@@@@@@@@@0@@@@@@@@@r'   c                 h   | j                  d      }t        |      }|j                  d   }|j                  }d}t	        |      }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}x}}y )
Nz1date,amount,description
2026-03-10,$45.00,Amazon
r   z45.00r
   r   r   r   rc   rd   )r{   r   r2   rD   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r3   r5   rg   r!   rh   ri   s
             r%   %test_dollar_sign_stripped_from_amountz:TestCsvParserGeneric.test_dollar_sign_stripped_from_amountT   s    nn)
 3""1%@%,,@@0@@,0@@@@@,0@@@@%@@@,@@@@@@@@@@@@@@@0@@@@@@@@@r'   c                    | j                  d      }t        |      }|j                  d   }|j                  }d}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}x}}|j                  d   }|j                  }d	}	t        |	      }
||
k(  }|st	        j
                  d
|fd||
f      t	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |	      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}x}x}x}	}
y )Nz=date,amount,description,type
2026-01-20,-15.00,Refund,credit
r   TrY   z1%(py3)s
{%(py3)s = %(py1)s.is_credit
} is %(py6)sr   r   r/   z15.00r
   r   r   r   rc   rd   )r{   r   r2   r[   r   r   r   r   r   rD   r   r   r   r   )r   r   r   r   r3   rf   r!   r   r6   r5   rg   rh   ri   s                r%   test_negative_amount_is_creditz3TestCsvParserGeneric.test_negative_amount_is_credit\   s:   nn0
 3""1%7%//747/47777/4777%777/77747777777""1%@%,,@@0@@,0@@@@@,0@@@@%@@@,@@@@@@@@@@@@@@@0@@@@@@@@@r'   c                    | j                  d      }t        |      }|j                  d   }|j                  }d}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}x}}y )	Nz>date,amount,description,type
2026-01-20,15.00,Payment,payment
r   TrY   r   r   r   r/   )	r{   r   r2   r[   r   r   r   r   r   )	r   r   r   r   r3   rf   r!   r   r6   s	            r%    test_credit_type_marks_is_creditz5TestCsvParserGeneric.test_credit_type_marks_is_credite   s    nn1
 3""1%7%//747/47777/4777%777/77747777777r'   c                    | j                  d      }t        |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}x}}y )
NzDdate,description,amount
2026-01-10,Coffee,3.50

2026-01-11,Tea,2.50
r)   r
   r*   r+   r   r,   r0   r1   r{   r   r2   r+   r   r   r   r   r   r   r   r   )	r   r   r   r3   r!   r4   r5   r6   r7   s	            r%   test_blank_rows_skippedz,TestCsvParserGeneric.test_blank_rows_skippedm   s    nn$
 3&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,r'   c                    | j                  dd      }t        |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      d	z  }d
d|iz  }t        t	        j                  |            d x}x}x}}y )Nz 2026-01-01	$10.00	Shop	purchase
T)ru   r}   r
   r*   r+   r   r,   r0   r1   r   )	r   r   r   r3   r!   r4   r5   r6   r7   s	            r%   test_utf8_bom_handledz*TestCsvParserGeneric.test_utf8_bom_handledw   s    nnCnN3&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,r'   c           
         | j                  d      }t        |      }|j                  d   }|j                  }d}d}d}t        |||      }||k(  }	|	st	        j
                  d|	fd||f      t	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      d	z  }
d
d|
iz  }t        t	        j                  |            d x}x}x}	x}x}x}}y )Nz1date,description,amount
05/15/2026,Walmart,22.50
r   rR   rS      r
   z_%(py3)s
{%(py3)s = %(py1)s.date
} == %(py13)s
{%(py13)s = %(py5)s(%(py7)s, %(py9)s, %(py11)s)
}r   r-   r.   r   r   rb   rd   py13assert %(py15)spy15r{   r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r5   rg   @py_assert10@py_assert12r!   @py_format14@py_format16s               r%   test_date_format_slashz+TestCsvParserGeneric.test_date_format_slash|   s    nn)
 3""1%?%**?4??B?d4B.??*.?????*.????%???*??????d???d???4??????B???.?????????r'   c           
         | j                  d      }t        |      }|j                  d   }|j                  }d}d}d}t        |||      }||k(  }	|	st	        j
                  d|	fd||f      t	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      d	z  }
d
d|
iz  }t        t	        j                  |            d x}x}x}	x}x}x}}y )Nz0date,description,amount
2026-07-04,Target,18.99
r   rR         r
   r   r   r   r   r   r   r   s               r%   test_date_format_isoz)TestCsvParserGeneric.test_date_format_iso   s    nn(
 3""1%>%**>4>>A>d4A.>>*.>>>>>*.>>>>%>>>*>>>>>>d>>>d>>>4>>>>>>A>>>.>>>>>>>>>r'   c                    | j                  d      }t        |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}x}}|j                  d
   }	|	j                  }d}t        |      }
||
k(  }|st	        j
                  d|fd||
f      t	        j                  |	      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}x}x}}
y )Nz"05/26/2026	$50.00	Costco	purchase
r}   r
   r*   r+   r   r,   r0   r1   r   z50.00r   r   r   rc   rd   )r{   r   r2   r+   r   r   r   r   r   r   r   r   rD   r   )r   r   r   r3   r!   r4   r5   r6   r7   r   rg   rh   ri   s                r%   test_no_header_autodetectz.TestCsvParserGeneric.test_no_header_autodetect   sl   nnEF3&&,s&',1,'1,,,,'1,,,,,,s,,,s,,,,,,6,,,6,,,&,,,',,,1,,,,,,,""1%@%,,@@0@@,0@@@@@,0@@@@%@@@,@@@@@@@@@@@@@@@0@@@@@@@@@r'   c                    | j                  d      }t        |d      }|j                  d   }|j                  }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}x}}y )
Nz(2026-01-01	$5.00	Test Merchant	purchase
my_bank)issuerr   r
   )z.%(py3)s
{%(py3)s = %(py1)s.issuer
} == %(py6)sr   r   r/   )	r{   r   r2   r   r   r   r   r   r   )	r   r   r   r   r3   rf   r!   r   r6   s	            r%   test_issuer_assignedz)TestCsvParserGeneric.test_issuer_assigned   s    nnKL3y1""1%9%,,9	9,	9999,	999%999,999	9999999r'   c                 `   t        t        j                  d            }|j                  }g }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|j                  }g }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y )	Nr'   r
   )z4%(py2)s
{%(py2)s = %(py0)s.transactions
} == %(py5)sr   r   r   r   r   )r   rx   ry   r2   r   r   r   r   r   r   r   r   r   r   s          r%   test_empty_file_returns_emptyz2TestCsvParserGeneric.test_empty_file_returns_empty   s    2::c?+""(b("b(((("b((((((v(((v((("(((b(((((((}}""}""""}""""""v"""v"""}""""""""""r'   N)F)rn   ro   rp   strboolrx   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   rq   r'   r%   rs   rs   =   sb    3 34 3BJJ 3
@AAA8--
@?A:
#r'   rs   )__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   rx   decimalr   datetimer   pytestapp.services.csv_parserr   r   r   rs   rq   r'   r%   <module>r      s;   
  	    -+
)- )-X]# ]#r'   