
    g4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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 dd	lmZ dd
lmZ d ZddZddZd Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$y)u+   PDF Statement Import — Stories 9.1–9.6.    N)Decimal)date)db)ImportBatch)Account)Category)MerchantMapping)Transactionc                      t        ddd      } t        j                  j                  |        t        j                  j	                          | S )NCheckingcheckingT)nametype	is_active)r   _dbsessionaddcommit)accts    A/var/www/html/financials/tests/test_blueprints/test_import_pdf.py_make_accountr      s5    
tDDKKOODKKK    c                     t        | dd      }t        j                  j                  |       t        j                  j	                          |S )NT)r   	is_systemr   )r   r   r   r   r   )r   cats     r   _make_categoryr      s5    

=CKKOOCKKJr   c                     t        | ||      }t        j                  j                  |       t        j                  j	                          |S )N)filenameissuerstatusr   r   r   r   r   )r   r   r    batchs       r   _make_batchr#   !   s5    &HEKKOOEKKLr   c                      t        ddddd      } t        j                  j                  |        t        j                  j	                          | S )Nzold.pdfchase	committed      )r   r   r    	row_countduplicates_skippedr!   )r"   s    r   _make_committed_batchr+   (   s<    7;"#;EKKOOEKKLr   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestUploadPagec           	      D   |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                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}x}}y )	N/import/   ==zk%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}.status_code
} == %(py11)sclientpy0py2py4py6py8py11assert %(py13)spy13
getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfr4   r   @py_assert1@py_assert3@py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14s              r   test_upload_returns_200z&TestUploadPage.test_upload_returns_2003   s    zz8*8z*%8%118S81S88881S888888v888v888z888*888%8881888S88888888r   c                    |j                  d      }dD ]  }|j                  }||v }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      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 )
Nr/   )   Chase   Bank of Americas   Discoverin)z,%(py0)s in %(py4)s
{%(py4)s = %(py2)s.data
}r   response)r6   r7   r8   assert %(py6)sr9   )
r?   datarA   rB   rC   rD   rE   rF   rG   rH   )	rJ   r4   r   rY   r   rL   rK   @py_format5@py_format7s	            r   #test_upload_shows_supported_issuersz2TestUploadPage.test_upload_shows_supported_issuers6   s    ::j)A 	+F%]]*6]****6]******6***6******X***X***]*******	+r   c                    |j                  d      }g }d}|j                  }||v }|}|s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  }|j                  |       |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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}	x}}
y )Nr/   s   pdf_files   PDFrW   )z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}rY   )py3py5py7z%(py9)spy9)z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
})py12py14py16z%(py18)spy18r(   zassert %(py21)spy21)r?   r[   rA   rB   rF   rC   rD   rE   append_format_booloprG   rH   )rJ   r4   r   rY   rK   @py_assert2@py_assert6@py_assert4@py_assert0@py_assert11@py_assert15@py_assert13@py_format8@py_format10@py_format17@py_format19@py_format20@py_format22s                     r   test_upload_form_has_file_fieldz.TestUploadPage.test_upload_form_has_file_field;   s    ::j)F{FhmmF{m+FvFFv/FFFFF{mFFF{FFFFFFhFFFhFFFmFFFFFFFvFFFvFFFFFFFFFFFFFFFFFFFFFFFFFFr   c                 2   |j                  d      }d}|j                  }|j                  } |       }||v }|st        j                  d|fd||f      t        j
                  |      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}x}}y )	Nr/   s   issuerrW   z^%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.data
}.lower
}()
}rY   py1r`   ra   rb   rc   assert %(py11)sr;   r?   r[   lowerrA   rB   rF   rC   rD   rE   rG   rH   rJ   r4   r   rY   rn   rm   rl   @py_assert8rk   rs   rQ   s              r   $test_upload_form_has_issuer_overridez3TestUploadPage.test_upload_form_has_issuer_override?       ::j)1HMM1M//1/11y11111y1111y111111H111H111M111/111111111111r   c                    |j                  di       }|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[   r0   r1   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)srY   r6   r7   ra   assert %(py7)srb   )
postr@   rA   rB   rC   rD   rE   rF   rG   rH   )	rJ   r4   r   rY   rK   rm   rL   @py_format6rr   s	            r   test_upload_no_file_rerendersz,TestUploadPage.test_upload_no_file_rerendersC   s    ;;z;3##*s*#s****#s******x***x***#***s*******r   c                 2   |j                  d      }d}|j                  }|j                  } |       }||v }|st        j                  d|fd||f      t        j
                  |      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}x}}y )	Nr/   s   importrW   rz   rY   r{   r}   r;   r~   r   s              r   test_active_page_is_importz)TestUploadPage.test_active_page_is_importG   r   r   N)	__name__
__module____qualname__rS   r^   rx   r   r   r    r   r   r-   r-   2   s!    9+
G2+2r   r-   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestIssuerDetectorc                    ddl m}  |d      \  }}d}||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}}d}||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 )Nr   detect_issuerz.JPMorgan Chase Bank statement for your accountr%   r1   z%(py0)s == %(py3)sr   r6   r`   assert %(py5)sra   ?>=z%(py0)s >= %(py3)sconf
!app.services.pdf_parsers.detectorr   rA   rB   rC   rD   rE   rF   rG   rH   rJ   r   r   r   rk   rK   @py_format4r   s           r   test_detect_chase_from_textz.TestIssuerDetector.test_detect_chase_from_textO   s    C$%UV  v    v      v   v          ts{tsttsr   c                    ddl m}  |d      \  }}d}||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}}d}||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 )Nr   r   z%Bank of America credit card statementbofar1   r   r   r   r   ra   r   r   r   r   r   r   s           r   test_detect_bofa_from_textz-TestIssuerDetector.test_detect_bofa_from_textU   s    C$%LMvvvvts{tsttsr   c                    ddl m}  |d      \  }}d}||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}}d}||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 )Nr   r   zDISCOVER CARD account statementdiscoverr1   r   r   r   r   ra   r   r   r   r   r   r   s           r   test_detect_discover_from_textz1TestIssuerDetector.test_detect_discover_from_text[   s    C$%FG##v####v######v###v##########ts{tsttsr   c                    ddl m}  |d      \  }}d}||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}}d}||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 )Nr   r   z'Apple Card issued by Goldman Sachs Bank
apple_cardr1   r   r   r   r   ra   g?r   r   r   r   r   s           r    test_detect_apple_card_from_textz3TestIssuerDetector.test_detect_apple_card_from_texta   s    C$%NO%%v%%%%v%%%%%%v%%%v%%%%%%%%%%ts{tsttsr   c                    ddl m}  |d      \  }}d }||u }|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}}d
}||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 )Nr   r   z,This is some random text with no issuer infoisz%(py0)s is %(py3)sr   r   r   ra   g        r1   r   r   r   r   s           r   test_unknown_text_returns_nonez1TestIssuerDetector.test_unknown_text_returns_noneg   s    C$%STv~vvvts{tsttsr   c                 p   ddl m}  |d      \  }}d }||u }|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 )
Nr   r    r   r   r   r   r   ra   r   r   s           r   test_empty_text_returns_nonez/TestIssuerDetector.test_empty_text_returns_nonem   sk    C$R(v~vvvr   c                    ddl m} d} ||      }d}||u }|st        j                  d|fd||f      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 )Nr   needs_confirmationg?Tr   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   r6   r7   r8   rb   assert %(py9)src   
r   r   rA   rB   rC   rD   rE   rF   rG   rH   rJ   r   rK   rL   rl   rM   rr   rs   s           r   'test_needs_confirmation_below_thresholdz:TestIssuerDetector.test_needs_confirmation_below_thresholdr   s    H"&/!$'/4/'4////'4//////!///!///$///'///4///////r   c                    ddl m} d} ||      }d}||u }|st        j                  d|fd||f      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 )Nr   r   g      ?Fr   r   r   r   r   rc   r   r   s           r   $test_no_confirmation_above_thresholdz7TestIssuerDetector.test_no_confirmation_above_thresholdv   s    H"&0!$'050'50000'5000000!000!000$000'00050000000r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   N   s*    
01r   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestMerchantNormalizerc                    ddl m} d} ||      }d}||k(  }|st        j                  d|fd||f      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 )Nr   	normalizezAMZN*MARKETPLACE 04/22Amazonr1   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   r   rc   
 app.services.merchant_normalizerr   rA   rB   rC   rD   rE   rF   rG   rH   rJ   r   rK   rL   rl   rM   rr   rs   s           r   test_normalizes_amazonz-TestMerchantNormalizer.test_normalizes_amazon~   s    >1>y12>h>2h>>>>2h>>>>>>y>>>y>>>1>>>2>>>h>>>>>>>r   c                    ddl m} d} ||      }d}||k(  }|st        j                  d|fd||f      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 )Nr   r   zNETFLIX.COMNetflixr1   r   r   r   r   rc   r   r   s           r   test_normalizes_netflixz.TestMerchantNormalizer.test_normalizes_netflix   s    >&4y'494'94444'9444444y444y444444'44494444444r   c                    ddl m} d} ||      }d}||k(  }|st        j                  d|fd||f      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 )Nr   r   zSTARBUCKS #12345 SEATTLE WA	Starbucksr1   r   r   r   r   rc   r   r   s           r   test_normalizes_starbucksz0TestMerchantNormalizer.test_normalizes_starbucks   s    >6Fy67F;F7;FFFF7;FFFFFFyFFFyFFF6FFF7FFF;FFFFFFFr   c                 j   ddl m}  |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}}y )Nr   r   zSOME MERCHANT 04/22z04/22)not in)z%(py1)s not in %(py3)sresult)r|   r`   r   ra   )
