§
    ¨MºfÏx  ã                   ó\  — d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZmZ dd	lmZmZ d
„ Zej        j        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zej        j        d„ ¦   «         Zej        j        d„ ¦   «         Zej        j        d„ ¦   «         Z ej        j        d„ ¦   «         Z!ej        j        d„ ¦   «         Z"ej        j        d„ ¦   «         Z#ej        j        d„ ¦   «         Z$d„ Z%d„ Z&d„ Z'ej        j        d„ ¦   «         Z(ej        j        d„ ¦   «         Z)d„ Z*dS )aÖ  
Tests of django_plotly_dash.

These tests can be directly used or imported into eg the tests of the demo app.

The use of pytest is assumed.

Copyright (c) 2018 Gibbs Consulting and others - see CONTRIBUTIONS.md

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

é    N)Úpatch)ÚInputÚStateÚOutput©Úreverse)Ú
DjangoDash)Úget_local_stateless_listÚget_local_stateless_by_name)ÚDashAppÚfind_stateless_by_name)Úfill_in_test_appÚdash_contract_datac                  óx   — ddl m}   | d¬¦  «        }|sJ ‚|j        sJ ‚t          |¦  «        |j        k    sJ ‚dS )z:Test the import and formation of the dash app orm wrappersr   ©ÚStatelessAppú	Some name©Úapp_nameN)Údjango_plotly_dash.modelsr   r   Ústr)r   Ústateless_as     úW/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django_plotly_dash/tests.pyÚtest_dash_appr   ,   se   € ð 7Ð6Ð6Ð6Ð6Ð6Ø�,¨Ð4Ñ4Ô4€KàÐÐÐØÔÐÐÐÝˆ{ÑÔ˜{Ô3Ò3Ð3Ð3Ð3Ð3Ð3ó    c                 óæ	  — ddl m} t          d¬¦  «        }t          |d¬¦  «          |d¬¦  «        }|                     ¦   «          t          |dd	d
¬¦  «        }|                     ¦   «          dt          ¦   «         v sJ ‚t          d¦  «        |k    sJ ‚t          d¦  «        |k    sJ ‚| 	                    ¦   «         i k    sJ ‚i ddddœ“ddddœ“ddddœ“ddddœ“ddddœ“ddddœ“ddd dœ“d!d"d#d$d%œ“d&d'd(dœ“d)d*d+dœ“d,d-d.dœ“d/d0d1dœ“d2d3d4dœ“d5d6d7dœ“d8d9d:dœ“d;d<d=dœ“d>d?d@dœ“dAdBdœdCdDdœdEdFdœdGdHdœdIœ¥}| 
                    ¦   «          | 	                    ¦   «         |k    sJ ‚|                     ddJ¦  «        sJ ‚|                     dKdLdMœdN¦  «        sJ ‚|                     d2dN¦  «        sJ ‚|                     dOdP¦  «        rJ ‚|                     dQdRdS¦  «         | 	                    ¦   «         |k    sJ ‚|                     dTdJdU¦  «         dUdHdœ|dT<   | 	                    ¦   «         |k    sJ ‚t
          j                             d¬V¦  «         	                    ¦   «         i k    sJ ‚|                     ¦   «          t
          j                             d¬V¦  «         	                    ¦   «         |k    sJ ‚|                     ¦   «         }|                     ¦   «         }|                     |i ¦  «        \  }}	dW|v sJ ‚|                     |dTdJdXii¦  «        \  }}	dW|vsJ ‚dY|v sJ ‚t'          dZd[d	i¬\¦  «        }
