
    Ij"                        d Z ddlZddlmc mZ ddlZddlZddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ ddlmZ  ej*                         d        Z ej*                         d	        Z ej*                         d
        Z	 	 ddZ ej*                         d        Zd Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z y)u-   
Transaction CSV export tests — Story 3.6.
    N)Decimal)db)Account)Category)Transactionc                     t        ddd      }t        j                  j                  |       t        j                  j	                          |S )NChasecheckingTnametype	is_activer   _dbsessionaddcommitr   as     I/var/www/html/financials/tests/test_blueprints/test_transaction_export.pyacctr      s5    W:>AKKOOAKKH    c                     t        ddd      }t        j                  j                  |       t        j                  j	                          |S )NSavingssavingsTr   r   r   s     r   acct2r      s5    YY$?AKKOOAKKHr   c                     t        ddd      }t        j                  j                  |       t        j                  j	                          |S )N	GroceriesT)r   	is_systemr   )r   r   r   r   r   )r   cs     r   catr!   "   s5    kTTBAKKOOAKKHr   c           
          t        |||t        |      | j                  |r|j                  nd |d      }t        j                  j                  |       |S )NT)datemerchant_normalizedmerchant_rawamount
account_idcategory_idnotes	is_manual)r   r   idr   r   r   )r   r#   merchantr&   r!   r)   ts          r   	_make_txnr.   *   sK    $v77!CFFt		A KKOOAHr   c                     t        |ddd|      }t        |ddd|      }t        |dd	d
      }t        j                  j                          |||fS )Nz