r   r   rA   rB   rF   rC   rD   rE   rG   rH   )rJ   r   r   rn   rk   r   r   s          r   test_strips_trailing_datez0TestMerchantNormalizer.test_strips_trailing_date   si    >01$wf$$$$wf$$$w$$$$$$f$$$f$$$$$$$r   c                     ddl m}  |d      }|sedddt        j                         v st	        j
                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y )Nr   r   zCOFFEE SHOP SEATTLE WAzassert %(py0)sr6   r   )	r   r   rC   rD   rA   rE   rF   rG   rH   )rJ   r   r   @py_format1s       r   test_strips_trailing_state_codez6TestMerchantNormalizer.test_strips_trailing_state_code   s3    >34vvvr   c                    ddl m} d} ||      }d}||k(  }|st        j                  d|fd||f      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 )
Nr   r   r   r1   r   r   r   r   rc   r   r   s           r   test_handles_empty_stringz0TestMerchantNormalizer.test_handles_empty_string   s    >"y}""}""""}""""""y"""y""""""}""""""""""r   c                 z   ddl m} dddg} |d|      }d}||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 )Nr   apply_user_mappingszMY STOREzMy Storeraw_pattern
normalizedMY STORE 123r1   r   r   r   r   ra   
r   r   rA   rB   rC   rD   rE   rF   rG   rH   rJ   r   mappingsr   rk   rK   r   r   s           r   test_user_mapping_overridez1TestMerchantNormalizer.test_user_mapping_override   sw    H$.jIJ$^X>##v####v######v###v##########r   c                 x   ddl m} dddg} |d|      }d }||u }|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 )Nr   r   zOTHER STOREOtherr   r   r   r   r   r   r   ra   r   r   s           r   'test_user_mapping_no_match_returns_nonez>TestMerchantNormalizer.test_user_mapping_no_match_returns_none   sv    H$1IJ$^X>v~vvvr   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   }   s+    ?5G%
#$r   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestReviewPagec           	      r   t               }|j                  }d|j                   } ||      }|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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}x}x}	}y )	N/import/review/r0   r1   r3   r4   r5   r<   r=   )r#   r?   idr@   rA   rB   rC   rD   rE   rF   rG   rH   )rJ   r4   r   r"   rK   rL   rM   rN   rO   rP   rQ   rR   s               r   test_review_returns_200z&TestReviewPage.test_review_returns_200   s    zzJOEHH:6Jz67J7CCJsJCsJJJJCsJJJJJJvJJJvJJJzJJJ6JJJ7JJJCJJJsJJJJJJJJr   c           	      D   |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                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}x}}y )	Nz/import/review/9999i  r1   r3   r4   r5   r<   r=   r>   rI   s              r   #test_review_nonexistent_returns_404z2TestReviewPage.test_review_nonexistent_returns_404   s    zzC/Cz/0C0<<CC<CCCC<CCCCCCvCCCvCCCzCCC/CCC0CCC<CCCCCCCCCCCr   c                    t               }|j                  d|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}}d}
|j                  d   }|
|v }|slt	        j
                  d|fd|
|f      t	        j                  |
      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}
x}}y )Nr   Ffollow_redirects.  r1   r   rY   r   r   rb   historyLocationrW   z%(py1)s in %(py4)sr|   r8   rZ   r9   )r+   r?   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   headersrJ   r4   r   r"   rY   rK   rm   rL   r   rr   rn   rk   r\   r]   s                 r   %test_review_redirects_committed_batchz4TestReviewPage.test_review_redirects_committed_batch   s    %'::z:U:S##*s*#s****#s******x***x***#***s*******8H,,Z88y88888y8888y88888888888r   c                    t        d      }|j                  d|j                         }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 )Nr%   r   r   rU   rW   z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}rY   r|   r`   ra   r   rb   r#   r?   r   r[   rA   rB   rF   rC   rD   rE   rG   rH   
rJ   r4   r   r"   rY   rn   rm   rk   r   rr   s
             r   test_review_shows_batch_issuerz-TestReviewPage.test_review_shows_batch_issuer   s    7+::z:;(8==(x=((((x=(((x((((((8(((8(((=(((((((r   c                    t        d      }|j                  d|j                         }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 )Nmy_statement.pdfr   r      my_statement.pdfrW   r   rY   r   r   rb   r   r   s
             r   test_review_shows_filenamez)TestReviewPage.test_review_shows_filename   s    %78::z:;"3hmm3"m3333"m333"333333h333h333m3333333r   c                    t                t               }|j                  d|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}}d}
|j                  d   }|
|v }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}
x}}y )N/import/commit/Fr   r   r1   r   rY   r   r   rb   r   r   rW   r   r   rZ   r9   )r   r#   r   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   r   r   s                 r    test_commit_redirects_to_historyz/TestReviewPage.test_commit_redirects_to_history   s    ;;
;e;T##*s*#s****#s******x***x***#***s*******8H,,Z88y88888y8888y88888888888r   c                 6   t                t               }|j                  d|j                          t        j
                  j                  |       |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&   r1   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr"   r   r   rb   )r   r#   r   r   r   r   refreshr    rA   rB   rC   rD   rE   rF   rG   rH   )	rJ   r4   r   r"   rK   rm   rL   r   rr   s	            r    test_commit_updates_batch_statusz/TestReviewPage.test_commit_updates_batch_status   s    oehhZ01E"||*{*|{****|{******u***u***|***{*******r   c                    t                t               }|j                  d|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 )Nr  Tr   r0   r1   r   rY   r   r   rb   )r   r+   r   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   )
rJ   r4   r   r"   rY   rK   rm   rL   r   rr   s
             r   'test_commit_already_committed_redirectsz6TestReviewPage.test_commit_already_committed_redirects   s    %';;
;d;S##*s*#s****#s******x***x***#***s*******r   N)r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   r      s,    KD9)
4
9++r   r   c                       e Zd Zd Zd Zy)TestAutoCategorizationc                    t               }t               }ddlm} |j                  j                         5   |d|j                         d d d        t        j                  j                  dd      j                         }d }||u}|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}}|j&                  }|j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      nd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 # 1 sw Y   xY w)Nr   _save_merchant_mappingr   Tr   user_confirmed)is not)z%(py0)s is not %(py3)smappingr   r   ra   r1   zK%(py2)s
{%(py2)s = %(py0)s.category_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}r   r6   r7   r8   r9   assert %(py8)sr:   )r#   r    app.blueprints.import_pdf.routesr  applicationapp_contextr   r	   query	filter_byfirstrA   rB   rC   rD   rE   rF   rG   rH   category_id)rJ   r4   r   r"   r   r  r  rk   rK   r   r   rM   rL   r]   @py_format9s                  r   !test_user_mapping_saved_on_updatez8TestAutoCategorization.test_user_mapping_saved_on_update   sa    	L++- 	8";7	8 "''11[Y]1^ddf""wd""""wd""""""w"""w"""d""""""""",cff,"f,,,,"f,,,,,,w,,,w,,,",,,,,,c,,,c,,,f,,,,,,,	8 	8s   H99Ic                 v   t        d      }t        d      }|j                  j                         5  ddlm}  |d|j
                          |d|j
                         d d d        t        j                  }|j                  }d}d}	 |||	      }