t)          j        t-          j        d]¦  «        ¦  «        D ]Ó}|d^         }|                      |
t)          j        |¦  «        d_¬`¦  «        }|j        dXk    sJ ‚t)          j        |j        ¦  «        }|da         }t;          |t<          ¦  «        r|d         }|db                              ¦   «         d                              ¦   «         d         }||k    sJ ‚|                     ¦   «          ŒÔi dddcdœ“dddddœ“dd'dedœ“ddddœ“ddddœ“ddddœ“ddd dœ“d!dfd#d$d%œ“d&d'd(dœ“d)d*d+dœ“d,d-d.dœ“d/d0d1dœ“d2d<dgdœ“d5d?d7dœ“d8dAd:dœ“d;dCdhdœ“d>dEd@dœ“dGdBdœd*didœdEdFdœd0dHdœdIœ¥}t
          j                             d¬V¦  «         	                    ¦   «         |k    sJ ‚djS )kzbTest the state management of a DashApp as well as the contract between the client and the Dash appr   r   ÚDDash©ÚnameF)Úwriter   r   zmy-appT)Ústateless_appÚinstance_nameÚslugÚsave_on_changeÚinp1l   L™Ý)Ún_clicksÚn_clicks_timestampÚinp1bé   l   N™ÝÚinp2é   l   ÚN™Ýzout1-0é   l   ‚L™Ýzout1-1é   l   æL™Ýzout1-2é   l   JM™Ýzout1-3é   l   ®M™ÝÚout1bzhttp://www.example.com/nullé   l   vN™Ý)Úhrefr&   r'   zout2-0é   l   >O™ÝÚout3é   l   ÎP™ÝÚout4é   l   ^R™ÝÚout5é   l   îS™Ýz{"_id":"inp-0","_type":"btn3"}é	   l   ¢O™Ýz{"_id":"inp-0","_type":"btn4"}é   l   2Q™Ýz{"_id":"inp-0","_type":"btn5"}é   l   ÂR™Ýz{"_id":"inp-1","_type":"btn3"}é
   l   P™Ýz{"_id":"inp-1","_type":"btn4"}é   l   –Q™Ýé   l   &S™Ýé   l   jP™Ýé   l   úQ™Ýé   l   ŠS™Ý)z{"_id":"inp-1","_type":"btn5"}z{"_id":"inp-2","_type":"btn3"}z{"_id":"inp-2","_type":"btn4"}ú{"_id":"inp-2","_type":"btn5"}r&   Úbtn3zinp-0)Ú_typeÚ_idr'   Ú	checklistz
other-propÚfooÚvalueÚrandomrC   éd   )r"   z"n_clicks": 100éÈ   z"n_clicks": 200z'the_django_plotly_dash:update-componentÚident©ÚkwargsÚrÚbodyúapplication/json©Úcontent_typeÚresultÚresponsel   XhHàl   Š Iàl   ¯Iàz$http://www.example.com/1615103033482l   6Iàl   Iàl   IàN) r   r   r	   r   Úsaver   r
   r   r   Úcurrent_stateÚpopulate_valuesÚhave_current_state_entryÚupdate_current_stateÚobjectsÚgetÚhandle_current_stateÚas_dash_instanceÚserve_layoutÚaugment_initial_layoutr   ÚjsonÚloadr   ÚopenÚpostÚdumpsÚstatus_codeÚloadsÚcontentÚ
isinstanceÚlistÚpopitem)Úclientr   Úddashr   Ú
stateful_aÚexpected_stateÚdash_instanceÚrespÚlayoutÚmimetypeÚurlÚscenariorQ   rV   rU   ri   Úfinal_states                    r   Ú&test_dash_stateful_app_client_contractrx   7   si  € ð 7Ð6Ð6Ð6Ð6Ð6õ ˜GÐ$Ñ$Ô$€EÝ�U %Ð(Ñ(Ô(Ð(à�,¨Ð0Ñ0Ô0€KØ×ÒÑÔÐÝ {Ø'2Ø&°tð=ñ =ô =€Jð ‡O‚OÑÔÐð Õ.Ñ0Ô0Ð0Ð0Ð0Ð0Ý& wÑ/Ô/°5Ò8Ð8Ð8Ð8Ý! 'Ñ*Ô*¨eÒ3Ð3Ð3Ð3ð ×#Ò#Ñ%Ô%¨Ò+Ð+Ð+Ð+ð_�f¨1ÀMÐRÐRð _Ø¨AÀ]ÐSÐSð_à¨1ÀMÐRÐRð_ð ¨QÀmÐ TÐ Tð_ð ¨QÀmÐ TÐ Tð	_ð
 ¨QÀmÐ TÐ Tð_ð ¨QÀmÐ TÐ Tð_ð Ð(EØ,-Ø6Cð Eð  Eð_ð ¨QÀmÐ TÐ Tð_ð ¨2À]ÐSÐSð_ð ¨2À]ÐSÐSð_ð ¨2À]ÐSÐSð_ð 7ÀQØO\ð9^ð 9^ð_ð  7ÀRØO\ð9^ð 9^ð!_ð$ 7ÀRØO\ð9^ð 9^ð%_ð( 7ÀRØO\ð9^ð 9^ð)_ð, 7ÀRØO\ð9^ð 9^ð-_ð0 FHØO\ð9^ð 9^àEGØO\ð9^ð 9^àEGØO\ð9^ð 9^àEGØO\ð9^ð 9^ð=_ð _ð _€NðF ×ÒÑ Ô Ð Ø×#Ò#Ñ%Ô%¨Ò7Ð7Ð7Ð7Ø×.Ò.¨v°zÑBÔBÐBÐBÐBØ×.Ò.¸ÈÐ/PÐ/PÐRfÑgÔgÐgÐgÐgØ×.Ò.Ð/OÐQeÑfÔfÐfÐfÐfØ×2Ò2°;ÀÑMÔMÐMÐMÐMð ×#Ò# E¨7°HÑ=Ô=Ð=Ø×#Ò#Ñ%Ô%¨Ò7Ð7Ð7Ð7ð ×#Ò#Ð$DÀjÐRUÑVÔVÐVØDGÐ_lÐ7mÐ7m€NÐ3Ñ4Ø×#Ò#Ñ%Ô%¨Ò7Ð7Ð7Ð7åŒ?×Ò¨[ÐÑ9Ô9×GÒGÑIÔIÈRÒOÐOÐOÐOà×#Ò#Ñ%Ô%Ð%åŒ?×Ò¨[ÐÑ9Ô9×GÒGÑIÔIÈ^Ò[Ð[Ð[Ð[ð ×/Ò/Ñ1Ô1€MØ×%Ò%Ñ'Ô'€Dð %×;Ò;¸DÀ"ÑEÔEÑ€FˆHØ Ð&Ð&Ð&Ð&ð %×;Ò;¸DØ(¨:°sÐ*;ðC=ñ >ô >Ñ€FˆHà FÐ*Ð*Ð*Ð*Ø Ð&Ð&Ð&Ð&õ Ð;ÀWÈhÐDWÐ
XÑ
XÔ
X€Cõ ”IÕ0Ô5°cÑ:Ô:Ñ;Ô;ð *ð *ˆØ˜Ôˆà—;’;˜s¥D¤J¨tÑ$4Ô$4ÐCU�;ÑVÔVˆàÔ# sÒ*Ð*Ð*Ð*å”:˜hÔ.Ñ/Ô/ˆð ˜(Ô#ˆÝ�f�dÑ#Ô#ð 	Ø˜A”YˆFØ˜:Ô&×.Ò.Ñ0Ô0°Ô3×;Ò;Ñ=Ô=¸aÔ@ˆØ˜&Ò Ð Ð Ð ð 	×'Ò'Ñ)Ô)Ð)Ð)ð\�6¨ÀÐOÐOð \Ø¨À-ÐPÐPð\à¨ÀÐOÐOð\ð ¨!À=ÐQÐQð\ð ¨!À=ÐQÐQð	\ð
 ¨!À=ÐQÐQð\ð ¨!À=ÐQÐQð\ð Ð%KØ)*Ø3@ðBð Bð\ð ¨!À=ÐQÐQð\ð ¨À-ÐPÐPð\ð ¨À-ÐPÐPð\ð ¨À-ÐPÐPð\ð 4À"ØLYð6[ð 6[ð\ð  4À"ØLYð6[ð 6[ð!\ð$ 4À"ØLYð6[ð 6[ð%\ð( 4À"ØLYð6[ð 6[ð)\ð, 4À"ØLYð6[ð 6[ð-\ð0 CEØLYð6[ð 6[àBDØLYð6[ð 6[àBDØLYð6[ð 6[àBDØLYð6[ð 6[ð=\ð \ð \€KõB Œ?×Ò¨[ÐÑ9Ô9×GÒGÑIÔIÈ[ÒXÐXÐXÐXÐXÐXr   c                  óª  — t          d¬¦  «        } |                      t          dd¦  «        t          dd¦  «        t          dd¦  «        t          dd¦  «        t          dd¦  «        t	          dd¦  «        ¦  «        d	„ ¦   «         }|                      t          dd¦  «        t          dd¦  «        gt          dd¦  «        t          dd¦  «        t          dd¦  «        gt	          dd¦  «        g¦  «        d
„ ¦   «         }| j        t          dd¦  «        t          dd¦  «        t          dd¦  «        gt          dd¦  «        t          dd¦  «        gdt	          dd¦  «        gdœ|ft          dd¦  «        t          dd¦  «        t          dd¦  «        gt          dd¦  «        t          dd¦  «        gdt	          dd¦  «        gdœ|fgk    sJ ‚dS )zXTest the flexibility of the callback arguments order (handling of inputs/outputs/states)ÚDashCallbackArgumentsr   ÚonerH   ÚtwoÚbazÚthreeÚbilc                  ó   — d S ©N© r‚   r   r   Únewz)test_dash_callback_arguments.<locals>.newÝ   ó	   € ð 	ˆr   c                  ó   — d S r�   r‚   r‚   r   r   Úoldz)test_dash_callback_arguments.<locals>.oldé   r„   r   N)ÚinputsÚoutputÚprevent_initial_callÚstate)r	   Úcallbackr   r   r   Ú_callback_sets)rn   rƒ   r†   s      r   Útest_dash_callback_argumentsr�   Ö   s4  € õ Ð3Ð4Ñ4Ô4€Eð ‡^‚^Ýˆu�eÑÔÝˆu�eÑÔÝˆe�UÑÔÝˆe�UÑÔÝˆg�uÑÔÝˆe�UÑÔñô ðð ñô ðð ‡^‚^Ý	��uÑ	Ô	Ý	��uÑ	Ô	ð	å	ˆu�eÑ	Ô	Ý	ˆu�eÑ	Ô	Ý	ˆw˜Ñ	Ô	ð	 õ 
ˆu�eÑ	Ô	Ðñô ðð ñô ðð Ôµ°u¸eÑ1DÔ1DÝ16°u¸eÑ1DÔ1DÝ16°wÀÑ1FÔ1Fð1Jõ 28¸¸uÑ1EÔ1EÝ17¸¸uÑ1EÔ1Eð1Gà>BÝ05°e¸UÑ0CÔ0CÐ/Fð&Hð &Hð &)ð%*õ 27°u¸eÑ1DÔ1DÝ16°u¸eÑ1DÔ1DÝ16°wÀÑ1FÔ1Fð1Jõ 28¸¸uÑ1EÔ1EÝ17¸¸uÑ1EÔ1Eð1Gà>BÝ05°e¸UÑ0CÔ0CÐ/Fð&Hð &Hð &)ð%*ð$&ò &ð &ð &ð &ð &ð &r   c                 ó$  — d| _         ddlm}m}m}m}  |¦   «         dk    sJ ‚ |¦   «         dk    sJ ‚ |d¦  «        dk    sJ ‚ |¦   «         rJ ‚| `  |¦   «         dk    sJ ‚ |¦   «         dk    sJ ‚ |d¦  «        dk    sJ ‚ |¦   «         rJ ‚dS )z!Test handling of missing settingsNr   )Úpipe_ws_endpoint_nameÚdpd_http_endpoint_rootÚhttp_endpointÚinsert_demo_migrationszdpd/ws/channelz	dpd/viewsÚfredz^dpd/views/fred/$)ÚPLOTLY_DASHÚdjango_plotly_dash.utilr�   r�   r‘   r’   )Úsettingsr�   r�   r‘   r’   s        r   Útest_util_error_casesr—     s  € ð  €HÔà|Ð|Ð|Ð|Ð|Ð|Ð|Ð|Ð|Ð|Ð|Ð|à Ð Ñ"Ô"Ð&6Ò6Ð6Ð6Ð6Ø!Ð!Ñ#Ô# {Ò2Ð2Ð2Ð2Øˆ=˜Ñ Ô Ð$7Ò7Ð7Ð7Ð7Ø%Ð%Ñ'Ô'Ð'Ð'Ð'àÐà Ð Ñ"Ô"Ð&6Ò6Ð6Ð6Ð6Ø!Ð!Ñ#Ô# {Ò2Ð2Ð2Ð2Øˆ=˜Ñ Ô Ð$7Ò7Ð7Ð7Ð7Ø%Ð%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'r   c                  óN   — ddl m} m}  | ¦   «         dk    sJ ‚ |¦   «         sJ ‚dS )z'Test configuration options for the demor   ©r�   r’   z
ws/channelN)r•   r�   r’   r™   s     r   Útest_demo_routingrš     sR   € ð VÐUÐUÐUÐUÐUÐUÐUØ Ð Ñ"Ô" lÒ2Ð2Ð2Ð2Ø!Ð!Ñ#Ô#Ð#Ð#Ð#Ð#Ð#r   c                 óˆ   — ddl m}m}m}  |¦   «         | j        k    sJ ‚ |¦   «         dk    sJ ‚ |dd¦  «        dk    sJ ‚dS )zTest local serve settingsr   )Úserve_locallyÚstatic_asset_rootÚfull_asset_pathz
dpd/assetszfred.jimÚharryzdpd/assets/fred/jim/harryN)r•   rœ   r�   rž   ÚDEBUG)r–   rœ   r�   rž   s       r   Útest_local_servingr¡   #  sz   € ð ZÐYÐYÐYÐYÐYÐYÐYÐYÐYØˆ=‰?Œ?˜hœnÒ,Ð,Ð,Ð,ØÐÑÔ ,Ò.Ð.Ð.Ð.Øˆ?˜: wÑ/Ô/Ð3NÒNÐNÐNÐNÐNÐNr   c                 ój  — ddl m} ddlm} dd|fD ]Q}ddd	ifd
ddiffD ]B\  }} |d|›|›�|¬¦  «        }|                      |¦  «        }|j        sJ ‚|j        dk    sJ ‚ŒCŒRdD ]L}ddd	ifd
ddiffD ]=\  }} |d|›|›�|¬¦  «        }d}	 |                      |¦  «        }n	#  d}Y nxY w|sJ ‚Œ>ŒMdS )ú@Check direct use of a stateless application using demo test datar   r   r,   ©Úmain_view_labelrs   Údependenciesúapp-rM   ÚSimpleExampleÚ úsimpleexample-1úthe_django_plotly_dash:rN   rL   ©ÚroutesFTN©Údjango.urlsr   r   r¥   r]   ri   rg   ©	rm   r   r¥   Ú
route_nameÚprefixÚarg_mapru   rV   Údid_fails	            r   Útest_direct_accessrµ   ,  sr  € ð $Ð#Ð#Ð#Ð#Ð#Ø)Ð)Ð)Ð)Ð)Ð)à °ÐAð /ð /ˆ
Ø!'¨'°/Ð)BÐ CØ!# gÐ.?Ð%@Ð Að Dð 	/ð 	/‰OˆF�Gà�'�'¸6¸6À:À:ÐNÐW^Ð_Ñ_Ô_ˆCà—z’z #‘”ˆHàÔ#Ð#Ð#Ð#ØÔ'¨3Ò.Ð.Ð.Ð.Ð.ð	/ð "ð ð ˆ
Ø!'¨'°/Ð)BÐ CØ!# gÐ.?Ð%@Ð Að Dð 
	ð 
	‰OˆF�Gà�'�'¸6¸6À:À:ÐNÐW^Ð_Ñ_Ô_ˆCàˆHð Ø!Ÿ:š: c™?œ?��øð Ø���øøøàˆOˆOˆOˆOð
	ðð s   ÂB$Â$B*c                 ó   — ddl m} d}dddifdddiffD ]h\  }} |d	|›|›�|¬
