B
Zª…^R%  ã            	   @   sæ   d dl Zd dlm  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 eddd	d
dd d dZG dd„ dƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )'é    N)Údatetime)Úpatch)ÚRequestException)Ú
LogCapture)ÚOpenERZConnectoriã  é   é
   é   é   )ÚyearÚmonthÚdayÚhourÚminuteÚsecondÚmicrosecondc               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚMockAPIResponsez+Provide fake response from the OpenERZ API.c             C   s   || _ || _|| _dS )zInitialize all the values.N)ÚokÚstatus_codeÚ	json_data)ÚselfZis_okr   r   © r   ú2/Users/misialq/Repos/openerz-api/tests/test_api.pyÚ__init__   s    zMockAPIResponse.__init__c             C   s   | j S )zReturn response data.)r   )r   r   r   r   Újson   s    zMockAPIResponse.jsonN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c               C   s
   t ddfS )z/Set up things to be run when tests are started.iÒ  Úglass)ÚMOCK_DATETIMEr   r   r   r   Úsetup_method   s    r!   c          	   C   s~  t | ƒ}t |ƒ}||k}|sêt d|fd||f¡dt ¡ ksFt t ¡rPt t ¡nddt ¡ ksht | ¡rrt | ¡ndt |¡dt ¡ ks’t t ¡rœt t ¡nddt ¡ ks´t |¡r¾t |¡ndt |¡dœ }dd|i }tt |¡ƒ‚d  } }}x‚|  	¡ D ]v}| | }|| }	||	k}|sht d|fd	||	f¡t |¡t |	¡d
œ }
dd|
i }tt |¡ƒ‚d  } }}	q W d S )N)ú==)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}ÚlenÚdict1Údict2)Úpy0Úpy1Úpy3Úpy5Úpy6Zpy8zassert %(py10)sZpy10)z%(py1)s == %(py4)s)r'   Úpy4zassert %(py6)sr*   )
r#   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚkeys)r$   r%   Ú@py_assert2Z@py_assert7Ú@py_assert4Z@py_format9Z@py_format11ÚkeyÚ@py_assert0Ú@py_assert3Ú@py_format5Ú@py_format7r   r   r   ÚassertDictEqual   s"        ´       ,   r<   c           	   C   s  t ƒ \} }}tdƒö}| |j_t||ƒ}|j}d}||k}|s¨t d|fd||f¡dt 	¡ ksjt 
|¡rtt |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d	 } }}|j}d
}||k}|s6t d|fd||f¡dt 	¡ ksøt 
|¡rt |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d	 } }}|j}|| k}|sàt d|fd|| f¡dt 	¡ ks„t 
|¡rŽt |¡ndt |¡dt 	¡ ks²t 
| ¡r¼t | ¡nddœ }
dd|
i }tt |¡ƒ‚d	 }}|j}d	}||k}|slt d|fd||f¡dt 	¡ ks.t 
|¡r8t |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d	 } }}|j}d	}||k}|süt d|fd||f¡dt 	¡ ks¾t 
|¡rÈt |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d	 } }}W d	Q R X d	S )z-Test whether all values initialized properly.zopenerz_api.main.datetimeiÒ  )r"   )z+%(py2)s
{%(py2)s = %(py0)s.zip
} == %(py5)sÚtest_openerz)r&   Úpy2r)   zassert %(py7)sZpy7Nr   )z2%(py2)s
{%(py2)s = %(py0)s.waste_type
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.start_date
} == %(py4)sÚmock_datetime)r&   r>   r+   zassert %(py6)sr*   )Úis)z0%(py2)s
{%(py2)s = %(py0)s.end_date
} is %(py5)s)z9%(py2)s
{%(py2)s = %(py0)s.last_api_response
} is %(py5)s)r!   r   ÚnowÚreturn_valuer   Úzipr,   r-   r.   r/   r0   r1   r2   r3   Ú
waste_typeÚ
start_dateÚend_dateÚlast_api_response)r?   Úzip_coderD   Úpatched_timer=   Ú@py_assert1r6   r9   Ú@py_format6Z@py_format8r:   r;   r   r   r   Ú	test_init%   sV    
    N       P      p       R       R   rL   c        
   
   C   s   t ƒ \} }}tdƒâ}| |j_t||ƒ}| jdd|j_| ¡  tdddddddd}|j}||k}|sêt	 
