
    j                         d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZ ddlZddlmZ d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dZ G d d      Zy)u   GET /api/budgets — Story 4.4.    N)Decimal)date)db)Account)Budget)Category)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    B/var/www/html/financials/tests/test_blueprints/test_api_budgets.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        j                         }t        | j                  |j                  |j
                  t        |            }t        j                  j                  |       t        j                  j                          |S )N)category_idmonthyearamount)r   todayr   idr   r    r   r   r   r   r   )r   r!   r"   bs       r   _make_budgetr%      sS    JJLE3665::gV\o^AKKOOAKKHr   c           	         t        j                         }|j                  |z   }|j                  }|dk  r|dz  }|dz  }n|dkD  r
|dz  }|dz  }t	        | d|dddt        t        |            |d| j                  |j                        }t        j                  j                  |       t        j                  j                          |S )	N      -02dz-15TestMerchantT)r   merchant_normalizedr!   	is_credit	is_manual
account_idr   )r   r"   r   r    r	   r   strr#   r   r   r   r   )	r   r   r!   r-   month_offsetr"   r   r    txns	            r   	_make_txnr3   %   s    JJLEKK,&E::Dqy			
vQuSk%*s6{#77FFC KKOOCKKJr   c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestApiBudgetsc           	      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/api/budgets   ==)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py11z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_returns_200zTestApiBudgets.test_returns_200>   s    zz<.<z.)<)55<<5<<<<5<<<<<<v<<<v<<<z<<<.<<<)<<<5<<<<<<<<<<<r   c                    |j                  d      }|j                  }|j                  }d} ||      }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}x}}y )Nr7   zapplication/jsonznassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.content_type
}.startswith
}(%(py6)s)
}response)r<   r=   r>   r?   r@   )
rC   content_type
startswithrG   rH   rE   rI   rJ   rK   rL   )	rM   r;   r   rX   rN   rO   rP   rQ   @py_format9s	            r   test_content_type_is_jsonz(TestApiBudgets.test_content_type_is_jsonA   s    ::n-$$C$//C0BC/0BCCCCCCCCxCCCxCCC$CCC/CCC0BCCCCCCCCCCr   c                    |j                  d      }t        j                  |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 )Nr7   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancedatalist)r<   py1r=   r>   )rC   jsonloadsr_   r^   r`   rG   rH   rE   rI   rJ   rK   rL   )rM   r;   r   rX   r_   rO   @py_format5s          r   test_returns_listz TestApiBudgets.test_returns_listE   s    ::n-zz(--($%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%r   c                    t        d       |j                  d      }t        j                  |j                        }t        |      }d}||kD  }|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 }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}y )NHousingr7   r   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenr_   )r<   ra   py3r?   zassert %(py8)sr@   category)in)z%(py1)s in %(py3)sitemra   rj   assert %(py5)spy5budgetedspent)r   rC   rb   rc   r_   ri   rE   rF   rG   rH   rI   rJ   rK   rL   )rM   r;   r   rX   r_   @py_assert2rP   @py_assert4@py_format7r[   rm   @py_assert0@py_format4@py_format6s                 r   test_item_has_required_keysz*TestApiBudgets.test_item_has_required_keysJ   s   y!::n-zz(--(4y1y1}y1ss44y1Aw!zT!!!!zT!!!z!!!!!!T!!!T!!!!!!!!zT!!!!zT!!!z!!!!!!T!!!T!!!!!!!w$w$w$$r   c                    t        d      }t        |d       |j                  d      }t        j                  |j
                        }t        d |D              }|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      d	z  }