¦  «        }|                      |t          j        dddddœddddœgdœ¦  «        d¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚ŒidS )ú-Check updating of an app using demo test datar   r   úupdate-componentr§   rM   r¨   r©   rª   r«   rN   zoutput-size.childrenúdropdown-colorrI   Úblue©ÚidÚpropertyrI   zdropdown-sizeÚmedium©rˆ   r‡   rR   rS   sa   {"response":{"output-size":{"children":"The chosen T-shirt is a medium blue one."}},"multi":true}rL   N)r¯   r   re   rb   rf   ri   rg   )rm   r   r±   r²   r³   ru   rV   s          r   Útest_updatingrÀ   K  s$  € ð $Ð#Ð#Ð#Ð#Ð#à#€Jà# g¨oÐ%>Ð?Ø 'Ð*;Ð!<Ð=ð@ð +ð +‰ˆ�àˆgˆg°v°v¸z¸zÐJÐSZÐ[Ñ[Ô[ˆà—;’;˜s¥D¤JÐ:PØ@PØFMØCIð;Kð ;Kð APØFMØCKð;Mð ;Mð:;ð0<ð 0<ñ %=ô %=ð L^ð ñ _ô _ˆð Ôð  $Hò  Hð  Hð  Hð  HØÔ# sÒ*Ð*Ð*Ð*Ð*ð+ð +r   c                 óV  — ddl m} ddlm} dd|fD ]L}ddd	iffD ]B\  }} |d
|›|›�|¬¦  «        }|                      |¦  «        }|j        sJ ‚|j        dk    sJ ‚ŒCŒMdD ]G}ddd	iffD ]=\  }} |d
|›|›�|¬¦  «        }d}	 |                      |¦  «        }n	#  d}Y nxY w|sJ ‚Œ>ŒHdS )r£   r   r   r,   r¤   rs   r¦   r§   rM   Údash_example_1r«   rN   rL   r¬   FTNr®   r°   s	            r   Útest_injection_app_accessrÃ   d  sV  € ð $Ð#Ð#Ð#Ð#Ð#Ø)Ð)Ð)Ð)Ð)Ð)à °ÐAð 	/ð 	/ˆ
Ø!'¨'Ð2BÐ)CÐ Dð  !ð 	/ð 	/‰OˆF�Gð �'�'¸6¸6À:À:ÐNÐW^Ð_Ñ_Ô_ˆCà—z’z #‘”ˆHàÔ#Ð#Ð#Ð#ØÔ'¨3Ò.Ð.Ð.Ð.Ð.ð	/ð "ð 
ð 
ˆ
Ø!'¨'Ð2BÐ)CÐ DÐFð 		ð 		‰OˆF�GØ�'�'¸6¸6À:À:ÐNÐW^Ð_Ñ_Ô_ˆCàˆHð Ø!Ÿ:š: c™?œ?��øð Ø���øøøàˆOˆOˆOˆOð		ð
ð 
s   ÂBÂB c                 óœ  — ddl m} d}dddiffD ]»\  }} |d|›|›�|¬¦  «        }|                      |t          j        d	d
dddœddddœgdœ¦  «        d¬¦  «        }|j        dk    sJ ‚t          j        |j                             d¦  «        ¦  «        }d|v sJ ‚|d         }d|v sJ ‚d|d         v sJ ‚|d         d         dk    sJ ‚Œ¼dS )zDCheck updating of an app using demo test data for multiple callbacksr   r   r¸   r§   rM   Úmultiple_callbacksr«   rN   zE..output-one.children...output-two.children...output-three.children..Úbuttonr&   Ú10r»   r¹   rI   z.purple-ish yellow with a hint of greeny oranger¿   rR   rS   rL   úutf-8rV   ú
output-twoÚchildrenz>Output 2: 10 purple-ish yellow with a hint of greeny orange []N©	r¯   r   re   rb   rf   rg   rh   ri   Údecode)	rm   r   r±   r²   r³   ru   rV   rr   Úresp_details	            r   Ú*test_injection_updating_multiple_callbacksrÎ   „  ss  € ð $Ð#Ð#Ð#Ð#Ð#à#€Jà# gÐ.BÐ%CÐDÐFð yð y‰ˆ�Øˆgˆg°v°v¸z¸zÐJÐSZÐ[Ñ[Ô[ˆð —;’;˜s¥D¤Jð  :AàØ"Øðð ð #ØØEðGð Gð	:;ð0<ð 0<ñ %=ô %=ð L^ð ñ _ô _ˆð Ô# sÒ*Ð*Ð*Ð*åŒz˜(Ô*×1Ò1°'Ñ:Ô:Ñ;Ô;ˆØ˜TÐ!Ð!Ð!Ð!à˜:Ô&ˆØ˜{Ð*Ð*Ð*Ð*Ø˜[¨Ô6Ð6Ð6Ð6Ð6Ø˜<Ô(¨Ô4Ð8xÒxÐxÐxÐxÐxð-yð yr   c                 ó\  — ddl m} d}dddiffD �]š\  }} |d|›|›�|¬¦  «        }|                      |t          j        d	d
dddœgdœ¦  «        d¬¦  «        }|j        dk    sJ ‚t          j        |j                             d¦  «        ¦  «        }dD ]}||d         d         d         v sJ ‚Œ|                      |t          j        dd
dddœgdœ¦  «        d¬¦  «        }|j        dk    sJ ‚t          j        |j                             d¦  «        ¦  «        }|d         dddiik    sJ ‚|                      |t          j        dd
dddœgdœ¦  «        d¬¦  «        }|j        dk    sJ ‚t          j        |j                             d¦  «        ¦  «        }|d         dddiik    sJ ‚�ŒœdS )zMCheck updating of an app using demo test data for flexible expanded callbacksr   r   r¸   r§   rM   Úflexible_expanded_callbacksr«   rN   zoutput-one.childrenrÆ   r&   rÇ   r»   r¿   rR   rS   rL   rÈ   )Údash_app_idÚdash_appÚcallback_contextrV   z
output-onerÊ   zoutput-two.childrenrÉ   Úokzoutput-three.childrenzoutput-threeNrË   )	rm   r   r±   r²   r³   ru   rV   rr   Úkeys	            r   Ú test_flexible_expanded_callbacksrÖ   ¥  s�  € ð $Ð#Ð#Ð#Ð#Ð#à#€Jà# gÐ.KÐ%LÐMÐOð *_ñ *_‰ˆ�Øˆgˆg°v°v¸z¸zÐJÐSZÐ[Ñ[Ô[ˆð —;’;˜s¥D¤JÐ9NàØ"Øðð ð:;ð0<ð 0<ñ %=ô %=ð
 L^ð ñ _ô _ˆð Ô# sÒ*Ð*Ð*Ð*åŒz˜(Ô*×1Ò1°'Ñ:Ô:Ñ;Ô;ˆØBð 	Eð 	EˆCØ˜$˜zÔ*¨<Ô8¸ÔDÐDÐDÐDÐDÐDð —;’;˜s¥D¤JÐ9NàØ"Øðð ð:;ð0<ð 0<ñ %=ô %=ð
 L^ð ñ _ô _ˆð Ô# sÒ*Ð*Ð*Ð*åŒz˜(Ô*×1Ò1°'Ñ:Ô:Ñ;Ô;ˆØ�JÔ ,°¸TÐ0BÐ!CÒCÐCÐCÐCð —;’;˜s¥D¤JÐ9PàØ"Øðð ð:;ð0<ð 0<ñ %=ô %=ð
 L^ð ñ _ô _ˆð Ô# sÒ*Ð*Ð*Ð*åŒz˜(Ô*×1Ò1°'Ñ:Ô:Ñ;Ô;ˆØ�JÔ .°:Ð?\Ð2]Ð!^Ò^Ð^Ð^Ð^Ñ^ðU*_ð *_r   c                 ó"  — ddl m} d}dddiffD �]ý\  }} |d|›|›�|¬¦  «        }|                      |t          j        d	d
