
    PIi;                        d Z ddlZddlZddlZddl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lmZmZmZmZmZmZ ddlmZ  G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z  G d dej4                        Z! G d dej4                        Z" G d dej4                        Z# G d d ej4                        Z$ G d! d"ej4                        Z%e&d#k(  r ejN                          yy)$zi
Unit tests for the Python Facebook Business SDK.

How to run:
    python -m facebook_business.test.unit
    N)urllib)version_info   )api)specs)
exceptions)session)utils)abstractcrudobjectad	adaccount
adcreativecustomaudienceproductcatalog)versionc                   *    e Zd Zd Zd Zd Zd Zd Zy)CustomAudienceTestCasec                     t         j                  j                  t         j                  j                  j                  g d      }d}|d   d   }|d   |k(  sJ |d   |d   k(  sJ |d   |d   k(  sJ y )N)z  test  test..test..@9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08payloaddatar      r   )r   CustomAudienceformat_paramsSchema
email_hash)selfr   	test_hashuserss       i/var/www/webhook.estador.de/web/meta/bot/venv/lib/python3.12/site-packages/facebook_business/test/unit.pytest_format_paramsz)CustomAudienceTestCase.test_format_params4   s     //==))00;;,
 O 		"6*Qx9$$$Qx58###Qx58###    c                 J    d }| j                  t        j                  |       y )Nc                      t         j                  j                  t         j                  j                  j                  dg       y )N123123)r   r   r   r   uid r$   r"   uid_payloadzECustomAudienceTestCase.test_fail_when_no_app_ids.<locals>.uid_payloadB   s0    ))77--4488
r$   )assertRaisesr   FacebookBadObjectError)r   r*   s     r"   test_fail_when_no_app_idsz0CustomAudienceTestCase.test_fail_when_no_app_idsA   s#    	
 	--	
r$   c                    d}t        j                  |j                  d            j                         }t        j
                  j                  t        j
                  j                  j                  |gd      }|d   d   }|d   |k(  sJ y )Nr   utf8T)
pre_hashedr   r   r   )	hashlibsha256encode	hexdigestr   r   r   r   r   )r   userr    r   r!   s        r"   test_format_params_pre_hashedz4CustomAudienceTestCase.test_format_params_pre_hashedL   s    ^^DKK$78BBD	 //==))00;;K > 
 	"6*Qx9$$$r$   c                    t         j                  j                  j                  j                  t         j                  j                  j                  j
                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  g}t         j                  j                  |g dgd      }g d}|d   d   }|d   |k(  sJ y )N)	abc123defz  TEST r   r   Tis_raw)r8   r   r   r   r   r   r   )	r   r   r   MultiKeySchema	extern_idfnemaillnr   )r   schemar   
test_hash1r!   s        r"   test_multi_key_paramsz,CustomAudienceTestCase.test_multi_key_paramsY   s    ))00??II))00??BB))00??EE))00??BB	
 !//==@A > 


 	"6*Qx:%%%r$   c                     t         j                  j                  j                  j                  g}t         j                  j                  |dgdgdgdggd      }dgdgdgdgg}|d   d   }||k(  sJ y )	Nr8   	abc234def	abc345def	abc456defTr9   r   r   )r   r   r   r;   r<   r   )r   r@   r   expectedactuals        r"   test_extern_id_key_singlez0CustomAudienceTestCase.test_extern_id_key_singleq   s     ))00??II
 !//==}{mk]  > 
 MK=;-+ #F+!!!r$   N)__name__
__module____qualname__r#   r-   r6   rB   rI   r)   r$   r"   r   r   2   s    $	
%&0"r$   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)EdgeIteratorTestCasec                     dddiddigi}t        j                  t        j                  d      t        j
                        }|j                  |      }t        |      dk(  sJ y)	z
        Sometimes the response returns an array inside the data
        key. This asserts that we successfully build objects using
        the objects in that array.
        r   id60195796018402123fbidr   Nr   Cursorr   	AdAccountr   Adbuild_objects_from_responselen)r   responseeiobjss       r"   test_builds_from_arrayz+EdgeIteratorTestCase.test_builds_from_array   sp     i i
 ZZU+EE
 --h74yA~~r$   c                     dddgdddgdgd}t        j                  t        j                  d	      t        j
                        }|j                  |      }t        |      d
k(  r|d   d   dk(  sJ y)z
        Sometimes the response returns a single JSON object. This asserts
        that we're not looking for the data key and that we correctly build
        the object without relying on the data key.
        z601957/targetingsentencelineszLocation - Living In:zUnited States)contentchildrenzAge:z18 - 65+)rP   targetingsentencelinesrS   rT   r   r   rP   NrV   r   r\   r]   objs       r"   test_builds_from_objectz,EdgeIteratorTestCase.test_builds_from_object   s     22#( "
