
    81j-                         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	lmZ dd
lmZ ddZddZddZ G d d      Z G d d      Z G d d      Zy)u*   Paydown Monitor — Stories 7.1, 7.2, 7.3.    N)Decimal)db)Account)Settings)PaydownPlan)PaydownPlanCard)PaydownBalanceUpdate)calculate_avalanchec           
          t        | ddt        |      t        |      t        |            }t        j                  j	                  |       t        j                  j                          |S )NcreditTnametype	is_activecurrent_balanceaprmin_payment)r   r   _dbsessionaddcommit)r   balancer   min_paycards        F/var/www/html/financials/tests/test_blueprints/test_paydown_monitor.py
_make_cardr      sQ    D(CLG$	D KKOODKKK    c                    t        |t        |      d      }t        j                  j	                  |       t        j                  j                          | j                  | j                  | j                  | j                  | j                  d}t        |gt        |            }t        |j                  | j                  t        |j                  r'|j                  d   d   r|j                  d   d   d   nd x}r|d   nd      | j                  | j                        }t        j                  j	                  |       t        j                  j                          t        j                   j#                         }|6t        d	t        |      
      }t        j                  j	                  |       nt        |      |_        t        j                  j                          |S )Nactive)strategyextra_monthlystatus)idr   r   r   r   r   schedulepayment50)plan_id