dddœgdœ¦  «        d¬¦  «        }d}|j                             |¦  «        sJ ‚|j        dk    sJ ‚|                      |t          j        d	d
dddœgdœ¦  «        d¬¦  «        }d}|j                             |¦  «        sJ ‚|j        dk    sJ ‚t          j	        t          d¬¦  «        5  |                      |t          j        dd
dddœgdœ¦  «        d¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j	        t          d¬¦  «        5  |                      |t          j        dd
dddœgdœ¦  «        d¬¦  «         ddd¦  «         n# 1 swxY w Y   |                      |t          j        dd
dddœgdœ¦  «        d¬¦  «        }d}|j                             |¦  «        sJ ‚|j        dk    sJ ‚t          j	        t          d¬¦  «        5  |                      |t          j        dddddœgdœ¦  «        d¬¦  «         ddd¦  «         n# 1 swxY w Y   | j        }ddi|d<   |                     ¦   «          |                      |t          j        dddddœgdœ¦  «        d¬¦  «        }d}|j                             |¦  «        sJ ‚|j        dk    sJ ‚|j                             d¦  «        dk    sJ ‚�ŒÿdS ) r·   r   r   r¸   r§   rM   rÂ   r«   rN   ztest-output-div.childrenzmy-dropdown1rI   ÚTestItr»   r¿   rR   rS   sM   {"response":{"test-output-div":{"children":[{"props":{"id":"line-area-graph2"rL   z..test-output-div.children..)ÚmatchNztest-output-div3.childrenz..test-output-div3.children..sN   {"response":{"test-output-div3":{"children":[{"props":{"id":"line-area-graph2"Údjango_to_dash_contextztest-output-div2.childrenzmy-dropdown2zTest 789 contentÚdjango_plotly_dashsM   {"response":{"test-output-div2":{"children":[{"props":{"children":["You have s   Test 789 content)r¯   r   re   rb   rf   ri   Ú
startswithrg   ÚpytestÚraisesÚKeyErrorÚsessionrW   Úfind)	rm   r   r±   r²   r³   ru   rV   ÚrStartrà   s	            r   Útest_injection_updatingrã   Ú  sŒ  € ð $Ð#Ð#Ð#Ð#Ð#à#€Jà# gÐ.>Ð%?Ð@ÐBð M>ñ M>‰ˆ�Øˆgˆg°v°v¸z¸zÐJÐSZÐ[Ñ[Ô[ˆà—;’;˜s¥D¤JØ:TØ@NØFMØCKð;Mð ;Mð :;ð0<ð 0<ñ %=ô %=ð
 L^ð ñ _ô _ˆð bˆàÔ×*Ò*¨6Ñ2Ô2Ð2Ð2Ð2ØÔ# sÒ*Ð*Ð*Ð*ð —;’;˜s¥D¤JÐ9SØ@NØFMØCKð;Mð ;Mð :;ð0<ð 0<ñ %=ô %=ð L^ð	 ñ _ô _ˆð bˆàÔ×*Ò*¨6Ñ2Ô2Ð2Ð2Ð2ØÔ# sÒ*Ð*Ð*Ð*õ Œ]�8Ð+IÐJÑJÔJð 	_ð 	_Ø�KŠK˜�TœZÐ2PØ@NØFMØCKð;Mð ;Mð :;ð)<ð )<ñ =ô =ð L^ð	 ñ _ô _ð _ð	_ð 	_ð 	_ñ 	_ô 	_ð 	_ð 	_ð 	_ð 	_ð 	_ð 	_øøøð 	_ð 	_ð 	_ð 	_õ Œ]�8Ð+FÐGÑGÔGð 	_ð 	_Ø�KŠK˜�TœZÐ2MØ@NØFMØCKð;Mð ;Mð :;ð)<ð )<ñ =ô =ð L^ð	 ñ _ô _ð _ð	_ð 	_ð 	_ñ 	_ô 	_ð 	_ð 	_ð 	_ð 	_ð 	_ð 	_øøøð 	_ð 	_ð 	_ð 	_ð —;’;˜s¥D¤JÐ9XØ@NØFMØCKð;Mð ;Mð :;ð0<ð 0<ñ %=ô %=ð L^ð	 ñ _ô _ˆð cˆàÔ×*Ò*¨6Ñ2Ô2Ð2Ð2Ð2ØÔ# sÒ*Ð*Ð*Ð*åŒ]�8Ð+CÐDÑDÔDð 	Xð 	XØ�KŠK˜�TœZÐ3NØ9GØ?FØ<Dð4Fð 4Fð 34ð)5ð )5ñ 6ô 6ð EWð	 ñ Xô Xð Xð	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xð ”.ˆØ)AÐCUÐ(VˆÐ$Ñ%Ø�Š‰Œˆà—;’;˜s¥D¤JÐ:UØAOØGNØDLð<Nð <Nð ;<ð0=ð 0=ñ %>ô %>ð M_ð	 ñ `ô `ˆð
 bˆàÔ×*Ò*¨6Ñ2Ô2Ð2Ð2Ð2ØÔ# sÒ*Ð*Ð*Ð*àÔ×$Ò$Ð%8Ñ9Ô9¸AÒ=Ð=Ð=Ð=Ñ=ð[M>ð M>s6   Ã=3D<Ä<E 	ÅE 	Å"3F!Æ!F%	Æ(F%	È$3I#É#I'	É*I'	c                 óº  — ddl m}m}m}  |¦   «         sJ ‚ddi| _         |¦   «         sJ ‚ddi} |d|¦  «        }t          |¦  «        dk    sJ ‚ |d|¦  «        }||k    sJ ‚dd	i| _         |¦   «         rJ ‚ |||¦  «        }t          |¦  «        dk    sJ ‚||k    sJ ‚ |dd¦  «        �J ‚ |dd¦  «        �J ‚ ||d¦  «        �J ‚ ||d¦  «        �J ‚dS )