'
 ZZU+EE
 ,,X63x1}Q1P!PPP!Pr$   c                     t        j                  t        j                  d      t        j
                        }| j                  t        j                  |j                         y )NrS   rT   )
r   rW   r   rX   r   rY   r+   r   $FacebookUnavailablePropertyExceptiontotalr   r]   s     r"   test_total_is_nonez'EdgeIteratorTestCase.test_total_is_none   sE    ZZU+EE
 	;;RXX	Gr$   c                     t        j                  t        j                  d      t        j
                        }d|_        | j                  |j                         d       y )NrS   rT       )	r   rW   r   rX   r   rY   _total_countassertEqualri   rj   s     r"   test_total_is_definedz*EdgeIteratorTestCase.test_total_is_defined   sD    ZZU+EE
 R(r$   c                     dddddi}t        j                  t        j                  d      t        j
                        }|j                  |      }t        |      dk(  r|d   d	   dk(  sJ y
)z
        Sometimes the response returns a single JSON object - with a "data".
        For instance with adcreative. This asserts that we successfully
        build the object that is in "data" key.
        r   z	test nameACTIVEact_345)namestatus
account_idrS   r   r   rv   N)r   rW   r   rY   r   
AdCreativerZ   r[   rd   s       r"   %test_builds_from_object_with_data_keyz:EdgeIteratorTestCase.test_builds_from_object_with_data_key   sv     #"'
 ZZEE%L!!
 ,,X63x1}Q!5!BBB!Br$   N)rJ   rK   rL   r_   rf   rk   rp   rx   r)   r$   r"   rN   rN      s    (Q6G)Cr$   rN   c                       e Zd Zd Zd Zd Zy)AbstractCrudObjectTestCasec                    t         j                  t        j                  t        j
                  t        j                  t        j                  fD ]e  }t        j                  |      st        |t        j                        s4|t        j                  k7  sH	 |j                  j                   }|dk7  sJ g y # t"        $ r6}| j%                  dt'        |      z   dz   t'        |      z          Y d }~d }~ww xY w)N zCould not instantiate z
  )r   rY   r   rX   r   rw   r   r   r   ProductCataloginspectisclass
issubclassr   AbstractCrudObjectFieldrP   	Exceptionfailstr)r   re   id_fieldes       r"   test_all_aco_has_id_fieldz4AbstractCrudObjectTestCase.test_all_aco_has_id_field   s    EE''))"11"11	3 	UC $3 2 E EF)<<<U"yy||H#r>)>	U ! UII6SAFJSQRVSTTUs   B77	C6 ,C11C6c                     t        j                         }d|d<   t        |j                        dkD  sJ |d= t        |j                        dk(  sJ y )Nfoort   r   )r   rX   r[   _changes)r   accounts     r"   test_delitem_changes_historyz7AbstractCrudObjectTestCase.test_delitem_changes_history   sR    %%'7##$q(((FO7##$)))r$   c                 t    G d dt         j                        } G d dt         j                        }|di ddif|ddd	id	dd
f|dgi ddif|dgdd	id	dd
f|g i i f|g dd	idd	if|di i f|ddd	idd	if|dgi ddif|dgdd	id	dd
f|g i i f|g dd	idd	iffD ]   \  }}}}|j                  ||       ||k(  r J  y)z
        Demonstrates that AbstractCrudObject._assign_fields_to_params()
        handles various combinations of params and fields properly.
        c                       e Zd ZddgZy)=AbstractCrudObjectTestCase.test_fields_to_params.<locals>.FoorP   rt   NrJ   rK   rL   _default_read_fieldsr)   r$   r"   Foor      s    $(&> r$   r   c                       e Zd Zg Zy)=AbstractCrudObjectTestCase.test_fields_to_params.<locals>.BarNr   r)   r$   r"   Barr      s    #% r$   r   Nfieldszid,nameab)r   r   x)r   r   _assign_fields_to_params)r   r   r   adclassr   paramsrG   s          r"   test_fields_to_paramsz0AbstractCrudObjectTestCase.test_fields_to_params   s<   
	2$77 	2	&$77 	& $Xy12$c
