""" Test generating OB SETUP snippets. """ import re import types from vasl_templates.webapp.tests.utils import \ get_nationalities, wait_for_clipboard, get_stored_msg, set_stored_msg_marker, select_tab, \ find_child, find_children, \ add_simple_note, edit_simple_note, get_sortable_entry_count, drag_sortable_entry_to_trash, \ init_webapp, wait_for, set_scenario_date, set_player, set_theater # --------------------------------------------------------------------- # NOTE: Handling of OB setups and OB notes is identical (the only difference # is in the template files, where OB setups have a colored header). def test_ob_setup( webapp, webdriver ): """Test generating OB setup snippets.""" _do_test_ob_entries( webapp, webdriver, "ob_setups" ) def test_ob_notes( webapp, webdriver ): """Test generating OB note snippets.""" _do_test_ob_entries( webapp, webdriver, "ob_notes" ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def _do_test_ob_entries( webapp, webdriver, ob_type ): """Test generating OB setup/notes.""" # initialize init_webapp( webapp, webdriver ) sortable1 = find_child( "#{}-sortable_1".format( ob_type ) ) sortable2 = find_child( "#{}-sortable_2".format( ob_type ) ) # generate OB setup/note snippets for both players select_tab( "ob1" ) add_simple_note( sortable1, "{} #1".format(ob_type), None ) add_simple_note( sortable1, "{} #2".format(ob_type), "2px" ) select_tab( "ob2" ) add_simple_note( sortable2, "{} #3".format(ob_type), "3px" ) # check that snippets are generated correctly def check_snippet( sortable, entry_no, expected ): """Generate the snippet for an OB setup/note.""" elems = find_children( "li img.snippet", sortable ) elems[entry_no].click() if ob_type == "ob_notes": expected = re.sub( r" \(col=.*?\)", "", expected ) assert wait_for_clipboard( 2, expected ) select_tab( "ob1" ) check_snippet( sortable1, 0, "[German] [{} #1] (col=[OBCOL:german/OBCOL-BORDER:german])".format( ob_type ) ) check_snippet( sortable1, 1, "[German] [{} #2] (col=[OBCOL:german/OBCOL-BORDER:german]) (width=[2px])".format( ob_type ) ) select_tab( "ob2" ) check_snippet( sortable2, 0, "[Russian] [{} #3] (col=[OBCOL:russian/OBCOL-BORDER:russian]) (width=[3px])".format( ob_type ) ) # make some changes and check the snippets again edit_simple_note( sortable2, 0, "updated {} #3".format(ob_type), "" ) select_tab( "ob1" ) edit_simple_note( sortable1, 1, "updated {} #2".format(ob_type), "200px" ) edit_simple_note( sortable1, 0, None, "100px" ) select_tab( "ob2" ) check_snippet( sortable2, 0, "[Russian] [updated {} #3] (col=[OBCOL:russian/OBCOL-BORDER:russian])".format( ob_type ) ) select_tab( "ob1" ) check_snippet( sortable1, 1, "[German] [updated {} #2] (col=[OBCOL:german/OBCOL-BORDER:german]) (width=[200px])".format( ob_type ) ) check_snippet( sortable1, 0, "[German] [{} #1] (col=[OBCOL:german/OBCOL-BORDER:german]) (width=[100px])".format( ob_type ) ) # delete an OB setup/note by dragging it into the trash assert get_sortable_entry_count( sortable1 ) == 2 drag_sortable_entry_to_trash( sortable1, 1 ) assert get_sortable_entry_count( sortable1 ) == 1 # delete an OB setup/note by emptying its caption edit_simple_note( sortable1, 0, "", None ) assert get_sortable_entry_count( sortable1 ) == 0 # --------------------------------------------------------------------- def test_nationality_specific( webapp, webdriver ): #pylint: disable=too-many-locals """Check that nationality-specific buttons are shown/hidden correctly.""" # initialize init_webapp( webapp, webdriver ) nationalities = get_nationalities( webapp ) def do_check_snippets( btn, date, expected, warning ): """Check that snippets are being generated correctly.""" # change the scenario date, check that the button is displayed correctly set_scenario_date( "{:02}/01/{:04}".format( date[1], date[0] ) ) select_tab( "ob1" ) classes = btn.get_attribute( "class" ) classes = classes.split() if classes else [] if warning: assert "inactive" in classes else: assert "inactive" not in classes # test snippet generation marker = set_stored_msg_marker( "_last-warning_" ) btn.click() wait_for_clipboard( 2, expected ) # check if a warning was issued last_warning = get_stored_msg( "_last-warning_" ) if warning: assert "are only available" in last_warning expected_image_url = "snippet-disabled.png" else: assert last_warning == marker expected_image_url = "snippet.png" wait_for( 2, lambda: expected_image_url in find_child( "img", btn ).get_attribute( "src" ) ) # initialize def check_pf_snippets( nat ): #pylint: disable=unused-argument """Check that the PF snippets are generated correctly.""" btn = find_child( "button[data-id='pf']" ) col = "[OBCOL:german]/[OBCOL-BORDER:german]" do_check_snippets( btn, (1942,1), "PF: range=[1] ; check=[3] ; col={}".format(col), True ) do_check_snippets( btn, (1943,9), "PF: range=[1] ; check=[3] ; col={}".format(col), True ) do_check_snippets( btn, (1943,10), "PF: range=[1] ; check=[3] ; col={}".format(col), False ) do_check_snippets( btn, (1944,5), "PF: range=[1] ; check=[3] ; col={}".format(col), False ) do_check_snippets( btn, (1944,6), "PF: range=[2] ; check=[3] ; col={}".format(col), False ) do_check_snippets( btn, (1944,12), "PF: range=[2] ; check=[3] ; col={}".format(col), False ) do_check_snippets( btn, (1945,1), "PF: range=[3] ; check=[4] ; col={}".format(col), False ) do_check_snippets( btn, (1946,1), "PF: range=[3] ; check=[4] ; col={}".format(col), False ) # initialize def check_psk_snippets( nat ): #pylint: disable=unused-argument """Check that the PSK snippets are generated correctly.""" btn = find_child( "button[data-id='psk']" ) expected = "====> whoosh! ; col=[OBCOL:german]/[OBCOL-BORDER:german]" do_check_snippets( btn, (1942,1), expected, True ) do_check_snippets( btn, (1943,8), expected, True ) do_check_snippets( btn, (1943,9), expected, False ) do_check_snippets( btn, (1944,1), expected, False ) # initialize def check_baz_snippets( nat ): #pylint: disable=unused-argument """Check that the BAZ snippets are generated correctly.""" btn = find_child( "button[data-id='baz']" ) do_check_snippets( btn, (1941,1), "BAZ: none", True ) do_check_snippets( btn, (1942,10), "BAZ: none", True ) col = "[OBCOL:american]/[OBCOL-BORDER:american]" do_check_snippets( btn, (1942,11), "BAZ: '43 ; range=[4] ; X#=[10] ; TK#=[13] ; col={}".format(col), False ) do_check_snippets( btn, (1943,1), "BAZ: '43 ; range=[4] ; X#=[10] ; TK#=[13] ; col={}".format(col), False ) do_check_snippets( btn, (1944,1), "BAZ: '44 ; range=[4] ; X#=[11] ; TK#=[16] ; col={}".format(col), False ) do_check_snippets( btn, (1945,1), "BAZ: '45 ; range=[5] ; X#=[11] ; TK#=[16] ; WP#=[6] ; col={}".format(col), False ) do_check_snippets( btn, (1946,1), "BAZ: '45 ; range=[5] ; X#=[11] ; TK#=[16] ; WP#=[6] ; col={}".format(col), False ) # initialize def check_piat_snippets( nat ): """Check that the PIAT snippets are generated correctly.""" wait_for_clipboard( 2, "piat template ; col=[OBCOL:{}]/[OBCOL-BORDER:{}]".format( nat, nat ) ) # initialize def check_atmm_snippets( nat ): #pylint: disable=unused-argument """Check that the ATMM snippets are generated correctly.""" btn = find_child( "button[data-id='atmm']" ) expected = "Kaboom!!! ; col=[OBCOL:german]/[OBCOL-BORDER:german]" do_check_snippets( btn, (1943,12), expected, True ) do_check_snippets( btn, (1944,1), expected, False ) do_check_snippets( btn, (1944,12), expected, False ) do_check_snippets( btn, (1945,1), expected, False ) # initialize nationality_specific_buttons = { "mol": [ "russian", "Burn, baby, burn! ; col=[OBCOL:russian]/[OBCOL-BORDER:russian]" ], "mol-p": [ "russian", "mol-p template ; col=[OBCOL:russian]/[OBCOL-BORDER:russian]" ], "pf": [ "german", check_pf_snippets ], "psk": [ "german", check_psk_snippets ], "atmm": [ "german", check_atmm_snippets ], "baz": [ "american", check_baz_snippets ], "baz45": [ ("american","Korea"), "BAZ 45 (from K:FW)" ], "baz50": [ ("american","Korea"), "BAZ 50 (from K:FW)" ], "baz-cpva16": [ "kfw-cpva", "BAZ 44 (from K:FW)" ], "baz-cpva17": [ "kfw-cpva", "BAZ Type 51 (from K:FW)" ], "piat": [ ["british","british~canadian"], check_piat_snippets ], "thh": [ "japanese", "Banzai!!!" ], } btn_elems = { btn: find_child( "button[data-id='{}']".format( btn ) ) for btn in nationality_specific_buttons } # iterate through each nationality for nat in nationalities: # change the nationality for player 1 set_player( 1, nat ) # check the nationality-specific buttons select_tab( "ob1" ) for button_id,expected in nationality_specific_buttons.items(): elem = btn_elems[ button_id ] if isinstance( expected[0], str ): expected_nats = [ expected[0] ] elif isinstance( expected[0], list ): expected_nats = expected[0] else: assert isinstance( expected[0], tuple ) expected_nats = [ expected[0][0] ] set_theater( expected[0][1] ) if nat in expected_nats: # the button should be shown for this nationality assert elem.is_displayed() # make sure that the template works elem.click() if isinstance( expected[1], str ): wait_for_clipboard( 2, expected[1] ) elif isinstance( expected[1], types.FunctionType ): expected[1]( nat ) #pylint: disable=not-callable else: assert False else: # it should be hidden for all other nationalities assert not elem.is_displayed()