z[Test the setting that controls how initial arguments are propagated through to the dash appr   )Úinitial_argument_locationÚstore_initial_argumentsÚget_initial_argumentsÚcache_argumentsTÚtestÚfirstNr=   F)r•   rå   ræ   rç   r”   Úlen)	r–   rm   rå   ræ   rç   Ú
test_valueÚcache_idÚfetchedÚ	cache_id2s	            r   Útest_argument_settingsrð   2  sx  € ð rÐqÐqÐqÐqÐqÐqÐqÐqÐqà$Ð$Ñ&Ô&Ð&Ð&Ð&à-¨tÐ4€HÔà$Ð$Ñ&Ô&Ð&Ð&Ð&à˜Ð!€Jà&Ð& t¨ZÑ8Ô8€Håˆx‰=Œ=˜2ÒÐÐÐà#Ð# D¨(Ñ3Ô3€Gà�jÒ Ð Ð Ð à-¨uÐ5€HÔà(Ð(Ñ*Ô*Ð*Ð*Ð*à'Ð'¨°
Ñ;Ô;€Iåˆy‰>Œ>˜BÒÐÐÐà�yÒ Ð Ð Ð ð #Ð" 4¨Ñ.Ô.Ð6Ð6Ð6Ø Ð   tÑ,Ô,Ð4Ð4Ð4Ø"Ð" 6¨4Ñ0Ô0Ð8Ð8Ð8Ø Ð  ¨Ñ.Ô.Ð6Ð6Ð6Ð6Ð6r   c                  ó¨   — ddl m}   | ¦   «         }|€J ‚t          j        t          ¦  «        5   |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zTest no-op stateless lookupr   )Ústateless_app_lookup_hookNz
not an app)r•   rò   rÝ   rÞ   ÚImportError)rò   Úlh_hooks     r   Útest_stateless_lookup_nooprõ   \  sµ   € ð BÐAÐAÐAÐAÐAØ'Ð'Ñ)Ô)€GàÐÐÐÝ	Œ•{Ñ	#Ô	#ð ð Øˆ�ÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ®AÁAÁAc                  ó  — ddl m} m}  | ¦   «         }|                     d¦  «         |                     d¦  «         |                     d¦  «         |j        dk    sJ ‚ |¦   «         }|                     d¦  «        dk    sJ ‚dS )	z.Import and vaguely exercise middleware objectsr   )ÚEmbeddedHolderÚContentCollectorÚsome_cssÚsome_configÚsome_scriptsr“   s   fredN)Údjango_plotly_dash.middlewarer÷   rø   Úadd_cssÚ
add_configÚadd_scriptsÚconfigÚ_encode)r÷   rø   ÚehÚccs       r   Útest_middleware_artifactsr  g  s¤   € ð OÐNÐNÐNÐNÐNÐNÐNà	ˆÑ	Ô	€BØ‡J‚JˆzÑÔÐØ‡M‚M�-Ñ Ô Ð Ø‡N‚N�>Ñ"Ô"Ð"àŒ9˜Ò%Ð%Ð%Ð%à	Ð	Ñ	Ô	€Bà�:Š:�fÑÔ Ò(Ð(Ð(Ð(Ð(Ð(r   c                  ón   — ddl m} m}m}  | ¦   «         } |¦   «         } |¦   «         }|€J ‚|€J ‚|€J ‚dS )z/Import and vaguely exercise staticfiles findersr   )ÚDashComponentFinderÚDashAppDirectoryFinderÚDashAssetFinderN)Údjango_plotly_dash.findersr  r  r  )r  r  r  ÚdcfÚdadfÚdafs         r   Útest_findersr  x  sn   € ð hÐgÐgÐgÐgÐgÐgÐgÐgÐgà
Ð
Ñ
Ô
€CØ!Ð!Ñ#Ô#€DØ
ˆ/Ñ
Ô
€Càˆ?ˆ?ˆ?ØÐÐÐØˆ?ˆ?ˆ?ˆ?ˆ?r   c                 óŽ   — ddl m} ddlm}  |¦   «          	  |d¦  «        }|                      |¦  «        }|j        dk    sJ ‚d S )Nr   )Úcheck_stateless_loadedr   Tz)the_django_plotly_dash:add_stateless_appsi.  )r   r  r¯   r   re   rg   )rm   r  r   ru   rV   s        r   Útest_app_loadingr  †  sz   € ð AÐ@Ð@Ð@Ð@Ð@Ø#Ð#Ð#Ð#Ð#Ð#ð ÐÑÔÐØà
ˆ'Ð=Ñ
>Ô
>€Cà�{Š{˜3ÑÔ€Hð Ô 3Ò&Ð&Ð&Ð&Ð&Ð&r   c                 óH  — ddl m} |                     ¦   «         }t          j        |d¦  «        5 }|                     ¦   «          ddd¦  «         n# 1 swxY w Y   |j        \  }}d|d         v sJ ‚d|d         v sJ ‚d|d	         v sJ ‚d
|d	         v sJ ‚d|d	         v sJ ‚dS )z@Check external_stylesheets and external_scripts ends up in indexr   )Úexternal_scripts_stylesheetsÚinterpolate_indexNz*https://codepen.io/chriddyp/pen/bWLwgP.cssÚcsszHhttps://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.cssz-https://www.google-analytics.com/analytics.jsÚscriptsz*https://cdn.polyfill.io/v2/polyfill.min.jszGhttps://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.core.js)Údemo.plotly_appsr  r_   r   ÚobjectÚindexÚ	call_args)rm   r  ÚdashÚmockÚ_rO   s         r   Ú!test_external_scripts_stylesheetsr  ˜  s  € ð >Ð=Ð=Ð=Ð=Ð=Ø'×8Ò8Ñ:Ô:€Då	Œ�dÐ/Ñ	0Ô	0ð °DØ�
Š
‰Œˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ”�I€A€vØ7¸6À%¼=ÐHÐHÐHÐHØUÐY_Ð`eÔYfÐfÐfÐfÐfØ:¸fÀYÔ>OÐOÐOÐOÐOØ7¸6À)Ô;LÐLÐLÐLÐLØTÐX^Ð_hÔXiÐiÐiÐiÐiÐiÐis   °AÁAÁAc                  ó>  — t          dd¦  «        t          dd¦  «        g} t          dd¦  «        t          dd¦  «        g}d„ }t          j        || |¦  «        g k    sJ ‚d„ }t          j        || |¦  «        dgk    sJ ‚d	„ }t          j        || |¦  «        g k    sJ ‚d
„ }t          j        || |¦  «        dgk    sJ ‚d„ }t          j        || |¦  «        dgk    sJ ‚d„ }t          j        || |¦  «        d k    sJ ‚d„ }t          j        || |¦  «        d k    sJ ‚d S )Nr{   rI   r|   r~   Úfourc                 ó   — d S r�   r‚   )r{   r|   r~   r  s       r   Úcallback_standardz2test_callback_decorator.<locals>.callback_standard±  ó   € Øˆr   c                 ó   — d S r�   r‚   )r{   r|   r~   r  Úextra_1s        r   r!  z2test_callback_decorator.<locals>.callback_standard¶  r"  r   r$  c                 ó   — d S r�   r‚   )r{   Úargss     r   Úcallback_argsz.test_callback_decorator.<locals>.callback_args»  r"  r   c                ó   — d S r�   r‚   )r{   r$  r&  s      r   Úcallback_args_extraz4test_callback_decorator.<locals>.callback_args_extraÀ  r"  r   c                ó   — d S r�   r‚   )r{   r$  s     r   Úcallback_args_extra_starz9test_callback_decorator.<locals>.callback_args_extra_starÅ  r"  r   c                 ó   — d S r�   r‚   ©r{   r|   r~   r  r$  rO   s         r   Úcallback_kwargsz0test_callback_decorator.<locals>.callback_kwargsË  r"  r   c                ó   — d S r�   r‚   r-  s         r   r.  z0test_callback_decorator.<locals>.callback_kwargsÐ  r"  r   )r   r	   Úget_expanded_arguments)r‡   Ústatesr!  r'  r)  r+  r.  s          r   Útest_callback_decoratorr2  ©  s¶  € Ý�E˜7Ñ#Ô#Ý�E˜7Ñ#Ô#ð€Fõ �G˜WÑ%Ô%Ý�F˜GÑ$Ô$ð€Fðð ð õ Ô,Ð->ÀÈÑOÔOÐSUÒUÐUÐUÐUðð ð õ Ô,Ð->ÀÈÑOÔOÐT]ÐS^Ò^Ð^Ð^Ð^ðð ð õ Ô,¨]¸FÀFÑKÔKÈrÒQÐQÐQÐQðð ð õ Ô,Ð-@À&È&ÑQÔQÐV_ÐUaÒaÐaÐaÐaðð ð õ Ô,Ð-EÀvÈvÑVÔVÐ[dÐZfÒfÐfÐfÐfðð ð õ Ô,¨_¸fÀfÑMÔMÐQUÒUÐUÐUÐUðð ð õ Ô,¨_¸fÀfÑMÔMÐQUÒUÐUÐUÐUÐUÐUr   )+Ú__doc__rb   Úunittest.mockr   rÝ   Údash.dependenciesr   r   r   r¯   r   rÛ   r	   Údjango_plotly_dash.dash_wrapperr
   r   r   r   r   Ú&django_plotly_dash.tests_dash_contractr   r   r   ÚmarkÚ	django_dbrx   r�   r—   rš   r¡   rµ   rÀ   rÃ   rÎ   rÖ   rã   rð   rõ   r  r  r  r  r2  r‚   r   r   ú<module>r:     sº  ððð ð: €€€Ø Ð Ð Ð Ð Ð à €€€à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )Ø aÐ aÐ aÐ aÐ aÐ aÐ aÐ aØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ WÐ WÐ WÐ WÐ WÐ WÐ WÐ Wð4ð 4ð 4ð „ÔðZYð ZYñ ÔðZYð|.&ð .&ð .&ðb(ð (ð (ð($ð $ð $ðOð Oð Oð „Ôðð ñ Ôðð< „Ôð+ð +ñ Ôð+ð0 „Ôðð ñ Ôðð> „Ôðyð yñ Ôðyð@ „Ôð1_ð 1_ñ Ôð1_ðh „ÔðT>ð T>ñ ÔðT>ðn „Ôð&7ð &7ñ Ôð&7ðRð ð ð)ð )ð )ð"ð ð ð „Ôð'ð 'ñ Ôð'ð" „Ôðjð jñ Ôðjð *Vð *Vð *Vð *Vð *Vr   