2026-05-01Amazonz10.00)r#   r,   r&   r!   
2026-05-10Whole Foodsz55.00z
2026-05-20Targetz30.00r#   r,   r&   )r.   r   r   r   )r   r   r!   t1t2t3s         r   
three_txnsr8   :   sT    	4lXgSV	WB	4l]7X[	\B	4lXg	NBKKr2:r   c                     | j                  d      }t        j                  t        j                  |            }t        |      S )Nutf-8)decodecsv
DictReaderioStringIOlist)response_datatextreaders      r   
_parse_csvrD   C   s3    (D^^BKK-.F<r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestExportBasicsc                    |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 )	N/transactions/export.csv   ==)z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponse)py0py2py5assert %(py7)spy7)
getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)	selfclientr   rL   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s	            r   test_returns_200z!TestExportBasics.test_returns_200L   s    ::89##*s*#s****#s******x***x***#***s*******r   c                    |j                  d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )	NrH   ztext/csvin)z4%(py1)s in %(py5)s
{%(py5)s = %(py3)s.content_type
}rL   py1py3rO   rP   rQ   )
rR   content_typerT   rU   rY   rV   rW   rX   rZ   r[   )	r\   r]   r   rL   @py_assert0r_   @py_assert2ra   rb   s	            r   test_content_type_is_csvz)TestExportBasics.test_content_type_is_csvP   s    ::892X222z22222z2222z222222X222X22222222222r   c                    |j                  d      }|j                  j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )NrH   zContent-Disposition 
attachmentre   z%(py1)s in %(py3)scdrh   ri   assert %(py5)srO   ztransactions.csv)
rR   headersrT   rU   rY   rV   rW   rX   rZ   r[   )	r\   r]   r   rL   rr   rk   rl   @py_format4ra   s	            r   #test_content_disposition_attachmentz4TestExportBasics.test_content_disposition_attachmentT   s    ::89!!"7<!|r!!!!|r!!!|!!!!!!r!!!r!!!!!!!!'!R''''!R'''!''''''R'''R'''''''r   c                    |j                  d      }|j                  j                  d      }d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d
}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )NrH   r:   Datere   rq   rB   rs   rt   rO   MerchantAmountr   r   Notes)rR   datar;   rT   rU   rY   rV   rW   rX   rZ   r[   )	r\   r]   r   rL   rB   rk   rl   rv   ra   s	            r   test_has_header_rowz$TestExportBasics.test_has_header_rowZ   s9   ::89}}##G,v~vv!zT!!!!zT!!!z!!!!!!T!!!T!!!!!!!x4x4x44!zT!!!!zT!!!z!!!!!!T!!!T!!!!!!! yD    yD   y      D   D       w$w$w$$r   c                    |j                  d      }t        |j                        }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 )NrH   rJ   z%(py0)s == %(py3)srowsrM   ri   rt   rO   rR   rD   r}   rT   rU   rV   rW   rX   rY   rZ   r[   )	r\   r]   r   rL   r   rl   r^   rv   ra   s	            r   "test_empty_db_returns_headers_onlyz3TestExportBasics.test_empty_db_returns_headers_onlyd   sw    ::89(--(trztrttrr   N)__name__
__module____qualname__rc   rm   rw   r~   r    r   r   rF   rF   K   s    +3(r   rF   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestExportContentc                 \   |j                  d      }t        |j                        }|D cg c]  }|d   	 }}d}||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	d
}||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	d}||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	y c c}w )NrH   rz   r0   re   rq   	merchantsrs   rt   rO   r2   r3   rR   rD   r}   rT   rU   rY   rV   rW   rX   rZ   r[   r\   r]   r   r8   rL   r   rr   rk   rl   rv   ra   s               r   "test_rows_contain_all_transactionsz4TestExportContent.test_rows_contain_all_transactionsm   sF   ::89(--(,01qQz]1	1$x9$$$$x9$$$x$$$$$$9$$$9$$$$$$$)}	))))}	)))}))))))	)))	)))))))$x9$$$$x9$$$x$$$$$$9$$$9$$$$$$$ 2   H)c                    t        |ddd|d       t        j                  j                          |j	                  d      }t        |j                        }t        d |D              }|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y )Nz
2026-05-15Costcoz99.50zbulk run)r#   r,   r&   r!   r)   rH   c              3   2   K   | ]  }|d    dk(  s|  yw)rz   r   Nr   .0r   s     r   	<genexpr>z<TestExportContent.test_row_fields_correct.<locals>.<genexpr>{   s     @a
mx&?1@   ry   rJ   z%(py1)s == %(py4)srh   py4assert %(py6)spy6r{   r   r   r   r	   r|   r.   r   r   r   rR   rD   r}   nextrT   rU   rY   rZ   r[   r\   r]   r   r   r!   rL   r   rowrk   r`   rl   @py_format5@py_format7s                r   test_row_fields_correctz)TestExportContent.test_row_fields_correctu   s   $\HW	-::89(--(@d@@6{*l*{l****{l***{***l*******8}''}''''}'''}'''''''''':-+-+----+------+-------9~((~((((~(((~((((((((((7|)z)|z))))|z)))|)))z)))))))r   c                    t        |d       t        j                  j                          |j	                  d      }t        |j                        }t        d |D              }|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      d	z  }
d
d|
iz  }t        t        j                  |            d x}x}	}y )NGas Station)r,   rH   c              3   2   K   | ]  }|d    dk(  s|  yw)rz   r   Nr   r   s     r   r   zJTestExportContent.test_missing_category_is_empty_string.<locals>.<genexpr>   s     Ea
m}&D1Er   r   ro   rJ   r   r   r   r   r   )r\   r]   r   r   rL   r   r   rk   r`   rl   r   r   s               r   %test_missing_category_is_empty_stringz7TestExportContent.test_missing_category_is_empty_string   s    $/::89(--(EdEE:$"$"$$$$"$$$$$$"$$$$$$$r   c                    t        |d|       t        j                  j                          |j	                  d      }t        |j                        }t        d |D              }|d   }d}	||	k(  }
|
slt        j                  d|
fd||	f      t        j                  |      t        j                  |	      d	z  }d
d|iz  }t        t        j                  |            d x}x}
}	y )NPharmacy)r,   r!   rH   c              3   2   K   | ]  }|d    dk(  s|  yw)rz   r   Nr   r   s     r   r   zGTestExportContent.test_missing_notes_is_empty_string.<locals>.<genexpr>   s     Ba
mz&A1Br   r|   ro   rJ   r   r   r   r   r   r   s                r   "test_missing_notes_is_empty_stringz4TestExportContent.test_missing_notes_is_empty_string   s    $5::89(--(BdBB7|!r!|r!!!!|r!!!|!!!r!!!!!!!r   c                 &   |j                  d      }t        |j                        }|D cg c]  }|d   	 }}d}t        ||      }	||	k(  }
|
s7t	        j
                  d|