d	|fd
||f¡dt ¡ ks’t	 |¡rœt	 |¡ndt	 |¡dt ¡ ks¼t	 |¡rÆt	 |¡nddœ }dd|i }	tt	 |	¡ƒ‚d }}W dQ R X dS )z-Test whether start date is updated correctly.zopenerz_api.main.datetimer	   )r   iã  r   r
   r   )r   r   r   r   r   r   r   )r"   )z2%(py2)s
{%(py2)s = %(py0)s.start_date
} == %(py4)sr=   Úexpected_start_date)r&   r>   r+   zassert %(py6)sr*   N)r!   r   rA   rB   r   ÚreplaceZupdate_start_dater   rE   r,   r-   r.   r/   r0   r1   r2   r3   )
r?   rH   rD   rI   r=   rM   rJ   r9   r:   r;   r   r   r   Útest_sensor_update_start_date4   s    

   h   rO   c        
   
   C   sð   t ƒ \} }}tdƒÒ}| |j_t||ƒ}| ¡  tdddddddd}|j}||k}|sÚt 	d	|fd
||f¡dt
 ¡ ks‚t |¡rŒt |¡ndt |¡dt
 ¡ ks¬t |¡r¶t |¡nddœ }dd|i }	tt |	¡ƒ‚d }}W dQ R X dS )z'Test whether end date is correctly set.zopenerz_api.main.datetimeiä  é   r   r	   r
   r   )r   r   r   r   r   r   r   )r"   )z0%(py2)s
{%(py2)s = %(py0)s.end_date
} == %(py4)sr=   Úexpected_end_date)r&   r>   r+   zassert %(py6)sr*   N)r!   r   rA   rB   r   Zfind_end_dater   rF   r,   r-   r.   r/   r0   r1   r2   r3   )
r?   rH   rD   rI   r=   rQ   rJ   r9   r:   r;   r   r   r   Útest_sensor_find_end_dateB   s    

   h   rR   c           
   C   s6  t ƒ \} }}tdƒ}i |j_tdƒú}| |j_t||ƒ}| jdddd|_| ¡  ddi}d	}d
dddddddœ}|jj	d \}	}
|	d }||k}|sút
 d|fd||f¡t
 |¡dt ¡ ksÌt
 |¡rÖt
 |¡nddœ }dd|i }tt
 |¡ƒ‚d }}t|
d |ƒ t|
d |ƒ W dQ R X W dQ R X dS )zTest making API requests.zopenerz_api.main.requestszopenerz_api.main.datetimeiä  rP   r   )r   r   r   Úacceptzapplication/jsonz1http://openerz.metaodi.ch/api/calendar/glass.jsoniÒ  z
2019-12-10z
2020-01-10r   ÚenÚdate)rC   ÚstartÚendÚoffsetÚlimitÚlangÚsort)r"   )z%(py1)s == %(py3)sÚexpected_url)r'   r(   zassert %(py5)sr)   NÚheadersÚparams)r!   r   ÚgetrB   rA   r   rN   rF   Úmake_api_requestZcall_args_listr,   r-   r1   r.   r/   r0   r2   r3   r<   )r?   rH   rD   Zpatched_requestsrI   r=   Zexpected_headersr\   Zexpected_payloadÚ	used_argsZused_kwargsr8   r5   Ú@py_format4rK   r   r   r   Útest_sensor_make_api_requestO   s6    

   F   rc   c              C   sŽ   t ƒ \} }}tdƒp}tdƒ|_tdƒR}| |j_t||ƒ}| jdddd|_t	ƒ }| 