|
j                  } |       }d}||k(  }|s-t        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  }t!        t        j"                  |            d x}x}x}x}	x}
x}x}x}}t        j                  j                  d      j%                         }|j&                  }|j
                  }||k(  }|st        j                  d	|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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 # 1 sw Y   xY w)NCoffeeDiningr   r  r   Tr  r(   r1   )z%(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.filter_by
}(normalized=%(py6)s, user_confirmed=%(py8)s)
}.count
}()
} == %(py17)sr	   )	r6   r7   r8   r9   r:   py10rd   re   py17zassert %(py19)spy19)r   r  r  cat2r  r  r:   )r   r  r  r  r  r   r	   r  r  countrA   rB   rC   rD   rE   rF   rG   rH   r  r   )rJ   r4   r   cat1r)  r  rK   rL   rM   rN   rP   ro   rq   @py_assert16rp   @py_format18rv   r  r]   r!  s                       r   "test_user_mapping_updates_existingz9TestAutoCategorization.test_user_mapping_updates_existing   s   h'h'++- 	9O";8";8	9
 $$ 	$.. 	"	37	."4
 	 

%	   		  	 		 	 		 	   	 	Y  	 	Y % 	 	Y / 	 	Y #	 	Y 48	 	Y
 	 	Y 	 	Y 	 	YQ	 	 	 		 	 	 	 "''11[1IOOQ""-dgg-"g----"g------w---w---"------d---d---g-------	9 	9s   -L..L8N)r   r   r   r"  r.  r   r   r   r  r     s    -.r   r  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestImportHistoryc           	      D   |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                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}x}}y )	N/import/historyr0   r1   r3   r4   r5   r<   r=   r>   rI   s              r   test_history_returns_200z*TestImportHistory.test_history_returns_200   s    zz?+?z+,?,88?C?8C????8C??????v???v???z???+???,???8???C????????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 )	Nr2  s   No imports yetrW   r   rY   r   r   rb   )
