1- import idom
2-
1+ import time
2+ from io import StringIO
33from queue import Queue
4+ from threading import Event
5+
6+ import pytest
7+ import idom
8+ from selenium .webdriver .common .keys import Keys
49
510from .driver_utils import send_keys
611
@@ -35,6 +40,7 @@ async def on_click(event):
3540 button .click ()
3641 driver .find_element_by_id ("complete" )
3742
43+ # we care what happens in the final delete when there's no value
3844 assert clicked .get ()
3945
4046
@@ -135,10 +141,10 @@ async def outer_click_is_not_triggered():
135141 inner .click ()
136142
137143
138- def test_input (driver , driver_wait , display , driver_get ):
144+ def test_input (driver , driver_wait , display ):
139145 inp = idom .Input ("text" , "initial-value" , {"id" : "inp" })
140146
141- display (lambda : inp )
147+ display (inp )
142148
143149 client_inp = driver .find_element_by_id ("inp" )
144150 assert client_inp .get_attribute ("value" ) == "initial-value"
@@ -152,13 +158,103 @@ def test_input(driver, driver_wait, display, driver_get):
152158 driver_wait .until (lambda dvr : client_inp .get_attribute ("value" ) == "new-value-2" )
153159
154160
155- def test_image (driver , driver_wait , display ):
161+ def test_input_server_side_update (driver , driver_wait , display ):
162+ @idom .element
163+ async def UpdateImmediately (self ):
164+ inp = idom .Input ("text" , "initial-value" , {"id" : "inp" })
165+ inp .update ("new-value" )
166+ return inp
167+
168+ display (UpdateImmediately )
169+
170+ client_inp = driver .find_element_by_id ("inp" )
171+ driver_wait .until (lambda drv : client_inp .get_attribute ("value" ) == "new-value" )
172+
173+
174+ def test_input_cast_and_ignore_empty (driver , driver_wait , display ):
175+ # ignore empty since that's an invalid float
176+ change_occured = Event ()
177+
178+ inp = idom .Input ("number" , 1 , {"id" : "inp" }, cast = float , ignore_empty = True )
179+
180+ @inp .events .on ("change" )
181+ async def on_change (event ):
182+ change_occured .set ()
183+
184+ display (inp )
185+
186+ client_inp = driver .find_element_by_id ("inp" )
187+ assert client_inp .get_attribute ("value" ) == "1"
188+
189+ send_keys (client_inp , Keys .BACKSPACE )
190+ time .sleep (0.1 ) # waiting and deleting again seems to decrease flakiness
191+ send_keys (client_inp , Keys .BACKSPACE )
192+
193+ assert change_occured .wait (timeout = 3.0 )
194+ assert client_inp .get_attribute ("value" ) == ""
195+ # change ignored server side
196+ assert inp .value == 1
197+
198+ send_keys (client_inp , "2" )
199+ driver_wait .until (lambda drv : inp .value == 2 )
200+
201+
202+ def test_image_from_string (driver , driver_wait , display ):
156203 src = """
157204 <svg width="400" height="110" xmlns="http://www.w3.org/2000/svg">
158205 <rect width="300" height="100" style="fill:rgb(0,0,255);" />
159206 </svg>
160207 """
161- img = idom .Image ("svg" , src , {"id" : "a-circle" })
208+ img = idom .Image ("svg" , src , {"id" : "a-circle-1 " })
162209 display (img )
163- client_img = driver .find_element_by_id ("a-circle" )
210+ client_img = driver .find_element_by_id ("a-circle-1" )
211+ assert img .base64_source in client_img .get_attribute ("src" )
212+
213+ img2 = idom .Image ("svg" , attributes = {"id" : "a-circle-2" })
214+ img2 .io .write (src )
215+ display (img2 )
216+ client_img = driver .find_element_by_id ("a-circle-2" )
164217 assert img .base64_source in client_img .get_attribute ("src" )
218+
219+
220+ def test_image_from_bytes (driver , driver_wait , display ):
221+ src = b"""
222+ <svg width="400" height="110" xmlns="http://www.w3.org/2000/svg">
223+ <rect width="300" height="100" style="fill:rgb(0,0,255);" />
224+ </svg>
225+ """
226+ img = idom .Image ("svg" , src , {"id" : "a-circle-1" })
227+ display (img )
228+ client_img = driver .find_element_by_id ("a-circle-1" )
229+ assert img .base64_source in client_img .get_attribute ("src" )
230+
231+ img2 = idom .Image ("svg" , attributes = {"id" : "a-circle-2" })
232+ img2 .io .write (src )
233+ display (img2 )
234+ client_img = driver .find_element_by_id ("a-circle-2" )
235+ assert img .base64_source in client_img .get_attribute ("src" )
236+
237+
238+ def test_module_cannot_have_source_and_install ():
239+ with pytest .raises (ValueError , match = r"Both .* were given." ):
240+ idom .Module ("something" , install = "something" , source = StringIO ())
241+
242+
243+ def test_module_deleteion ():
244+ # also test install
245+ jquery = idom .Module ("jquery" , install = "jquery@3.5.0" )
246+ assert idom .client .web_module_exists (jquery .name )
247+ with idom .client .web_module_path (jquery .name ).open () as f :
248+ assert "jQuery JavaScript Library v3.5.0" in f .read ()
249+ jquery .delete ()
250+ assert not idom .client .web_module_exists (jquery .name )
251+
252+
253+ def test_module_from_url ():
254+ url = "https://code.jquery.com/jquery-3.5.0.js"
255+ jquery = idom .Module (url )
256+ assert jquery .url == url
257+ with pytest .raises (ValueError , match = "Module is not installed locally" ):
258+ jquery .name
259+ with pytest .raises (ValueError , match = "Module is not installed locally" ):
260+ jquery .delete ()
0 commit comments