""" Test HTML snippet generation. """ from selenium.webdriver.common.keys import Keys from vasl_templates.webapp.tests.utils import \ init_webapp, select_tab, set_template_params, wait_for_clipboard, \ get_stored_msg, set_stored_msg_marker, find_child, adjust_html, \ for_each_template, add_simple_note, edit_simple_note, \ get_sortable_entry_count, generate_sortable_entry_snippet, drag_sortable_entry_to_trash # --------------------------------------------------------------------- def test_scenario_snippets( webapp, webdriver ): """Test HTML snippet generation.""" # initialize init_webapp( webapp, webdriver ) select_tab( "scenario" ) btn = find_child( "button.generate[data-id='scenario']" ) # generate a SCENARIO snippet _test_snippet( btn, { "SCENARIO_NAME": "my cool scenario", "SCENARIO_LOCATION": "right here", "SCENARIO_DATE": "01/02/1942", }, 'name = [my cool scenario] | loc = [right here] | date = [01/02/1942] aka "2 January, 1942"', None ) # generate a SCENARIO snippet with some fields missing _test_snippet( btn, { "SCENARIO_NAME": "my scenario", "SCENARIO_LOCATION": None, "SCENARIO_DATE": None, }, "name = [my scenario] | loc = [] | date = []", [ "scenario date" ], ) # generate a SCENARIO snippet with all fields missing _test_snippet( btn, { "SCENARIO_NAME": None, "SCENARIO_LOCATION": None, "SCENARIO_DATE": None, }, "name = [] | loc = [] | date = []", [ "scenario name", "scenario date" ], ) # generate a SCENARIO snippet with a snippet width _test_snippet( btn, { "SCENARIO_NAME": "test", "SCENARIO_LOCATION": "here", "SCENARIO_DATE": "01/02/1942", "SCENARIO_WIDTH": "20em", }, 'name = [test] | loc = [here] | date = [01/02/1942] aka "2 January, 1942" | width = [20em]', None ) # generate a SCENARIO snippet with non-English content and HTML special characters _test_snippet( btn, { "SCENARIO_NAME": " & ", "SCENARIO_LOCATION": "japan (\u65e5\u672c)", "SCENARIO_DATE": "01/02/1942", "SCENARIO_WIDTH": "", }, 'name = [ & ] | loc = [japan (\u65e5\u672c)] | date = [01/02/1942] aka "2 January, 1942"', None ) # --------------------------------------------------------------------- def test_vc_snippets( webapp, webdriver ): """Test HTML snippet generation.""" # initialize init_webapp( webapp, webdriver ) select_tab( "scenario" ) btn = find_child( "button.generate[data-id='victory_conditions']" ) # generate a VC snippet _test_snippet( btn, { "VICTORY_CONDITIONS": "Kill 'Em All!", }, "VC: [Kill 'Em All!]", None ) # generate an empty VC snippet _test_snippet( btn, { "VICTORY_CONDITIONS": "", }, "VC: []", None ) # generate a VC snippet with a width _test_snippet( btn, { "VICTORY_CONDITIONS": "Kill 'Em All!", "VICTORY_CONDITIONS_WIDTH": "100px", }, "VC: [Kill 'Em All!] ; width=[100px]", None ) # --------------------------------------------------------------------- def test_scenario_notes_snippets( webapp, webdriver ): """Test HTML snippet generation.""" # initialize init_webapp( webapp, webdriver ) select_tab( "scenario" ) sortable = find_child( "#scenario_notes-sortable" ) add_simple_note( sortable, "scenario note #1", None ) add_simple_note( sortable, "scenario note #2", "100px" ) assert generate_sortable_entry_snippet( sortable, 0 ) == adjust_html( "[scenario note #1]" ) assert generate_sortable_entry_snippet( sortable, 1 ) == "[scenario note #2] (width=[100px])" # delete a scenario note by dragging it into the trash assert get_sortable_entry_count( sortable ) == 2 drag_sortable_entry_to_trash( sortable, 0 ) assert get_sortable_entry_count( sortable ) == 1 # delete scenario note by emptying its caption edit_simple_note( sortable, 0, "", None ) assert get_sortable_entry_count( sortable ) == 0 # add a scenario note with non-English content and HTML special characters sortable = find_child( "#scenario_notes-sortable" ) add_simple_note( sortable, "japan <\u65e5\u672c>", None ) assert generate_sortable_entry_snippet( sortable, 0 ) == "[japan <\u65e5\u672c>]" # --------------------------------------------------------------------- def test_players_snippets( webapp, webdriver ): """Test HTML snippet generation.""" # initialize init_webapp( webapp, webdriver ) select_tab( "scenario" ) btn = find_child( "button.generate[data-id='players']" ) # generate a PLAYERS snippet _test_snippet( btn, { "PLAYER_1": "french", "PLAYER_1_ELR": "1", "PLAYER_1_SAN": "2", "PLAYER_2": "british", "PLAYER_2_ELR": "3", "PLAYER_2_SAN": "4", }, "player1=[french:French] ; ELR=[1] ; SAN=[2] | player2=[british:British] ; ELR=[3] ; SAN=[4]", None ) # generate a PLAYERS snippet with both players the same nationality _test_snippet( btn, { "PLAYER_1": "british", }, "player1=[british:British] ; ELR=[1] ; SAN=[2] | player2=[british:British] ; ELR=[3] ; SAN=[4]", [ "Both players have the same nationality!" ], ) # --------------------------------------------------------------------- def test_edit_templates( webapp, webdriver ): """Test editing templates.""" # initialize init_webapp( webapp, webdriver, edit_template_links=1 ) ob_setups = { 1: find_child( "#ob_setups-sortable_1" ), 2: find_child( "#ob_setups-sortable_2" ) } ob_notes = { 1: find_child( "#ob_notes-sortable_1" ), 2: find_child( "#ob_notes-sortable_2" ) } # try uploading a customized version of each template def edit_template( template_id ): """Edit a template.""" elem = find_child( "#edit-template textarea" ) elem.clear() elem.send_keys( "EDITED TEMPLATE: {}".format( template_id ) ) elem.send_keys( Keys.ESCAPE ) def test_template( template_id, orig_template_id ): """Test editing a template.""" if template_id in("scenario_note","ob_setup","ob_note"): return # nb: these require special handling (done below) # edit the template elem = find_child( "a._edit-template-link_[data-id='{}']".format( template_id ) ) webdriver.execute_script( "$(arguments[0]).click();", elem ) edit_template( orig_template_id ) # check that the new template is being used elem = find_child( "button.generate[data-id='{}']".format( orig_template_id ) ) elem.click() wait_for_clipboard( 2, "EDITED TEMPLATE: {}".format( orig_template_id ) ) for_each_template( test_template ) # customize the SCENARIO NOTE template select_tab( "scenario" ) elem = find_child( "button[data-id='scenario_note']" ) elem.click() edit_template( "scenario_note" ) # check that the new template is being used sortable = find_child( "#scenario_notes-sortable" ) add_simple_note( sortable, "scenario note (ignored)", None ) elem = find_child( "li img.snippet", sortable ) elem.click() wait_for_clipboard( 2, "EDITED TEMPLATE: scenario_note" ) # customize the OB SETUP template select_tab( "ob1" ) elem = find_child( "#tabs-ob1 button[data-id='ob_setup']" ) elem.click() edit_template( "ob_setup" ) # check that the new template is being used for player_no in range(1,2+1): select_tab( "ob{}".format( player_no ) ) sortable = ob_setups[ player_no ] add_simple_note( sortable, "ob setup (ignored)", None ) elem = find_child( "li img.snippet", sortable ) elem.click() wait_for_clipboard( 2, "EDITED TEMPLATE: ob_setup" ) # customize the OB NOTE template select_tab( "ob2" ) elem = find_child( "#tabs-ob2 button[data-id='ob_note']" ) elem.click() edit_template( "ob_note" ) # check that the new template is being used for player_no in range(1,2+1): select_tab( "ob{}".format( player_no ) ) sortable = ob_notes[ player_no ] add_simple_note( sortable, "ob note (ignored)", None ) elem = find_child( "li img.snippet", sortable ) elem.click() wait_for_clipboard( 2, "EDITED TEMPLATE: ob_note" ) # --------------------------------------------------------------------- def _test_snippet( btn, params, expected, expected2 ): """Do a single test.""" # set the template parameters and generate the snippet set_template_params( params ) marker = set_stored_msg_marker( "_last-warning_" ) btn.click() def reformat( clipboard ): #pylint: disable=missing-docstring lines = [ l.strip() for l in clipboard.split("\n") ] return " | ".join( l for l in lines if l ) wait_for_clipboard( 2, expected, transform=reformat ) # check warnings for mandatory parameters last_warning = get_stored_msg( "_last-warning_" ) if isinstance( expected2, list): # check for mandatory parameters param_names = [ "scenario name", "scenario location", "scenario date" ] for pname in param_names: if pname in expected2: assert pname in last_warning else: assert pname not in last_warning elif isinstance(expected2, str): # check for a specific error message assert expected2 == last_warning else: # make sure there was no warning message assert expected2 is None assert last_warning == marker