r?   r[   rA   rB   rF   rC   rD   rE   rG   rH   	rJ   r4   r   rY   rn   rm   rk   r   rr   s	            r   (test_history_shows_empty_state_when_nonez:TestImportHistory.test_history_shows_empty_state_when_none   s    ::/0 1HMM1 M1111 M111 111111H111H111M1111111r   c                    t        d       |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 )Nr  r  r2  r  rW   r   rY   r   r   rb   r#   r?   r[   rA   rB   rF   rC   rD   rE   rG   rH   r5  s	            r   !test_history_shows_batch_filenamez3TestImportHistory.test_history_shows_batch_filename   s    /0::/0"3hmm3"m3333"m333"333333h333h333m3333333r   c                    t                |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 )	Nr2  s	   CommittedrW   r   rY   r   r   rb   )r+   r?   r[   rA   rB   rF   rC   rD   rE   rG   rH   r5  s	            r   #test_history_shows_committed_statusz5TestImportHistory.test_history_shows_committed_status  s    ::/0,x}},|},,,,|},,,|,,,,,,x,,,x,,,},,,,,,,r   c                    t                |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 )	Nr2  s   PendingrW   r   rY   r   r   rb   r8  r5  s	            r   !test_history_shows_pending_statusz3TestImportHistory.test_history_shows_pending_status
  s    ::/0*X]]*z]****z]***z******X***X***]*******r   c                    t        d       |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 )Nr   r   r2  rV   rW   r   rY   r   r   rb   r8  r5  s	            r   test_history_shows_issuer_labelz1TestImportHistory.test_history_shows_issuer_label  s    6"::/0!2X]]2!]2222!]222!222222X222X222]2222222r   c                    t        dddt        j                  dddddg      	      }t        j                  j                  |       t        j                  j                          |j                  d
      }d}|j                  }|j                  } |       }||v }	|	st        j                  d|	fd||f      t        j                  |      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}x}}y )Nzerr.pdfr%   r&   r(   zbad linezNo matchz1.0)page_numberraw_textreasonparser_version)r   r   r    parse_errors_jsonr2  s   errorrW   rz   rY   r{   r}   r;   )r   jsondumpsr   r   r   r   r?   r[   r   rA   rB   rF   rC   rD   rE   rG   rH   )rJ   r4   r   r"   rY   rn   rm   rl   r   rk   rs   rQ   s               r   $test_history_shows_parse_error_countz6TestImportHistory.test_history_shows_parse_error_count  s    w{"jj !zZchi* 
 	::/008==0=..0.00x00000x0000x00000080008000=000.000000000000r   c                 `   t               }|j                  d      }d|j                   }|j                  } |       }|j                  }||v }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      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}x}x}	}y )	Nr2  r   rW   )z_%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.encode
}()
} in %(py9)s
{%(py9)s = %(py7)s.data
}rY   r{   r}   r;   )r#   r?   r   encoder[   rA   rB   rF   rC   rD   rE   rG   rH   )rJ   r4   r   r"   rY   rn   rk   rm   r   rl   rs   rQ   s               r   *test_history_shows_review_link_for_pendingz<TestImportHistory.test_history_shows_review_link_for_pending   s    ::/0 
+E+22E24EE4EEEE4EEE+EEE2EEE4EEEEEEEEEEEEEEEEEEEEr   N)r   r   r   r3  r6  r9  r;  r=  r?  rH  rK  r   r   r   r0  r0     s,    @24
-
+
3

1Fr   r0  )	Groceries)ztest.pdfr%   pending)%__doc__builtinsrC   _pytest.assertion.rewrite	assertionrewriterA   iorF  decimalr   datetimer   pytestapp.extensionsr   r   app.models.import_batchr   app.models.accountr   app.models.categoryr   app.models.merchant_mappingr	   app.models.transactionr
   r   r   r#   r+   r-   r   r   r   r  r0  r   r   r   <module>r]     s    1   	     $ / & ( 7 .
2 28*1 *1^& &V*+ *+^. .B+F +Fr   