import re import subprocess from functools import partial from percy import percySnapshot from selenium.webdriver import Chrome import pywebio import template import util from pywebio import start_server from pywebio.input import * from pywebio.output import * from pywebio.platform import seo from pywebio.session import * from pywebio.utils import * def target(): # test session data g = data() assert g.none is None g.one = 1 g.one += 1 assert g.one == 2 local.name = "Wang" local.age = 22 assert len(local) == 3 assert local['age'] is local.age assert local.foo is None local[10] = "10" del local['name'] del local.one for key in local: print(key) assert 'bar' not in local assert 'age' in local assert local._dict == {'age': 22, 10: '10'} print(local) # test eval_js promise import random val = random.randint(1, 9999999) promise_res = yield eval_js('''new Promise((resolve,reject) => { setTimeout(() => { resolve(val); }, 1); });''', val=val) print(promise_res, val) assert promise_res == val # test pywebio.utils async def corofunc(**kwargs): pass def genfunc(**kwargs): yield corofunc = partial(corofunc, a=1) genfunc = partial(genfunc, a=1) assert isgeneratorfunction(genfunc) assert iscoroutinefunction(corofunc) assert get_function_name(corofunc) == 'corofunc' get_free_port() try: yield put_buttons([{'label': 'must not be shown'}], onclick=[lambda: None]) except Exception: pass put_table([ ['Idx', 'Actions'], ['1', put_buttons(['edit', 'delete'], onclick=lambda _: None)], ]) popup('title', 'text content') @popup('Popup title') def show_popup(): put_html('

Popup Content

') put_text('html:
') with popup('Popup title') as s: put_html('

Popup Content

') clear(s) put_buttons(['clear()'], onclick=lambda _: clear(s)) popup('title2', 'text content') close_popup() with use_scope() as name: put_text('no show') remove(name) with use_scope('test') as name: put_text('current scope name:%s' % name) with use_scope('test', clear=True): put_text('clear previous scope content') @use_scope('test') def scoped_func(text): put_text(text) scoped_func('text1 from `scoped_func`') scoped_func('text2 from `scoped_func`') put_tabs([ {'title': 'Text', 'content': 'Hello world'}, {'title': 'Markdown', 'content': put_markdown('~~Strikethrough~~')}, {'title': 'More content', 'content': [ put_table([ ['Commodity', 'Price'], ['Apple', '5.5'], ['Banana', '7'], ]), put_link('pywebio', 'https://github.com/wang0618/PyWebIO') ]}, ]) try: put_column([put_text('A'), 'error']) except Exception: pass toast('Awesome PyWebIO!!', duration=0) def show_msg(): put_text("ToastClicked") toast('You have new messages', duration=0, onclick=show_msg) run_js("$('.toastify').eq(0).click()") assert get_scope() == 'ROOT' with use_scope('go_app'): put_buttons(['Go thread App'], [lambda: go_app('threadbased', new_window=False)]) # test unhandled error with use_scope('error'): put_buttons(['Raise error'], [lambda: 1 / 0]) put_image('/static/favicon_open_32.png') with put_info(): put_table([ ['Commodity', 'Price'], ['Apple', '5.5'], ['Banana', '7'], ]) put_markdown('~~Strikethrough~~') put_file('hello_word.txt', b'hello word!') with put_collapse('title', open=True): put_table([ ['Commodity', 'Price'], ['Apple', '5.5'], ['Banana', '7'], ]) with put_collapse('title', open=True): put_table([ ['Commodity', 'Price'], ['Apple', '5.5'], ['Banana', '7'], ]) put_markdown('~~Strikethrough~~') put_file('hello_word.txt', b'hello word!') yield input_group('test input popup', [ input('username', name='user'), actions('', ['Login', 'Register', 'Forget'], name='action') ]) @seo("corobased-session", 'This is corobased-session test') async def corobased(): await wait_host_port(port=8080, host='127.0.0.1') async def bg_task(): while 1: await asyncio.sleep(1) run_async(bg_task()) await to_coroutine(target()) def threadbased(): """threadbased-session This is threadbased-session test """ port = get_free_port() print('free port', port) run_as_function(target()) def test(server_proc: subprocess.Popen, browser: Chrome): time.sleep(2) coro_out = template.save_output(browser)[-1] # browser.get('http://localhost:8080/?app=thread') browser.execute_script("arguments[0].click();", browser.find_element_by_css_selector('#pywebio-scope-go_app button')) time.sleep(2) thread_out = template.save_output(browser)[-1] assert "ToastClicked" in coro_out # Eliminate the effects of put_tabs assert re.sub(r'"webio-.*?"', '', coro_out) == re.sub(r'"webio-.*?"', '', thread_out) browser.execute_script("WebIO._state.CurrentSession.ws.close()") time.sleep(6) browser.execute_script("arguments[0].click();", browser.find_element_by_css_selector('#pywebio-scope-error button')) browser.execute_script("$('button[type=submit]').click();") time.sleep(2) percySnapshot(browser, name='misc') def start_test_server(): pywebio.enable_debug() start_server([corobased, partial(threadbased)], port=8080, host='127.0.0.1', debug=True, cdn=False, static_dir=STATIC_PATH + '/image', reconnect_timeout=10) if __name__ == '__main__': util.run_test(start_test_server, test, address='http://localhost:8080/?app=corobased')