#$CD3%h_-3%#s3#%>?"b""sCj3*-$B$c
S#J/3%h_-3%#s3#%>?"b""sCj3*-2
 	&-GVVX ,,VV<X%%%	&r$   N)rJ   rK   rL   r   r   r   r)   r$   r"   rz   rz      s    U$*&r$   rz   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)AbstractObjectTestCasec                     t        j                         }i }d|d<   d|d<   ||d<   ddddi}|j                         |k(  sJ y )NrP   r   rt   from)rP   rt   )r   PagePostDataexport_data)r   re   obj2rG   s       r"   test_export_nested_objectz0AbstractObjectTestCase.test_export_nested_object  s\      "T
VF
  H,,,r$   c                 p    t        j                         }ddi|d<   dddii}|j                         |k(  sJ y )N	link_data   r   ObjectStorySpecr   r   re   rG   s      r"   test_export_dictz'AbstractObjectTestCase.test_export_dict!  sN    ##%
K Q

  H,,,r$   c                 d    t        j                         }d |d<   i }|j                         |k(  sJ y )Nr   r   r   s      r"   test_export_nonez'AbstractObjectTestCase.test_export_none-  s4    ##%K H,,,r$   c                    t        j                         }t        j                         }t        j                         }d|d<   |g|d<   ||d<   	 t        j                  |j                                y #  | j                  d       Y y xY w)Nz$100descriptionchild_attachmentsr   zObjects in crud object export)	r   rw   r   LinkDataAttachmentDatajsondumpsr   r   )r   re   r   obj3s       r"   test_export_listz'AbstractObjectTestCase.test_export_list3  sw    ##%~~##%$]%)F !K	7JJs()	7II56s   #A2 2Bc                     t        j                         }t        j                         }d|d<   ||d<   	 t        j                  |j                                y #  | j                  d       Y y xY w)Nr   r   
video_datazObjects in object export)r   r   	VideoDatar   r   r   r   )r   re   r   s      r"   test_export_no_objectsz-AbstractObjectTestCase.test_export_no_objects@  s\    ##% #] L	2JJs()	2II01s   #A A-c                     t        j                         }i }d|d<   d|d<   ||d<   	 |j                          y# t        $ r}| j	                  d|z         Y d}~yd}~ww xY w)zAMust be able to print nested objects without serialization issuesrP   r   rt   r   z*Cannot call __repr__ on AbstractObject
 %sN)r   r   __repr__	TypeErrorr   )r   re   r   r   s       r"   test_can_printz%AbstractObjectTestCase.test_can_printK  sf      "T
VF	ILLN 	IIICaGHH	Is   8 	AAAN)	rJ   rK   rL   r   r   r   r   r   r   r)   r$   r"   r   r     s!    -
--7	2Ir$   r   c                       e Zd Zd Zd Zy)SessionTestCasec                 (   dd l }dd l}t        dk  r@|j                  t	        |      t	        |      |j
                        }|j                         S |j                  t	        |d      t	        |d      |j
                        }|j                         S )Nr   )r   r   )msg	digestmodutf-8)r1   hmacr   newbytesr2   r4   )r   access_token
app_secretr1   r   hs         r"   gen_appsecret_proofz#SessionTestCase.gen_appsecret_proof[  s    & j!,'!..  A {{} j'*,0!..  A
 {{}r$   c                     d}d}d}t        j                  |||      }| j                  |j                  | j	                  ||             y )N reikgukrhgfgtcheghjteirdldlrkjbu gdrtejfdghurnhnjghjnertihbknlrvv bekguvjhdvdburldfnrfdguljijenklc)r	   FacebookSessionro   appsecret_proofr   )r   app_idr   r   
fb_sessions        r"   test_appsecret_proofz$SessionTestCase.test_appsecret_proofm  sL    37
9,,VZN
&&$$\:>	
r$   N)rJ   rK   rL   r   r   r)   r$   r"   r   r   Y  s    $	
r$   r   c                       e Zd Zd Zy)ProductCatalogTestCasec                 v    d}d}t        j                         }| j                  ||j                  |             y )NID_1zSURfMQ==)r   r}   ro   b64_encoded_id)r   
product_idb64_id_as_strcatalogs       r"   test_b64_encode_is_correctz1ProductCatalogTestCase.test_b64_encode_is_correctz  s5    
" //1(>(>z(JKr$   N)rJ   rK   rL   r   r)   r$   r"   r   r   y  s    Lr$   r   c                       e Zd Zd Zy)SessionWithoutAppSecretTestCasec                     	 t        j                  d       y # t        $ r'}| j                  dt	        |      z          Y d }~y d }~ww xY w)Nthisisfakeaccesstoken)r   zCould not instantiate 
  )r	   r   r   r   r   )r   r   s     r"   test_appsecret_proof_absencez<SessionWithoutAppSecretTestCase.test_appsecret_proof_absence  sF    	B##4  	BII7#a&@AA	Bs    	A	AA	N)rJ   rK   rL   r   r)   r$   r"   r   r     s    Br$   r   c                   $    e Zd Zd Zd Zd Zd Zy)UrlsUtilsTestCasec                 |   d}| j                  t        j                  j                  |      t        j
                  j                  |             t        j                  r^dj                  d      }| j                  t        j                  j                  |      t        j
                  j                  |             y y )Nzsome string   some string with ùnicoder   )