¡  |jdd	d
 W dQ R X W dQ R X W dQ R X dS )zTest making API requests.zopenerz_api.main.requests.getzConnection timed outzopenerz_api.main.datetimeiä  rP   r   )r   r   r   )zopenerz_api.mainÚERRORzFRequestException while making request to OpenERZ: Connection timed outF)Zorder_mattersN)r!   r   r   Úside_effectrA   rB   r   rN   rF   r   r`   Úcheck_present)r?   rH   rD   Zpatched_getrI   r=   Úcaptured_logsr   r   r   Ú-test_sensor_make_api_request_connection_errork   s    



rh   c           	   C   sî   t ƒ \} }}tdƒÐ}| |j_t||ƒ}| jdddd|_ddiddd	d
œgdœ}tdd|ƒ|_| 	¡ }d	}||k}|sØt
 d|fd||f¡dt ¡ ks¢t
 |¡r¬t
 |¡ndt
 |¡dœ }	dd|	i }
tt
 |
¡ƒ‚d }}W dQ R X dS )z.Test whether API response is parsed correctly.zopenerz_api.main.datetimeiä  rP   r   )r   r   r   Útotal_countiÒ  r   z
2020-01-10)rC   ÚtyperU   )Ú	_metadataÚresultTéÈ   )r"   )z%(py0)s == %(py3)sÚtest_pickup_date)r&   r(   zassert %(py5)sr)   N)r!   r   rA   rB   r   rN   rF   r   rG   Úparse_api_responser,   r-   r.   r/   r0   r1   r2   r3   )r?   rH   rD   rI   r=   Úresponse_datarn   r5   rJ   rb   rK   r   r   r   Ú!test_sensor_parse_api_response_ok€   s     

   F   rq   c           
   C   s   t ƒ \} }}tdƒâ}| |j_t||ƒ}| jdddd|_ddig dœ}tƒ ž}td	d
|ƒ|_	| 
¡ }d}||k}	|	sÖt d|	fd||f¡dt ¡ ks t |¡rªt |¡ndt |¡dœ }
dd|
i }tt |¡ƒ‚d }	}| d¡ W dQ R X W dQ R X dS )zDTest whether API response is parsed correctly when no data returned.zopenerz_api.main.datetimeiä  rP   r   )r   r   r   ri   r   )rk   rl   Trm   N)r@   )z%(py0)s is %(py3)srn   )r&   r(   zassert %(py5)sr)   )zopenerz_api.mainÚWARNINGz'Request to OpenERZ returned no results.)r!   r   rA   rB   r   rN   rF   r   r   rG   ro   r,   r-   r.   r/   r0   r1   r2   r3   rf   )r?   rH   rD   rI   r=   rp   rg   rn   r5   rJ   rb   rK   r   r   r   Ú&test_sensor_parse_api_response_no_data’   s"    

   F   rs   c           
   C   s
  t ƒ \} }}tdƒì}| |j_t||ƒ}| jdddd|_ddiddd	d
œgdœ}tƒ ž}tdd|ƒ|_	| 
¡ }d}||k}	|	sàt d|	fd||f¡dt ¡ ksªt |¡r´t |¡ndt |¡dœ }
dd|
i }tt |¡ƒ‚d }	}| d¡ W dQ R X W dQ R X dS )z-Test handling unexpected zip in API response.zopenerz_api.main.datetimeiä  rP   r   )r   r   r   ri   iÓ  r   z
2020-01-10)rC   rj   rU   )rk   rl   Trm   N)r@   )z%(py0)s is %(py3)srn   )r&   r(   zassert %(py5)sr)   )zopenerz_api.mainrr   zPEither zip or waste type does not match the ones specified in the configuration.)r!   r   rA   rB   r   rN   rF   r   r   rG   ro   r,   r-   r.   r/   r0   r1   r2   r3   rf   )r?   rH   rD   rI   r=   rp   rg   rn   r5   rJ   rb   rK   r   r   r   Ú(test_sensor_parse_api_response_wrong_zip¤   s&    

   F   rt   c           
   C   s
  t ƒ \} }}tdƒì}| |j_t||ƒ}| jdddd|_ddiddd	d
œgdœ}tƒ ž}tdd|ƒ|_	| 
¡ }d}||k}	|	sàt d|	fd||f¡dt ¡ ksªt |¡r´t |¡ndt |¡dœ }
dd|
i }tt |¡ƒ‚d }	}| d¡ W dQ R X W dQ R X dS )z4Test handling unexpected waste type in API response.zopenerz_api.main.datetimeiä  rP   r   )r   r   r   ri   iÒ  Zmetalz
2020-01-10)rC   rj   rU   )rk   rl   Trm   N)r@   )z%(py0)s is %(py3)srn   )r&   r(   zassert %(py5)sr)   )zopenerz_api.mainrr   zPEither zip or waste type does not match the ones specified in the configuration.)r!   r   rA   rB   r   rN   rF   r   r   rG   ro   r,   r-   r.   r/   r0   r1   r2   r3   rf   )r?   rH   rD   rI   r=   rp   rg   rn   r5   rJ   rb   rK   r   r   r   Ú)test_sensor_parse_api_response_wrong_type¿   s&    

   F   ru   c           
   C   sü   t ƒ \} }}tdƒÞ}| |j_t||ƒ}| jdddd|_di gi}tƒ ž}tdd|ƒ|_	| 
¡ }d	}||k}	|	sÒt d
|	fd||f¡dt ¡ ksœt |¡r¦t |¡ndt |¡dœ }
dd|
i }tt |¡ƒ‚d	 }	}| d¡ W d	Q R X W d	Q R X d	S )z+Test handling of an erroneous API response.zopenerz_api.main.datetimeiä  rP   r   )r   r   r   rl   Fi”  N)r@   )z%(py0)s is %(py3)srn   )r&   r(   zassert %(py5)sr)   )zopenerz_api.mainrr   z<Last request to OpenERZ was not successful. Status code: 404)r!   r   rA   rB   r   rN   rF   r   r   rG   ro   r,   r-   r.   r/   r0   r1   r2   r3   rf   )r?   rH   rD   rI   r=   rp   rg   rn   r5   rJ   rb   rK   r   r   r   Ú%test_sensor_parse_api_response_not_okÚ   s$    


   F   rv   )Úbuiltinsr.   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter,   r   ÚunittestZunittest.mockr   Zrequests.exceptionsr   Ztestfixturesr   Zopenerz_api.mainr   r    r   r!   r<   rL   rO   rR   rc   rh   rq   rs   rt   ru   rv   r   r   r   r   Ú<module>   s*     