d
d|
iz  }t        t        j                  |            d x}x}	}y )Nrg   z800.00r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   rg   N .0ds     r   	<genexpr>z>TestApiBudgets.test_budgeted_amount_correct.<locals>.<genexpr>Y   s     EQ!J-9*DqE   rq   g      @r9   z%(py1)s == %(py4)sra   r>   assert %(py6)sr?   r   r%   rC   rb   rc   r_   nextrE   rF   rJ   rK   rL   )rM   r;   r   r   rX   r_   housingrv   rO   rs   rd   ru   s               r   test_budgeted_amount_correctz+TestApiBudgets.test_budgeted_amount_correctT   s    Y'S(#::n-zz(--(E$EEz"+e+"e++++"e+++"+++e+++++++r   c                    t               }t        d      }t        |d       t        ||d       t        ||d       |j	                  d      }t        j                  |j                        }t        d |D              }|d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y )NDining300.00z75.0045.00r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   z;TestApiBudgets.test_spent_amount_correct.<locals>.<genexpr>d   s     CA:()BaCr   rr   g      ^@r9   r   r   r   r?   r   r   r%   r3   rC   rb   rc   r_   r   rE   rF   rJ   rK   rL   )rM   r;   r   r   r   rX   r_   diningrv   rO   rs   rd   ru   s                r   test_spent_amount_correctz(TestApiBudgets.test_spent_amount_correct\   s    X&S(#$W%$W%::n-zz(--(CCCg'%'%''''%''''''%'''''''r   c                    t        d       |j                  d      }t        j                  |j                        }t        d |D              }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d x}x}}y )NEntertainmentr7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   zDTestApiBudgets.test_no_budget_shows_zero_budgeted.<locals>.<genexpr>k   s     Ga
m&F1Gr   rq   r   r9   r   r   r   r?   )r   rC   rb   rc   r_   r   rE   rF   rJ   rK   rL   )rM   r;   r   rX   r_   entrv   rO   rs   rd   ru   s              r   "test_no_budget_shows_zero_budgetedz1TestApiBudgets.test_no_budget_shows_zero_budgetedg   s    '::n-zz(--(GdGG:#!#!####!######!#######r   c                    t        d      }t        |d       |j                  d      }t        j                  |j
                        }t        d |D              }|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      d	z  }
d
d|
iz  }t        t        j                  |            d x}x}	}y )N	Utilitiesz150.00r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   zGTestApiBudgets.test_no_transactions_shows_zero_spent.<locals>.<genexpr>s        D!q}'CADr   rr   r   r9   r   r   r   r?   r   )rM   r;   r   r   rX   r_   utilrv   rO   rs   rd   ru   s               r   %test_no_transactions_shows_zero_spentz4TestApiBudgets.test_no_transactions_shows_zero_spentn   s    [)S(#::n-zz(--(DtDDG}!!}!!!!}!!!}!!!!!!!!!!r   c                    t               }t        d      }t        |d       t        ||dd       |j	                  d      }t        j                  |j                        }t        d |D              }|d   }d	}	||	k(  }
|
slt        j                  d
|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y )N	Groceriesz400.00z50.00T)r-   r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   zCTestApiBudgets.test_excludes_credit_transactions.<locals>.<genexpr>}   r   r   rr   r   r9   r   r   r   r?   r   )rM   r;   r   r   r   rX   r_   grocrv   rO   rs   rd   ru   s                r   !test_excludes_credit_transactionsz0TestApiBudgets.test_excludes_credit_transactionsv   s    [)S(#$W5::n-zz(--(DtDDG}!!}!!!!}!!!}!!!!!!!!!!r   c                    t               }t        d      }t        |d       t        ||dd       |j	                  d      }t        j                  |j                        }t        d |D              }|d   }d	}	||	k(  }
|
slt        j                  d
|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y )NShoppingz200.00z99.00)r1   r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   zHTestApiBudgets.test_excludes_prior_month_transactions.<locals>.<genexpr>   s     C!q}
'BACr   rr   r   r9   r   r   r   r?   r   )rM   r;   r   r   r   rX   r_   shoprv   rO   rs   rd   ru   s                r   &test_excludes_prior_month_transactionsz5TestApiBudgets.test_excludes_prior_month_transactions   s    Z(S(#$W26::n-zz(--(CtCCG}!!}!!!!}!!!}!!!!!!!!!!r   c                 r   t        ddd      }t        j                  j                  |       t        j                  j	                          |j                  d      }t        j                  |j                        }|D cg c]  }|d   	 }}d}||v}	|	st        j                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }
d
d|
iz  }t        t        j                   |            d x}}	y c c}w )NDeadCatFr   r7   rk   )not in)z%(py1)s not in %(py3)snamesrn   ro   rp   )r   r   r   r   r   rC   rb   rc   r_   rE   rF   rJ   rG   rH   rI   rK   rL   )rM   r;   r   r   rX   r_   r   r   rv   rs   rw   rx   s               r   #test_inactive_category_not_includedz2TestApiBudgets.test_inactive_category_not_included   s    I%H::n-zz(--((,-1:--%y%%%%y%%%y%%%%%%%%%%%%%%%% .s    D4c                    t               }t        d      }t        |d       dD ]  }t        |||        |j	                  d      }t        j                  |j                        }t        d |D              }|d   }	d}
|	|
k(  }|slt        j                  d|fd	|	|
f      t        j                  |	      t        j                  |
      d
z  }dd|iz  }t        t        j                  |            d x}	x}}
y )NTransportationz500.00)z30.00r   z20.00r7   c              3   2   K   | ]  }|d    dk(  s|  yw)rk   r   Nr|   r}   s     r   r   zDTestApiBudgets.test_sql_aggregation_multiple_txns.<locals>.<genexpr>   s     J1*9I(IQJr   rr   g     W@r9   r   r   r   r?   r   )rM   r;   r   r   r   amtrX   r_   transrv   rO   rs   rd   ru   s                 r   "test_sql_aggregation_multiple_txnsz1TestApiBudgets.test_sql_aggregation_multiple_txns   s    -.S(#. 	&CdC%	&::n-zz(--(JJJW~%%~%%%%~%%%~%%%%%%%%%%r   N)__name__
__module____qualname__rV   r\   re   ry   r   r   r   r   r   r   r   r   r|   r   r   r5   r5   =   s?    =D&
,	($"""&	&r   r5   )r   )r   )Fr   )__doc__builtinsrG   _pytest.assertion.rewrite	assertionrewriterE   rb   decimalr   datetimer   pytestapp.extensionsr   r   app.models.accountr   app.models.budgetr   app.models.categoryr   app.models.transactionr	   r   r   r%   r3   r5   r|   r   r   <module>r      sG    %       $ & $ ( .0_& _&r   