ro   r
   urlsquote_with_encodingr   parsequotesixPY2r3   r   ss     r"   #test_quote_with_encoding_basestringz5UrlsUtilsTestCase.test_quote_with_encoding_basestring  s    JJ**1-LLq!	

 77,33G<A

..q1""1% r$   c                     d}| j                  t        j                  j                  |      t        j
                  j                  |j                  d                   y )Nr   r   )ro   r
   r   r   r   r   r   r3   r   s     r"    test_quote_with_encoding_unicodez2UrlsUtilsTestCase.test_quote_with_encoding_unicode  sB    (JJ**1-LLqxx01	
r$   c                     d}| j                  t        j                  j                  |      t        j
                  j                  d             y )Ni  1234)ro   r
   r   r   r   r   r   r   s     r"    test_quote_with_encoding_integerz2UrlsUtilsTestCase.test_quote_with_encoding_integer  s9    JJ**1-LLv&	
r$   c                 j    ddg}| j                  t        t        j                  j                  |       y )Nr   r   )r+   
ValueErrorr
   r   r   r   s     r"   6test_quote_with_encoding_other_than_string_and_integerzHUrlsUtilsTestCase.test_quote_with_encoding_other_than_string_and_integer  s+    FJJ**A	
r$   N)rJ   rK   rL   r   r   r   r   r)   r$   r"   r   r     s    


r$   r   c                       e Zd Zd Zy)FacebookAdsApiBatchTestCasec                 P   t         j                  j                         }t        j                  |      }|j	                  ddddi       | j                  t        |      d       | j                  |j                  d   ddt        j                  j                  d      z   d	       y )
NGETz	some/pathkeyu   vàlué)r   r   r   zsome/path?key=)methodrelative_url)r   FacebookAdsApiget_default_apiFacebookAdsApiBatchaddro   r[   _batchr
   r   r   )r   default_api	batch_apis      r"   test_add_works_with_utf8z4FacebookAdsApiBatchTestCase.test_add_works_with_utf8  s    ((88:++K8	e[%1DEY+))!,/%**2P2PQ[2\\/
 	r$   N)rJ   rK   rL   r  r)   r$   r"   r   r     s    r$   r   c                       e Zd Zd Zy)VersionUtilsTestCasec                 p    t         j                  j                         }t        j                  d|      sJ y )Nz[0-9]+\.[0-9]+\.[0-9])r
   r   get_versionresearch)r   version_values     r"   test_api_version_is_pulledz/VersionUtilsTestCase.test_api_version_is_pulled  s)    113yy0-@@@r$   N)rJ   rK   rL   r  r)   r$   r"   r
  r
    s    Ar$   r
  c                       e Zd Zd Zd Zy)FacebookResponseTestCasec                 n    t        j                  d      }| j                  |j                                y )N   )http_status)r   FacebookResponse
assertTrue
is_successr   resps     r"   test_is_success_200z,FacebookResponseTestCase.test_is_success_200  s%    ##4)*r$   c                 p    t        j                  dd      }| j                  |j                                y )NzService Unavailabler  )bodyr  )r   r  assertFalser  r  s     r"   #test_is_success_service_unavailablez<FacebookResponseTestCase.test_is_success_service_unavailable  s*    ##)>CP*+r$   N)rJ   rK   rL   r  r  r)   r$   r"   r  r    s    +,r$   r  __main__)(__doc__unittestr   r~   r   r  r1   	six.movesr   sysr   r|   r   r   r   r	   r
   facebook_business.adobjectsr   r   r   r   r   r   facebook_business.utilsr   TestCaser   rN   rz   r   r   r   r   r   r   r
  r  rJ   mainr)   r$   r"   <module>r)     s8  *    
 	        3 3 ,Q"X.. Q"hSC8,, SCj4&!2!2 4&nDIX.. DIN
h'' 
@LX.. LBh&7&7 B#
)) #
L
("3"3 
A8,, A,x00 , zHMMO r$   