account_idmonthly_allocationstarting_balancestarting_apr   )r#   extra_monthly_payment)r   r   r   r   r   flushr#   r   r   r   r   r
   r   per_card_scheduler   r   queryfirstr-   )	r   extrar    plan	card_dictresultschedule_row	plan_cardsettingss	            r   _make_active_planr9      s   xXDKKOODKK ggtyy''''I
 !)gen=F77"  ~D  ~V  ~V  [a  [s  [s  tu  [v  wA  [BvOgOghiOjkuOvwxOy  HL  @L|  @L<	#:  SW  X--XXI KKOOIKK~~##%HqG!)0&KKKr   c                 *   t         j                   j                         t        j                  |      z
  }t        | t	        t        |            |      }t        j                  j                  |       t        j                  j                          |S )N)days)r(   r   
updated_at)
datetimenow	timedeltar	   r   strr   r   r   r   )r(   r   days_agoupd_dateupds        r   _make_balance_updaterD   ?   si      $$&););)JJH
G%C
 KKOOCKKJr   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestMonitorViewc           	      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/monitor   ==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selfrM   r   @py_assert1@py_assert3@py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14s              r   test_monitor_returns_200z(TestMonitorView.test_monitor_returns_200N       zz@,@z,-@-99@S@9S@@@@9S@@@@@@v@@@v@@@z@@@,@@@-@@@9@@@S@@@@@@@@r   c                    |j                  d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	NrH   s   No active planinz,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}responsepy1py3py5assert %(py7)spy7
rX   datarZ   r[   r_   r\   r]   r^   r`   ra   	rc   rM   r   rr   @py_assert0@py_assert4@py_assert2@py_format6@py_format8s	            r   +test_monitor_shows_empty_state_when_no_planz;TestMonitorView.test_monitor_shows_empty_state_when_no_planQ   s    ::01 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                 L   t               }t        |       |j                  d      }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 )NrH   	   avalanche	   Avalanchero   z`%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.data
}.lower
}()
}rr   ru   rv   rx   py9rT   %(py13)srV   z0%(py16)s in %(py20)s
{%(py20)s = %(py18)s.data
}py16py18py20%(py22)spy22r,   assert %(py25)spy25)r   r9   rX   rz   lowerrZ   r[   r_   r\   r]   r^   append_format_boolopr`   ra   rc   rM   r   r   rr   rd   r~   @py_assert6@py_assert8rh   r}   r|   @py_assert15@py_assert19@py_assert17rj   rk   @py_format21@py_format23@py_format24@py_format26s                        r   #test_monitor_shows_active_plan_infoz3TestMonitorView.test_monitor_shows_active_plan_infoU   s>   |$::01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   c                    t        d      }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 )
NzChase FreedomrH   s   Chase Freedomro   rq   rr   rs   rw   rx   r   r9   rX   rz   rZ   r[   r_   r\   r]   r^   r`   ra   
rc   rM   r   r   rr   r|   r}   r~   r   r   s
             r   test_monitor_shows_card_namez,TestMonitorView.test_monitor_shows_card_name[   s    /*$::0108==0=0000=00000000080008000=0000000r   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 )	NrH   s   Plannedro   rq   rr   rs   rw   rx   r   r   s
             r   "test_monitor_shows_planned_balancez2TestMonitorView.test_monitor_shows_planned_balancea   s    |$::01*X]]*z]****z]***z******X***X***]*******r   c                    t               }t        |       |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 )NrH   s   Stales   stalero   z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}rr   ru   rv   rx   %(py9)sr   )z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
})py12py14r   z%(py18)sr   r,   zassert %(py21)spy21)r   r9   rX   rz   rZ   r[   r_   r\   r]   r^   r   r   r`   ra   )rc   rM   r   r   rr   rd   r~   r   r}   r|   @py_assert11r   @py_assert13r   @py_format10@py_format17@py_format19@py_format20@py_format22s                      r   2test_monitor_shows_stale_indicator_when_no_updateszBTestMonitorView.test_monitor_shows_stale_indicator_when_no_updatesg   s   |$::01ExE8==Ex=(EHEEH,EEEEEx=EEExEEEEEE8EEE8EEE=EEEEEEEHEEEHEEEEEEEEEEEEEEEEEEEEEEEEEEr   c                 |   t        d      }t        |      }t        |j                  d       |j	                  d      }g }d}|j
                  }||v }	|	}
|	s'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                  |      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                        t        j                        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 )N2000.00r   z2500.00rH   s   Behind Plans   behindro   r   rr   r   r   r   )zf%(py12)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.data
}.lower
}()
})r   r   r   r   r   r   r   r,   r   r   )r   r9   rD   r#   rX   rz   r   rZ   r[   r_   r\   r]   r^   r   r   r`   ra   )rc   rM   r   r   r3   rr   rd   r~   r   r}   r|   r   r   r   r   r   r   r   r   r   r   r   s                         r   .test_monitor_shows_behind_alert_when_over_5pctz>TestMonitorView.test_monitor_shows_behind_alert_when_over_5pctm   sQ   ), &TWWi0::01T~TT~.T)Tx}}T}?R?RT?R?TT)?T2TTTTT~TTT~TTTTTTTTTTTTTTTTTTT)?TTTT)TTTTTTxTTTxTTT}TTT?RTTT?TTTTTTTTTTTTTTTTr   c                    |j                  d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	NrH   s   paydownro   rq   rr   rs   rw   rx   ry   r{   s	            r   #test_monitor_active_page_is_paydownz3TestMonitorView.test_monitor_active_page_is_paydownu   s~    ::01*X]]*z]****z]***z******X***X***]*******r   N)__name__
__module____qualname__rl   r   r   r   r   r   r   r    r   r   rF   rF   M   s.    A2V1+FU+r   rF   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestBalanceUpdatesc                    t               }t        |       |j                  d|j                  dd       t        j
                  j                  |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 )N/paydown/monitor/update-balancez1800.00r(   r   rz   r(   is notz%(py0)s is not %(py3)srC   rO   ru   assert %(py5)srv   rJ   )zM%(py2)s
{%(py2)s = %(py0)s.balance
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   rO   rP   rQ   rR   rS   assert %(py10)spy10)r   r9   postr#   r	   r0   	filter_byr1   rZ   r[   r\   r]   r^   r_   r`   ra   r   r   )rc   rM   r   r   rC   r~   rd   @py_format4r   rf   rg   re   @py_format9@py_format11s                 r   )test_update_creates_balance_update_recordz<TestBalanceUpdates.test_update_creates_balance_update_record}   sU   |$5'' =
 	 #((22dgg2FLLNs$s$ss${{0i0gi00{00000{0000000s000s000{000000g000g000i00000000000r   c                    t               }t        |       |j                  d|j                  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}}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   1500.00r   Frz   follow_redirects.  rJ   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)srr   rO   rP   rv   rw   rx   monitorLocationro   z%(py1)s in %(py4)srt   rQ   assert %(py6)srR   )r   r9   r   r#   rY   rZ   r[   r\   r]   r^   r_   r`   ra   headersrc   rM   r   r   rr   rd   r}   re   r   r   r|   r~   @py_format5@py_format7s                 r    test_update_redirects_to_monitorz3TestBalanceUpdates.test_update_redirects_to_monitor   s   |$;;@'' H
 "  # ##*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|j                  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   1700.00r   Tr   s   updatedro   z^%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.data
}.lower
}()
}rr   rt   ru   rv   rx   r   assert %(py11)srT   )r   r9   r   r#   rz   r   rZ   r[   r_   r\   r]   r^   r`   ra   rc   rM   r   r   rr   r|   r}   r   r   r~   r   rj   s               r   test_update_flashes_successz.TestBalanceUpdates.test_update_flashes_success   s    |$;;@'' H
 !  " 2X]]2]002022z22222z2222z222222X222X222]2220222222222222r   c                    t               }t        |       |j                  d|j                  dd       |j                  d|j                  dd       t        j
                  }|j                  }|j                  } ||      }|j                  } |       }	d}
|	|
k(  }|sZt        j                  d|fd	|	|
f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      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}x}	x}}
y )Nr   z1900.00r   r   r   r      rJ   )z%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.filter_by
}(account_id=%(py7)s
{%(py7)s = %(py5)s.id
})
}.count
}()
} == %(py16)sr	   r   )	rO   rP   rQ   rv   rx   r   rT   rV   r   zassert %(py18)sr   )r   r9   r   r#   r	   r0   r   countrZ   r[   r\   r]   r^   r_   r`   ra   )rc   rM   r   r   rd   re   r   r   rh   @py_assert12r   @py_assert14r   r   s                 r   test_old_updates_preservedz-TestBalanceUpdates.test_old_updates_preserved   s]   |$5(,IF 	 	H5(,IF 	 	H#))T)33TtwwT3wGTGMMTMOTSTTOSTTTTTOSTTTTTTT#TTT#TTT)TTT3TTTTTTtTTTtTTTwTTTGTTTMTTTOTTTSTTTTTTTTTr   c           
      N   t               }t        |       t        dddt        d      t        d      t        d            }t        j
                  j                  |       t        j
                  j                          |j                  d|j                  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 )NOtherr   T50015r   r   z400.00r   r   s   not in active planro   r   rr   r   r   rT   )r   r9   r   r   r   r   r   r   r   r#   rz   r   rZ   r[   r_   r\   r]   r^   r`   ra   )rc   rM   r   r   
other_cardrr   r|   r}   r   r   r~   r   rj   s                r   #test_card_not_in_plan_returns_errorz6TestBalanceUpdates.test_card_not_in_plan_returns_error   s%   |$'D-4U^)08
 	
#;;@$--H
 !  " %==(;(;=(;(==$(=====$(====$===============(;===(=========r   c                    t               }t        |       |j                  d|j                  ddd      }t        j
                  }|j                  } |       }d}||k(  }	|	st        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                  |      d
z  }
dd|
iz  }t        t        j                  |            d x}x}x}x}	}y )Nr   z-100.00r   Tr   r   rJ   z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.count
}()
} == %(py9)sr	   rO   rP   rQ   rR   r   r   rT   r   r9   r   r#   r	   r0   r   rZ   r[   r\   r]   r^   r_   r`   ra   rc   rM   r   r   rr   rd   re   rf   r   rg   r   rj   s               r   test_negative_balance_rejectedz1TestBalanceUpdates.test_negative_balance_rejected   s    |$;;@'' H
 !  " $))6)//6/16Q61Q66661Q666666#666#666)666/6661666Q66666666r   c                    t               }t        |       |j                  d|j                  ddd      }t        j
                  }|j                  } |       }d}||k(  }	|	st        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                  |      d
z  }
dd|
iz  }t        t        j                  |            d x}x}x}x}	}y )Nr   znot-a-numberr   Tr   r   rJ   r   r	   r   r   rT   r   r   s               r   test_invalid_balance_rejectedz0TestBalanceUpdates.test_invalid_balance_rejected   s    |$;;@''%H
 !  " $))6)//6/16Q61Q66661Q666666#666#666)666/6661666Q66666666r   N)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   |   s&    	193U>77r   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)TestStrategySwitchAndHistoryc                    t               }t        |d       |j                  dddi       t        j                  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                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )N	avalancher    /paydown/switch-strategyr    snowballr   archivedr"   r,   rJ   )z%(py0)s == %(py3)sr   r   rv   )r   r9   r   r   r0   r   r   rZ   r[   r\   r]   r^   r_   r`   ra   )	rc   rM   r   r   r  r~   rd   r   r   s	            r   test_switch_archives_old_planz:TestStrategySwitchAndHistory.test_switch_archives_old_plan   s    |$5.j*5MN$$..j.AGGIx1}x1xx1r   c                    t               }t        |d       |j                  dddi       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 )Nr  r  r  r    r  r   r   r  r   r   r   r   rv   rJ   )z0%(py2)s
{%(py2)s = %(py0)s.strategy
} == %(py5)sr   rw   rx   )r   r9   r   r   r0   r   r1   rZ   r[   r\   r]   r^   r_   r`   ra   r    )rc   rM   r   r   r   r~   rd   r   r   r}   re   r   s               r   #test_switch_creates_new_active_planz@TestStrategySwitchAndHistory.test_switch_creates_new_active_plan   s   |$5.j*5MN"",,H,=CCE!!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!,*,*,,,,*,,,,,,v,,,v,,,,,,*,,,,,,,r   c                    t        d      }t        |d       t        |j                  d       |j	                  dddi	       t
        j                  j                  d
      j                         }t        j                  j                  |j                        j                         }|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   r  r  r   r  r    r  r   r   r  r'   rJ   )zV%(py2)s
{%(py2)s = %(py0)s.starting_balance
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r7   r   r   r   r   r   r9   rD   r#   r   r   r0   r   r1   r   r*   r   rZ   r[   r\   r]   r^   r_   r`   ra   rc   rM   r   r   new_planr7   rd   rf   rg   re   r   r   s               r   &test_switch_uses_latest_balance_updatezCTestStrategySwitchAndHistory.test_switch_uses_latest_balance_update   s+   ),$5TWWi0.j*5MN$$..h.?EEG#))33HKK3HNNP	))?Y?WY-??)-?????)-???????y???y???)??????W???W???Y???-????????r   c                    t               }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    r  Fr   r   rJ   r   rr   r   rw   rx   r   r   ro   r   r   r   rR   )r   r9   r   rY   rZ   r[   r\   r]   r^   r_   r`   ra   r   r   s                 r    test_switch_redirects_to_monitorz=TestStrategySwitchAndHistory.test_switch_redirects_to_monitor   s    |$;;9%/$<05  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                 f   t               }t        |       |j                  dddi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  r    r  Tr   s   switchedro   r   rr   r   r   rT   )r   r9   r   rz   r   rZ   r[   r_   r\   r]   r^   r`   ra   r   s               r   test_switch_flashes_successz8TestStrategySwitchAndHistory.test_switch_flashes_success   s    |$;;9%/$<04  6 3hmm3m113133{33333{3333{333333h333h333m3331333333333333r   c                 F   t               }t        |d       |j                  dddi       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    r  r   r  r  r   )z7%(py2)s
{%(py2)s = %(py0)s.archived_at
} is not %(py5)sr   rw   rx   )r   r9   r   r   r0   r   r1   archived_atrZ   r[   r\   r]   r^   r_   r`   ra   )
rc   rM   r   r   r  rd   r}   re   r   r   s
             r   "test_archived_plan_has_archived_atz?TestStrategySwitchAndHistory.test_archived_plan_has_archived_at   s    |$5.j*5MN$$..j.AGGI##/4/#4////#4//////x///x///#///4///////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 )	N/paydown/historyrI   rJ   rL   rM   rN   rU   rV   rW   rb   s              r   test_history_page_returns_200z:TestStrategySwitchAndHistory.test_history_page_returns_200   rm   r   c                 z   t               }t        |d       |j                  dddi       |j                  d      }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  r  r  r    r  r   r  r   r   ro   r   rr   r   r   rV   r   r   r   r   r,   r   r   )r   r9   r   rX   rz   r   rZ   r[   r_   r\   r]   r^   r   r   r`   ra   r   s                        r   !test_history_shows_archived_plansz>TestStrategySwitchAndHistory.test_history_shows_archived_plans   sV   |$5.j*5MN::01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   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 )	Nr  s   No archivedro   rq   rr   rs   rw   rx   ry   r{   s	            r   )test_history_empty_state_when_no_archivedzFTestStrategySwitchAndHistory.test_history_empty_state_when_no_archived  s~    ::01..~....~...~...................r   c                    t        d      }t        |d       t        |j                  d       |j	                  dddi	       t
        j                  j                  d
      j                         }t        j                  j                  |j                        j                         }|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)zMAfter switch, new plan uses updated balances, not original starting balances.r   r   r  r  z1200.00r  r    proportionalr   r   r  r  )<)zU%(py2)s
{%(py2)s = %(py0)s.starting_balance
} < %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r7   r   r   r   r   Nr  r  s               r   #test_strategy_switch_baseline_resetz@TestStrategySwitchAndHistory.test_strategy_switch_baseline_reset  s+   ),$5TWWi0.j.5QR$$..h.?EEG#))33HKK3HNNP	))>I>GI,>>),>>>>>),>>>>>>>y>>>y>>>)>>>>>>G>>>G>>>I>>>,>>>>>>>>r   N)r   r   r   r	  r  r  r  r  r  r  r  r  r#  r   r   r   r  r     s7    -@940AV/	?r   r  )Visar   z20.00z50.00)z200.00r  )r   ) __doc__builtinsr\   _pytest.assertion.rewrite	assertionrewriterZ   decimalr   r=   pytestapp.extensionsr   r   app.models.accountr   app.models.settingsr   app.models.paydown_planr   app.models.paydown_plan_cardr   !app.models.paydown_balance_updater	   app.services.amortizationr
   r   r9   rD   rF   r   r  r   r   r   <module>r3     s_    0       $ & ( / 8 B 9
	B	*+ *+^F7 F7VH? H?r   