fd||	f      dt        j                         v st	        j                  |      rt	        j                  |      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                  |	      d	z  }d
d|iz  }t        t	        j                  |            d x}
x}}	y c c}w )NrH   ry   T)reverserJ   )zA%(py0)s == %(py7)s
{%(py7)s = %(py2)s(%(py3)s, reverse=%(py5)s)
}datessorted)rM   rN   ri   rO   rQ   zassert %(py9)spy9rR   rD   r}   r   rT   rU   rV   rW   rX   rY   rZ   r[   )r\   r]   r   r8   rL   r   r   r   r_   @py_assert6r^   rb   @py_format10s                r   test_default_sort_date_descz-TestExportContent.test_default_sort_date_desc   s    ::89(--($()q6)).23ud33u33333u3333333u333u333333333333333u333u333d33333333333 *s   FN)r   r   r   r   r   r   r   r   r   r   r   r   r   l   s    %*%"4r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestExportFiltersc                    |j                  d      }t        |j                        }|D cg c]  }|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 c c}w )
Nz /transactions/export.csv?q=wholerz   r2   rJ   r   r   r   rt   rO   r   )r\   r]   r   r8   rL   r   r   r   rl   r^   rv   ra   s               r   test_search_filter_appliedz,TestExportFilters.test_search_filter_applied   s    ::@A(--(,01qQz]1	1*O+yO++++yO++++++y+++y+++O+++++++ 2s   C!c                 v   |j                  d|j                         }t        |j                        }|D cg c]  }|d   	 }}d}	|	|v }
|
st	        j
                  d|
fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd	|iz  }t        t	        j                  |            d x}	}
d
}	|	|v }
|
st	        j
                  d|
fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd	|iz  }t        t	        j                  |            d x}	}
d}	|	|v}
|
st	        j
                  d|
fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd	|iz  }t        t	        j                  |            d x}	}
y c c}w )Nz%/transactions/export.csv?category_id=rz   r0   re   rq   r   rs   rt   rO   r2   r3   not inz%(py1)s not in %(py3)s)rR   r+   rD   r}   rT   rU   rY   rV   rW   rX   rZ   r[   )r\   r]   r   r8   r!   rL   r   r   r   rk   rl   rv   ra   s                r   test_category_filter_appliedz.TestExportFilters.test_category_filter_applied   sQ   :: EcffXNO(--(,01qQz]1	1$x9$$$$x9$$$x$$$$$$9$$$9$$$$$$$)}	))))}	)))}))))))	)))	)))))))(xy((((xy(((x((((((y(((y((((((( 2s   H6c                 v   |j                  d      }t        |j                        }t        |      }d}||k(  }|st	        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                  |      dz  }	dd	|	iz  }
t        t	        j                  |
            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            d x}x}}y )Nz@/transactions/export.csv?date_from=2026-05-10&date_to=2026-05-10   rJ   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   rM   rh   ri   r   assert %(py8)spy8r   rz   r2   r   r   r   r   )rR   rD   r}   r   rT   rU   rV   rW   rX   rY   rZ   r[   )r\   r]   r   r8   rL   r   rl   @py_assert5r_   r   @py_format9rk   r`   r   s                 r   test_date_range_filter_appliedz0TestExportFilters.test_date_range_filter_applied   s    ::`a(--(4yAyA~yAss44yAAwz"3m3"m3333"m333"333m3333333r   c                 \   |j                  d      }t        |j                        }|D cg c]  }|d   	 }}d}||v}	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	d
}||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	d}||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd	|
iz  }t        t        j                  |            d x}}	y c c}w )Nz&/transactions/export.csv?amount_min=30rz   r0   r   r   r   rs   rt   rO   r2   re   rq   r3   r   r   s               r   test_amount_min_filter_appliedz0TestExportFilters.test_amount_min_filter_applied   sF   ::FG(--(,01qQz]1	1(xy((((xy(((x((((((y(((y((((((()}	))))}	)))}))))))	)))	)))))))$x9$$$$x9$$$x$$$$$$9$$$9$$$$$$$ 2r   c                    |j                  d      }t        |j                        }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 )Nz%/transactions/export.csv?q=zzznomatchrJ   r   r   r   rt   rO   r   )
r\   r]   r   r8   rL   r   rl   r^   rv   ra   s
             r   "test_no_match_returns_headers_onlyz4TestExportFilters.test_no_match_returns_headers_only   sw    ::EF(--(trztrttrr   c                    t        d      D ]  }t        |d|dz  dz   dd|dd	       ! t        j                  j	                          |j                  d
      }t        |j                        }t        |      }d}||k(  }	|	st        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                  |      dz  }
