
    /j~0                        d Z ddlZddlmc mZ ddlmZ ddl	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	Zd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/   Paydown Planner — Stories 6.1, 6.3, 6.4, 6.5.    N)Decimal)db)Account)Settings)PaydownPlan)PaydownPlanCardc                     t        | ddt        |      t        |      t        |      t        d            }t        j                  j	                  |       t        j                  j                          |S )NcreditT5000.00)nametype	is_activecurrent_balanceaprmin_paymentcredit_limit)r   r   _dbsessionaddcommit)r   balancer   min_paycards        >/var/www/html/financials/tests/test_blueprints/test_paydown.py
_make_cardr      sY    D(CLG$Y'D KKOODKKK    c                    t         j                  j                         }|6t        dt        |             }t        j
                  j                  |       nt        |       |_        t        j
                  j                          |S )N   )idextra_monthly_payment)	r   queryfirstr   r   r   r   r    r   )amountsettingss     r   
_set_extrar%      s[    ~~##%HqH!)0&KKOr   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestCreditCardCreatec           	      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/paydown/cards/create   ==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selfr.   r   @py_assert1@py_assert3@py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14s              r    test_get_create_form_returns_200z5TestCreditCardCreate.test_get_create_form_returns_200+   s    zzE1Ez12E2>>E#E>#EEEE>#EEEEEEvEEEvEEEzEEE1EEE2EEE>EEE#EEEEEEEEr   c           	         |j                  ddddddd       t        j                  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                  |      dz  }dd|iz  }t        t        j                  |            d x}}|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}	}|j                  }d}t        |      }||k(  }	|	s
t        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                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}}y )Nr)   zChase Freedomz1500.00z19.99z35.00r   r   r   r   r   r   datar   is notz%(py0)s is not %(py3)sr   r0   py3assert %(py5)spy5r
   r+   )z,%(py2)s
{%(py2)s = %(py0)s.type
} == %(py5)sr0   r1   rY   assert %(py7)spy7)zI%(py2)s
{%(py2)s = %(py0)s.apr
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   r0   r1   r2   r3   r4   assert %(py10)spy10)postr   r!   	filter_byr"   r;   r<   r=   r>   r?   r@   rA   rB   r   r   r   )rD   r.   r   r   @py_assert2rE   @py_format4@py_format6@py_assert4rF   @py_format8rG   rH   @py_format9@py_format11s                  r   test_valid_post_creates_cardz1TestCreditCardCreate.test_valid_post_creates_card.   s   +#("%3
 	 }}&&O&<BBDt4t4tt4yy$H$yH$$$$yH$$$$$$t$$$t$$$y$$$H$$$$$$$xx+7+77++x+++++x+++++++t+++t+++x++++++7+++7+++7+++++++++++r   c                    |j                  dddddd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)   z	Test Card500.0015.00r   r   r   r   FrQ   follow_redirects.  r+   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponserZ   r[   r\   
r`   r:   r;   r<   r=   r>   r?   r@   rA   rB   	rD   r.   r   rr   rE   re   rF   rd   rf   s	            r   test_valid_post_redirectsz.TestCreditCardCreate.test_valid_post_redirects;   s    ;;6'"	>

 "  # ##*s*#s****#s******x***x***#***s*******r   c                 B   |j                  dddddd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)   Discoverz800.00z22.0020.00rm   Trn   s   addedinz^%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.data
}.lower
}()
}rr   py1rW   rY   r\   py9assert %(py11)sr5   )r`   rQ   lowerr;   r<   r@   r=   r>   r?   rA   rB   rD   r.   r   rr   @py_assert0re   @py_assert6@py_assert8rb   @py_format10rK   s              r   test_valid_post_flashes_successz4TestCreditCardCreate.test_valid_post_flashes_successD   s    ;;6'"	>

 !  " 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                    |j                  dddddd       t        j                  }|j                  }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                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	y )Nr)   Badnot-a-numberrx   25.00rm   rP   r
   )r   r   r+   )z%(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.filter_by
}(type=%(py6)s)
}.count
}()
} == %(py15)sr   r0   r1   r2   r3   r4   r_   py12py15assert %(py17)spy17)r`   r   r!   ra   countr;   r<   r=   r>   r?   r@   rA   rB   rD   r.   r   rE   rF   rG   rH   rJ   @py_assert11@py_assert14@py_assert13@py_format16@py_format18s                r   test_invalid_balance_rejectedz2TestCreditCardCreate.test_invalid_balance_rejectedM   s   +-"	3
 	 }}B}&&BHB&H5B5;;B;=BB=BBBB=BBBBBBwBBBwBBB}BBB&BBBHBBB5BBB;BBB=BBBBBBBBBBBr   c           	      j   |j                  ddddddd       t        j                  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                  |      dz  }dd|iz  }t        t        j                  |            d x}}|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 )Nr)   zNo Limit Cardrk   z18.00rl    rO   rP   rR   rS   rU   r   rV   rX   rY   )is)z4%(py2)s
{%(py2)s = %(py0)s.credit_limit
} is %(py5)srZ   r[   r\   )r`   r   r!   ra   r"   r;   r<   r=   r>   r?   r@   rA   rB   r   )rD   r.   r   r   rb   rE   rc   rd   re   rF   rf   s              r   test_credit_limit_optionalz/TestCreditCardCreate.test_credit_limit_optionalV   s   +#'"3
 	 }}&&O&<BBDt4t4tt4  (D( D(((( D((((((t(((t((( (((D(((((((r   N)	__name__
__module____qualname__rM   ri   ru   r   r   r    r   r   r'   r'   *   s"    F,+1C
)r   r'   c                       e Zd Zd Zd Zd Zy)TestCreditCardEditc           	      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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd	|
iz  }t        t	        j                  |            d x}x}x}x}x}	}y )
N/paydown/cards//editr*   r+   r-   r.   r/   r6   r7   )r   r9   r   r:   r;   r<   r=   r>   r?   r@   rA   rB   )rD   r.   r   r   rE   rF   rG   rH   rI   rJ   rK   rL   s               r   test_get_edit_returns_200z,TestCreditCardEdit.test_get_edit_returns_200d   s    |zzNODGG9E:Nz:;N;GGN3NG3NNNNG3NNNNNNvNNNvNNNzNNN:NNN;NNNGNNN3NNNNNNNNr   c                    t               }|j                  d|j                   dddddd       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}}|j                  }d}	t!        |	      }
||
k(  }|s
t        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                  t               rt        j                  t               ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	}
y )Nr   r   zUpdated Cardz2000.00rl   z50.00rm   rP   r+   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sr   rZ   r[   r\   )zU%(py2)s
{%(py2)s = %(py0)s.current_balance
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   r]   r^   r_   )r   r`   r   r   r   refreshr   r;   r<   r=   r>   r?   r@   rA   rB   r   r   )rD   r.   r   r   rE   re   rF   rd   rf   rG   rH   rg   rh   s                r   test_edit_updates_cardz)TestCreditCardEdit.test_edit_updates_cardh   sa   |odggYe4"("	<
 	 	D!yy*N*yN****yN******t***t***y***N*******##9y9wy'99#'99999#'9999999t999t999#999999w999w999y999'99999999r   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/paydown/cards/9999/edit  r+   r-   r.   r/   r6   r7   r8   rC   s              r   !test_edit_nonexistent_returns_404z4TestCreditCardEdit.test_edit_nonexistent_returns_404t   s    zzH4Hz45H5AAHSHASHHHHASHHHHHHvHHHvHHHzHHH4HHH5HHHAHHHSHHHHHHHHr   N)r   r   r   r   r   r   r   r   r   r   r   c   s    O
:Ir   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestStrategyComparec                    t                |j                  d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/paydown/compareFro   rp   r+   rq   rr   rZ   r[   r\   extraLocationry   z%(py1)s in %(py4)sr}   r2   assert %(py6)sr3   )r   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   headersrD   r.   r   rr   rE   re   rF   rd   rf   r   rb   @py_format5@py_format7s                r   *test_redirects_to_extra_payment_if_not_setz>TestStrategyCompare.test_redirects_to_extra_payment_if_not_set{   s    ::05:I##*s*#s****#s******x***x***#***s*******6(**:66w66666w6666w66666666666r   c           
         t                t        dddt        d      t        d      t        d            }t        j                  j                  |       t        j                  j                          |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 )NzPaid Offr
   T02025)r   r   r   r   r   r   r   s   No outstanding   0ry   )z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}rr   )rW   rY   r\   z%(py9)sr~   )z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
})r   py14py16z%(py18)spy18r   zassert %(py21)spy21)r%   r   r   r   r   r   r   r9   rQ   r;   r<   r@   r=   r>   r?   append_format_booloprA   rB   )rD   r.   r   r   rr   rE   rb   r   re   r   r   @py_assert15r   rf   r   @py_format17@py_format19@py_format20@py_format22s                      r   #test_shows_empty_state_when_no_debtz7TestStrategyCompare.test_shows_empty_state_when_no_debt   sM   JX'.s|#*4=2 	::01J JHMMJ M1JTJX]]JT]5JJJJJ MJJJ JJJJJJHJJJHJJJMJJJJJJJT]JJJTJJJJJJXJJJXJJJ]JJJJJJJJJJJJJJr   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}}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   r*   r+   rq   rr   rZ   r[   r\   )	   Avalanches   Snowballs   Highest Balances   Proportionalry   )z,%(py0)s in %(py4)s
{%(py4)s = %(py2)s.data
}label)r0   r1   r2   r   r3   )r   r%   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rQ   )rD   r.   r   rr   rE   re   rF   rd   rf   r   r   r   s               r   test_shows_all_4_strategiesz/TestStrategyCompare.test_shows_all_4_strategies   s   ::01##*s*#s****#s******x***x***#***s*******U 	*E$MM)5M))))5M))))))5)))5))))))H)))H)))M)))))))	*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 )	Nr   r*   r+   rq   rr   rZ   r[   r\   r   r%   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rt   s	            r   test_shows_months_to_payoffz/TestStrategyCompare.test_shows_months_to_payoff   s    ::01##*s*#s****#s******x***x***#***s*******r   c           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	Nr   r*   r+   r-   r.   r/   r6   r7   r   rC   s              r   test_compare_returns_200z,TestStrategyCompare.test_compare_returns_200   s    zz@,@z,-@-99@S@9S@@@@9S@@@@@@v@@@v@@@z@@@,@@@-@@@9@@@S@@@@@@@@r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   z   s    7	K*+Ar   r   c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestStrategyDetailc           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	N/paydown/strategy/avalancher*   r+   r-   r.   r/   r6   r7   r   rC   s              r   !test_avalanche_detail_returns_200z4TestStrategyDetail.test_avalanche_detail_returns_200   s    zzK7Kz78K8DDKKDKKKKDKKKKKKvKKKvKKKzKKK7KKK8KKKDKKKKKKKKKKKr   c           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	Nz/paydown/strategy/snowballr*   r+   r-   r.   r/   r6   r7   r   rC   s              r    test_snowball_detail_returns_200z3TestStrategyDetail.test_snowball_detail_returns_200   s    zzJ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           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	Nz!/paydown/strategy/highest_balancer*   r+   r-   r.   r/   r6   r7   r   rC   s              r   'test_highest_balance_detail_returns_200z:TestStrategyDetail.test_highest_balance_detail_returns_200   s    zzQ=Qz=>Q>JJQcQJcQQQQJcQQQQQQvQQQvQQQzQQQ=QQQ>QQQJQQQcQQQQQQQQr   c           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	Nz/paydown/strategy/proportionalr*   r+   r-   r.   r/   r6   r7   r   rC   s              r   $test_proportional_detail_returns_200z7TestStrategyDetail.test_proportional_detail_returns_200   s    zzN:Nz:;N;GGN3NG3NNNNG3NNNNNNvNNNvNNNzNNN:NNN;NNNGNNN3NNNNNNNNr   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/paydown/strategy/nonexistentr   r+   r-   r.   r/   r6   r7   r8   rC   s              r   !test_invalid_strategy_returns_404z4TestStrategyDetail.test_invalid_strategy_returns_404       zzM9Mz9:M:FFM#MF#MMMMF#MMMMMMvMMMvMMMzMMM9MMM:MMMFMMM#MMMMMMMMr   c                 j   t                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}}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   s   Months to Payoffry   z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}rr   r}   rW   rY   r[   r\   s   Total Interestr   r%   r9   rQ   r;   r<   r@   r=   r>   r?   rA   rB   	rD   r.   r   rr   r   re   rb   rd   rf   s	            r   %test_detail_shows_months_and_interestz8TestStrategyDetail.test_detail_shows_months_and_interest   s    ::;<"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3 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                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 )	Nr   s   Activatery   r   rr   r   r[   r\   r   r   s	            r   !test_detail_shows_activate_buttonz4TestStrategyDetail.test_detail_shows_activate_button   s    ::;<+hmm+{m++++{m+++{++++++h+++h+++m+++++++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}}|j                         }	t        |	t              }|s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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }
t        t	        j                  |
            d }y )N/api/paydown/schedule/avalancher*   r+   rq   rr   rZ   r[   r\   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancerQ   list)r0   r}   r1   r2   )r   r%   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   get_jsonr   r   )rD   r.   r   rr   rE   re   rF   rd   rf   rQ   r   s              r   test_api_schedule_returns_jsonz1TestStrategyDetail.test_api_schedule_returns_json   s#   ::?@##*s*#s****#s******x***x***#***s*******  "$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%r   c                    t        d       t                |j                  d      }|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   }|
|v }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}
x}}d}
|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Visar   r   r+   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrQ   )r0   r}   rW   r3   zassert %(py8)sr4   account_namer   ry   r   r   r   r3   schedule)r   r%   r9   r   r   r;   r<   r=   r>   r?   r@   rA   rB   )rD   r.   r   rr   rQ   rb   rG   re   r   rg   r   rF   r   s                r   test_api_schedule_has_card_dataz2TestStrategyDetail.test_api_schedule_has_card_data   sS   6::?@  "4yAyA~yAss44yA(a(~((((~(((~(((((((((($T!W$zW$$$$zW$$$z$$$W$$$$$$$r   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/api/paydown/schedule/invalidr   r+   r-   r.   r/   r6   r7   r8   rC   s              r   %test_api_invalid_strategy_returns_404z8TestStrategyDetail.test_api_invalid_strategy_returns_404   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s:    L
K
R
O
N2,&%Nr   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestPlanActivationc                    t                t                |j                  d       t        j                  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                  |      dz  }dd	|iz  }t        t        j                  |            d x}}|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/paydown/activate/avalancheactivestatusrS   rU   planrV   rX   rY   	avalancher+   )z0%(py2)s
{%(py2)s = %(py0)s.strategy
} == %(py5)srZ   r[   r\   )r   r%   r`   r   r!   ra   r"   r;   r<   r=   r>   r?   r@   rA   rB   strategy)rD   r.   r   r   rb   rE   rc   rd   re   rF   rf   s              r   "test_activate_creates_paydown_planz5TestPlanActivation.test_activate_creates_paydown_plan   s   12  **(*;AACt4t4tt4}}++}++++}++++++t+++t+++}++++++++++r   c                    t                t                |j                  d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   Fr   rp   r+   rq   rr   rZ   r[   r\   monitorr   ry   r   r   r   r3   )r   r%   r`   r:   r;   r<   r=   r>   r?   r@   rA   rB   r   r   s                r   "test_activate_redirects_to_monitorz5TestPlanActivation.test_activate_redirects_to_monitor   s    ;;<u;U##*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                t                |j                  d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   Tr   s	   activatedry   r{   rr   r|   r   r5   )r   r%   r`   rQ   r   r;   r<   r@   r=   r>   r?   rA   rB   r   s              r   test_activate_flashes_successz0TestPlanActivation.test_activate_flashes_success   s    ;;<t;T4x}}4}224244|44444|4444|444444x444x444}4442444444444444r   c                    t                t                |j                  d       t        j                  }|j
                  }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                  |	      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	|j                  d       t        j                  }|j
                  }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                  |	      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	t        j                  }|j
                  }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                  |	      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	y )Nr   r   r   r   r+   z%(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.filter_by
}(status=%(py6)s)
}.count
}()
} == %(py15)sr   r   r   r   /paydown/activate/snowballarchivedr   r%   r`   r   r!   ra   r   r;   r<   r=   r>   r?   r@   rA   rB   r   s                r   test_activate_archives_old_planz2TestPlanActivation.test_activate_archives_old_plan   s   12  H **H(H*(;H;AAHACHqHCqHHHHCqHHHHHH{HHH{HHH HHH*HHH(HHH;HHHAHHHCHHHqHHHHHHHH01  H **H(H*(;H;AAHACHqHCqHHHHCqHHHHHH{HHH{HHH HHH*HHH(HHH;HHHAHHHCHHHqHHHHHHHH  J **J*J**=J=CCJCEJJEJJJJEJJJJJJ{JJJ{JJJ JJJ*JJJ*JJJ=JJJCJJJEJJJJJJJJJJJr   c                 l   t                t                |j                  d       |j                  d       |j                  d       t        j                  }|j
                  }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                  |	      d
z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	y )Nr   r  z/paydown/activate/proportionalr   r   r   r+   r
  r   r   r   r   r  r   s                r   #test_only_one_plan_active_at_a_timez6TestPlanActivation.test_only_one_plan_active_at_a_time   s   120145  H **H(H*(;H;AAHACHqHCqHHHHCqHHHHHH{HHH{HHH HHH*HHH(HHH;HHHAHHHCHHHqHHHHHHHHr   c                    t                t                |j                  d       t        j                  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                  |      dz  }dd	|iz  }t        t        j                  |            d x}}|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                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
y )Nr   r   r   rS   rU   r   rV   rX   rY   r   r+   )z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.cards
}.count
}()
} == %(py9)s)r0   r1   r2   r3   r~   r   r5   )r   r%   r`   r   r!   ra   r"   r;   r<   r=   r>   r?   r@   rA   rB   cardsr   )rD   r.   r   r   rb   rE   rc   rd   rF   rG   r   rH   r   rK   s                 r    test_activate_creates_plan_cardsz3TestPlanActivation.test_activate_creates_plan_cards  s2   12  **(*;AACt4t4tt4zz&z&!&Q&!Q&&&&!Q&&&&&&t&&&t&&&z&&&&&&!&&&Q&&&&&&&&r   c                 Z   t                t                |j                  d       |j                  d       t        j                  j                  d      j                         }|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 )
Nr   r  r  r   rS   )z7%(py2)s
{%(py2)s = %(py0)s.archived_at
} is not %(py5)srZ   r[   r\   )r   r%   r`   r   r!   ra   r"   archived_atr;   r<   r=   r>   r?   r@   rA   rB   )	rD   r.   r   r  rE   re   rF   rd   rf   s	            r   &test_archived_plan_has_archived_at_setz9TestPlanActivation.test_archived_plan_has_archived_at_set  s    1201$$..j.AGGI##/4/#4////#4//////x///x///#///4///////r   c           	      l   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                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}x}}y )	Nz/paydown/activate/invalidr   r+   )zl%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.post
}(%(py4)s)
}.status_code
} == %(py11)sr.   r/   r6   r7   )r   r%   r`   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   s              r   r   z4TestPlanActivation.test_invalid_strategy_returns_404  s    {{J6J{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J{JJJ6JJJ7JJJCJJJsJJJJJJJJr   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}}g }d
}	|j                  }
|
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                  |
      t        j                  |      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}x}x}}y )Nr   z/paydown/monitorr*   r+   rq   rr   rZ   r[   r\   s	   avalancher   ry   )z`%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.data
}.lower
}()
})rW   rY   r\   r~   r5   z%(py13)sr7   )z0%(py16)s in %(py20)s
{%(py20)s = %(py18)s.data
})r   r   py20z%(py22)spy22r   zassert %(py25)spy25)r   r%   r`   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rQ   r   r   r   )rD   r.   r   rr   rE   re   rF   rd   rf   rb   r   r   rI   r   r   @py_assert19@py_assert17rK   rL   @py_format21@py_format23@py_format24@py_format26s                          r   test_monitor_shows_active_planz1TestPlanActivation.test_monitor_shows_active_plan  s   12::01##*s*#s****#s******x***x***#***s*******U|Ux}}U}22U24U|44UUU8UUUUU|4UUU|UUUUUUxUUUxUUU}UUU2UUU4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUr   N)r   r   r   r  r  r  r  r  r  r  r   r"  r   r   r   r   r      s3    ,95	KI'0K
Vr   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestExtraPaymentc           	      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/paydown/extra-paymentr*   r+   r-   r.   r/   r6   r7   r8   rC   s              r   test_get_extra_form_returns_200z0TestExtraPayment.test_get_extra_form_returns_200(  s    zzF2Fz23F3??F3F?3FFFF?3FFFFFFvFFFvFFFzFFF2FFF3FFF?FFF3FFFFFFFFr   c                    t                |j                  dddi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&  r    z150.00Frn   rp   r+   rq   rr   rZ   r[   r\   comparer   ry   r   r   r   r3   )r   r`   r:   r;   r<   r=   r>   r?   r@   rA   rB   r   r   s                r   .test_valid_post_saves_and_redirects_to_comparez?TestExtraPayment.test_valid_post_saves_and_redirects_to_compare+  s    ;;7%<h$G05  7 ##*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                    |j                  dd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    r   rP   r*   r+   rq   rr   rZ   r[   r\   rs   rt   s	            r   test_invalid_amount_rerendersz.TestExtraPayment.test_invalid_amount_rerenders3  s    ;;7%<n$M  O##*s*#s****#s******x***x***#***s*******r   c                    |j                  dddi       t        j                  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                  }d}t        |      }	||	k(  }
|
s
t	        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                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |	      dz  }dd|iz  }t        t	        j                  |            d x}x}
x}}	y )Nr&  r    z250.00rP   rS   rU   r$   rV   rX   rY   r+   )z[%(py2)s
{%(py2)s = %(py0)s.extra_monthly_payment
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   r]   r^   r_   )r`   r   r!   r"   r;   r<   r=   r>   r?   r@   rA   rB   r    r   )rD   r.   r   r$   rb   rE   rc   rd   rG   rH   rF   rg   rh   s                r   test_saves_to_settingsz'TestExtraPayment.test_saves_to_settings8  s2   ,18< 	 	>>>'')##xt####xt######x###x###t#######--BB1BB-1BBBBB-1BBBBBBBxBBBxBBB-BBBBBBBBBBBBBBB1BBBBBBBBr   N)r   r   r   r'  r*  r,  r.  r   r   r   r$  r$  '  s    G9+
Cr   r$  )r   z1000.00rx   r   )z200.00)__doc__builtinsr=   _pytest.assertion.rewrite	assertionrewriter;   decimalr   jsonpytestapp.extensionsr   r   app.models.accountr   app.models.settingsr   app.models.paydown_planr   app.models.paydown_plan_cardr   r   r%   r'   r   r   r   r   r$  r   r   r   <module>r<     s{    5       $ & ( / 8

6) 6)rI I.#A #AP7N 7NxDV DVRC Cr   