dd|
iz  }t        t        j                   |            d x}x}	}y )N7   z2026-01-   r   02dz	Merchant 03dz1.00r4   rH   rJ   r   r   r   r   r   r   )ranger.   r   r   r   rR   rD   r}   r   rT   rU   rV   rW   rX   rY   rZ   r[   )r\   r]   r   r   irL   r   rl   r   r_   r   r   s               r   'test_exports_all_rows_not_just_one_pagez9TestExportFilters.test_exports_all_rows_not_just_one_page   s    r 	CAd8AFQJs+;!<!*1S'26C	C 	::89(--(4yByByBss44yBr   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r      s     ,)4%
r   r   c                       e Zd Zd Zd Zy)TestExportSortc                    |j                  d      }t        |j                        }|D cg c]  }t        |d          }}t	        |      }||k(  }	|	s#t        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      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                  |      dz  }
dd	|
iz  }t        t        j                  |            d x}	}y c c}w )
Nz,/transactions/export.csv?sort=amount&dir=ascr{   rJ   z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}amountsr   rM   rN   ri   rO   rP   rQ   )rR   rD   r}   floatr   rT   rU   rV   rW   rX   rY   rZ   r[   )r\   r]   r   r8   rL   r   r   r   r_   r^   ra   rb   s               r   test_sort_amount_ascz#TestExportSort.test_sort_amount_asc   s    ::LM(--(/34!58%44 /)w/))))w/))))))w)))w))))))&)))&))))))))))))/))))))) 5s   E=c                    |j                  d      }t        |j                        }|D cg c]  }|d   	 }}t        |      }||k(  }	|	s#t	        j
                  d|	fd||f      dt        j                         v st	        j                  |      rt	        j                  |      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                  |      dz  }
dd	|
iz  }t        t	        j                  |            d x}	}y c c}w )
Nz./transactions/export.csv?sort=merchant&dir=ascrz   rJ   r   r   r   r   rP   rQ   r   )r\   r]   r   r8   rL   r   r   r   r_   r^   ra   rb   s               r   test_sort_merchant_ascz%TestExportSort.test_sort_merchant_asc   s    ::NO(--(,01qQz]1	1"9--y-----y-------y---y------F---F------9---9----------- 2s   E4N)r   r   r   r   r   r   r   r   r   r      s    *.r   r   c                       e Zd Zd Zd Zy)TestExportLinkc                    |j                  d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )	Nz/transactions/
   export.csvre   z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}rL   rg   rP   rQ   
rR   r}   rT   rU   rY   rV   rW   rX   rZ   r[   
r\   r]   r   r8   rL   rk   r_   rl   ra   rb   s
             r   test_list_page_has_export_linkz-TestExportLink.test_list_page_has_export_link   s~    ::./--}----}---}-------------------r   c                 B   |j                  d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}d	}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )
Nz/transactions/?q=Amazonr   re   r   rL   rg   rP   rQ   s   q=Amazonr   r   s
             r   (test_export_link_preserves_search_filterz7TestExportLink.test_export_link_preserves_search_filter   s    ::78--}----}---}-------------------+hmm+{m++++{m+++{++++++h+++h+++m+++++++r   N)r   r   r   r   r   r   r   r   r   r      s    .,r   r   )r1   ALDIz25.00NN)!__doc__builtinsrV   _pytest.assertion.rewrite	assertionrewriterT   r<   r>   decimalr   pytestapp.extensionsr   r   app.models.accountr   app.models.categoryr   app.models.transactionr   fixturer   r   r!   r.   r8   rD   rF   r   r   r   r   r   r   r   <module>r      s     
 	   $ & ( .
       @G"    B*4 *4^) )\. . , ,r   