a
    DgV                     @   s   d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d d	lmZ d
dlmZ G dd deZG dd deeZG dd deeZdS )    N)SimpleTestCaseTestCase)reverse)translation)FieldBlockAdapter)DEFAULT_TABLE_OPTIONS
TableBlock)Page)TableBlockStreamPage)WagtailTestUtils   )
TableInputc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(TestTableBlockc                 C   s$   ddddddddddddd	| _ d S )
Nr      FTtextalll   en)minSpareRows	startRows	startCols
colHeadersZ
rowHeaderscontextMenueditorstretchHheightlanguagerendererZautoColumnSize)default_table_options)self r    `/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/contrib/table_block/tests.pysetUp   s    zTestTableBlock.setUpc                 C   sN   ddg dg dg dgd}t  }||}d}| || | d| dS )z(
        Test a generic render.
        FTest 1Test 2Test 3NNNfirst_row_is_table_headerfirst_col_is_headerdataa   
            <table>
                <tbody>
                    <tr><td>Test 1</td><td>Test 2</td><td>Test 3</td></tr>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        r%   Nr   renderassertHTMLEqualassertInr   valueblockresultexpectedr    r    r!   test_table_block_render"   s    	

z&TestTableBlock.test_table_block_renderc                 C   sd   ddddddddddgg dg d	g d	gd
}t  }||}d}| || | d| dS )z@
        Test a generic render with some cells aligned.
        TFr   r   ZhtLeft)rowcolZ	classNameZhtRightr#   r'   )r)   r*   cellr+   a  
            <table>
                <thead>
                    <tr><th scope="col">Test 1</th><th scope="col" class="htLeft">Test 2</th><th scope="col">Test 3</th></tr>
                </thead>
                <tbody>
                    <tr><td></td><td class="htRight"></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        r%   Nr,   r0   r    r    r!   !test_table_block_alignment_render>   s    


z0TestTableBlock.test_table_block_alignment_renderc                 C   s>   t  }|ddg dg dg dgd}d}| || dS )z4
        An empty table should render okay.
        Fr'   r(   a  
            <table>
                <tbody>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        Nr   r-   r.   )r   r2   r3   r4   r    r    r!   test_render_empty_table`   s    	z&TestTableBlock.test_render_empty_tablec                 C   sB   ddg dg dg dgd}d}t  }||}| || dS )zI
        Ensure that raw html doesn't render
        by default.
        Fz<p><strong>Test</strong></p>NNr'   r(   aB  
            <table>
                <tbody>
                    <tr><td>&lt;p&gt;&lt;strong&gt;Test&lt;/strong&gt;&lt;/p&gt;</td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        Nr:   r   r1   r4   r2   r3   r    r    r!   "test_do_not_render_html_by_defaultw   s    


z1TestTableBlock.test_do_not_render_html_by_defaultc                 C   sX   ddg dg dg dgd}d}| j  }d|d< t|d}||}| || d	S )
zQ
        Ensure html renders if table_options set renderer to allow html
        Fr<   r'   r(   a*  
            <table>
                <tbody>
                    <tr><td><p><strong>Test</strong></p></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        htmlr   table_optionsN)r   copyr   r-   r.   )r   r1   r4   new_optionsr2   r3   r    r    r!    test_does_render_html_if_allowed   s    




z/TestTableBlock.test_does_render_html_if_allowedc                 C   sB   ddg dg dg dgd}d}t  }||}| || dS )z@
        Ensure that row headers are properly rendered.
        TFFooBarBazr'   r(   al  
            <table>
                <thead>
                    <tr><th scope="col">Foo</th><th scope="col">Bar</th><th scope="col">Baz</th></tr>
                </thead>
                <tbody>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        Nr:   r=   r    r    r!   test_row_headers   s    
zTestTableBlock.test_row_headersc                 C   sB   ddg dg dg dgd}d}t  }||}| || dS )	zC
        Ensure that column headers are properly rendered.
        FTrE   onetwothreefourfivesixr(   aQ  
            <table>
                <tbody>
                    <tr><th scope="row">Foo</th><td>Bar</td><td>Baz</td></tr>
                    <tr><th scope="row">one</th><td>two</td><td>three</td></tr>
                    <tr><th scope="row">four</th><td>five</td><td>six</td></tr>
                </tbody>
            </table>
        Nr:   r=   r    r    r!   test_column_headers   s    
	
z"TestTableBlock.test_column_headersc                 C   sB   ddg dg dg dgd}d}t  }||}| || dS )z?
        Test row and column headers at the same time.
        TrE   rJ   rN   r(   a  
            <table>
                <thead>
                    <tr><th scope="col">Foo</th><th scope="col">Bar</th><th scope="col">Baz</th></tr>
                </thead>
                <tbody>
                    <tr><th scope="row">one</th><td>two</td><td>three</td></tr>
                    <tr><th scope="row">four</th><td>five</td><td>six</td></tr>
                </tbody>
            </table>
        Nr:   r=   r    r    r!   test_row_and_column_headers   s    

z*TestTableBlock.test_row_and_column_headersc                 C   sB   ddg dg dg dgd}d}t  }||}| || dS )z-
        Test table without headers.
        FrE   rJ   rN   r(   a-  
            <table>
                <tbody>
                    <tr><td>Foo</td><td>Bar</td><td>Baz</td></tr>
                    <tr><td>one</td><td>two</td><td>three</td></tr>
                    <tr><td>four</td><td>five</td><td>six</td></tr>
                </tbody>
            </table>
        Nr:   r=   r    r    r!   test_no_headers  s    
	
zTestTableBlock.test_no_headersc                 C   sN   ddg dg dgd}t  }d}||}| || | ||| dS )ze
        Make sure we get back good json and make
        sure it translates back to python.
        F)rF   r   N)g      @rG   rH   r(   zs{"first_row_is_table_header": false, "first_col_is_header": false, "data": [["Foo", 1, null], [3.5, "Bar", "Baz"]]}N)r   Zvalue_for_formZassertJSONEqualassertEqualZvalue_from_form)r   r1   r2   Zexpected_jsonZreturned_jsonr    r    r!   test_value_for_and_from_form  s    
z+TestTableBlock.test_value_for_and_from_formc                 C   sF   t  }| | d | j }d|d< t |d}| | d dS )zc
        Test that settings flow through correctly to
        the is_html_renderer method.
        Fr?   r   r@   TN)r   assertIsZis_html_rendererr   rB   )r   Zblock1rC   Zblock2r    r    r!   test_is_html_renderer/  s    

z$TestTableBlock.test_is_html_rendererc                 C   sB   ddg dg dg dgd}t  }||}| |g d d S )NFr#   )NrG   N)NrF   Nr(   )r$   r%   r&   rG   rF   r   get_searchable_contentrU   r   r1   r2   contentr    r    r!   test_searchable_content>  s    	
z&TestTableBlock.test_searchable_contentc                 C   s$   d }t  }||}| |g  d S NrY   r[   r    r    r!   &test_searchable_content_for_null_blockU  s    
z5TestTableBlock.test_searchable_content_for_null_blockc                 C   sV   t dd}ddg dg dg dgd}|j|ddid	}| d
| | d| dS )zv
        Test that extra context variables passed in block.render are passed through
        to the template.
        z*tests/blocks/table_block_with_caption.html)templateFr#   r'   r(   captionzA fascinating table.)contextr$   z<div>A fascinating table.</div>N)r   r-   r/   )r   r2   r1   r3   r    r    r!   test_render_with_extra_context[  s    
	z-TestTableBlock.test_render_with_extra_contextc                 C   sP   dddg dg dg dgd}t  }||}d}| || | d| dS )	z5
        Test a generic render with caption.
        ra   Fr#   r'   )Ztable_captionr)   r*   r+   aK  
            <table>
                <caption>caption</caption>
                <tbody>
                    <tr><td>Test 1</td><td>Test 2</td><td>Test 3</td></tr>
                    <tr><td></td><td></td><td></td></tr>
                    <tr><td></td><td></td><td></td></tr>
                </tbody>
            </table>
        r%   Nr,   r0   r    r    r!   test_table_block_caption_rendero  s    


z.TestTableBlock.test_table_block_caption_renderc                 C   s4   d}t  }||}d}| || | d| dS )z6
        Test an empty table is not rendered.
        N None)r   r-   r.   ZassertNotInr0   r    r    r!   &test_empty_table_block_is_not_rendered  s    
z5TestTableBlock.test_empty_table_block_is_not_renderedc              
   C   sr   ddg dg dg dgddddd	d	ddgdddd	d
dd	d	dd
gd}t  }||}d}| || dS )z<
        Test that merged table cells are rendered.
        F)rK   NrL   )rM   rO   rP   )rQ   ZsevenNr   r   T)r6   r7   hidden   )r6   r7   ZrowspanZcolspan)r)   r*   r+   r8   Z
mergeCellsaG  
            <table>
                <tbody>
                    <tr><td rowspan="1" colspan="2">one</td><td>two</td></tr>
                    <tr><td>three</td><td>four</td><td rowspan="2" colspan="1">five</td></tr>
                    <tr><td>six</td><td>seven</td></tr>
                </tbody>
            </table>
        Nr:   r0   r    r    r!   test_merge_cells_render  s"    


	z&TestTableBlock.test_merge_cells_renderc                 C   s   t  }| |d  d S r^   )r   ZassertIsNoneZ	to_pythonr   r2   r    r    r!    test_empty_table_block_to_python  s    z/TestTableBlock.test_empty_table_block_to_pythonN)__name__
__module____qualname__r"   r5   r9   r;   r>   rD   rI   rR   rS   rT   rV   rX   r]   r_   rc   rd   rg   rj   rl   r    r    r    r!   r      s&   ""r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestTableBlockFormc                 C   sL   ddg dg dg dg dg dgd| _ t }t | _|| jd< d S )	NTZShipTypeZStatus	Galactica
BattlestarActiveZValkyrieru   	DestroyedzCylon BasestarZBasestarrv   BrenikzSmall Military Vesselrx   r(   r   )r1   r   Zget_languager   rB   r   )r   r   r    r    r!   r"     s    
zTestTableBlockForm.setUpc                 C   s   t  }| |j|  | | j|j | td |jd  | td |jd  | td |jd  | td |jd  | td |jd  dS )zI
        Test options without any custom table_options provided.
        r   r   r   r   r   N)r   rU   rA   Zget_table_optionsr   r   rk   r    r    r!   test_default_table_options  s     z-TestTableBlockForm.test_default_table_optionsc                 C   s   t  }| d|j td t  }| d|jd  td t  }| d|jd  t ddid}| d|jd  | d|jd  td dS )zW
        Test that the environment's language is used if no language provided.
        r   zfr-fritjar@   r   N)r   r/   rA   r   activaterU   ZassertNotEqual)r   r2   Zblock_frZblock_itZblock_with_langr    r    r!   test_table_options_language  s    

z.TestTableBlockForm.test_table_options_languagec                 C   s   t td }t j}| |d | tddidj}| |d | tddidj}| |d d tdddgidj}| |d ddg tdg idj}| |d g  dS )z9
        Test how contextMenu is set to default.
        r   Tr@   FZundoZredoN)listr   r   rA   rU   rW   )r   Zdefault_context_menurA   Ztable_options_menu_trueZtable_options_menu_falseZtable_options_menu_listr    r    r!   test_table_options_context_menu  s&    
z2TestTableBlockForm.test_table_options_context_menuc                 C   sv   t ddddj}| |d d | |d d t ddidj}| |d d t d	d
idj}| |d	 d
 dS )zE
        Test simple options overrides get passed correctly.
           ri   )r   r   r@   r   r   r   noneZ
allowEmptyFN)r   rA   rU   rW   )r   Zblock_1_optsZblock_2_optsZblock_3_optsr    r    r!   test_table_options_others  s    z,TestTableBlockForm.test_table_options_othersc                 C   sp   t dd}|d t |}| |d d | |d t | |d dddd	|j|jd
dddid	 d S )NzA table to display data.)descriptionZtest_tableblockr   r   ri   zTest tableblockTtablez0w-field w-field--char_field w-field--table_inputZADD_COMMENTzAdd Comment)	labelr   requiredZiconZ
blockDefIdZisPreviewable	classnameZshowAddCommentButtonstrings)	r   set_namer   js_argsrU   ZassertIsInstancer   Zdefinition_prefixZis_previewable)r   r2   r   r    r    r!   
test_adapt0  s$    

zTestTableBlockForm.test_adaptc                 C   s0   t  }|j| jd}| d| | d| dS )z?
        Test searchable content is created correctly.
        )r1   rt   r{   N)r   rZ   r1   r/   )r   r2   Zsearch_contentr    r    r!   r]   G  s    z*TestTableBlockForm.test_searchable_contentN)
rm   rn   ro   r"   r|   r   r   r   r   r]   r    r    r    r!   rp     s   rp   c                   @   s"   e Zd Zdd Zejdd ZdS )TestTableBlockPageEditc                 C   sv   ddg dg dg dg dg dgd| _ tjjdd	| _td
td| j dgd}| jj|d| _	| 
 | _d S )NTrq   rs   rw   ry   rz   r(   ri   )idZShipsr   )typer1   )titler   )instance)r1   r	   ZobjectsgetZ	root_pager
   jsondumpsZ	add_childtable_block_pageloginuser)r   Ztable_block_page_instancer    r    r!   r"   S  s"    zTestTableBlockPageEdit.setUpc                 C   sf   | j td| jjfd}| |d | |d | |d | |d | |d | |d d	S )
z\
        Test that edit page loads with saved table data and correct init function.
        zwagtailadmin_pages:edit)argszW<div data-contentpath="table" class="w-field w-field--char_field w-field--table_input">ru   rt   z#initTable("table\u002D0\u002Dvalue"r   r   N)clientr   r   r   r   ZassertContains)r   responser    r    r!   test_page_edit_page_viewh  s    z/TestTableBlockPageEdit.test_page_edit_page_viewN)rm   rn   ro   r"   unittestZexpectedFailurer   r    r    r    r!   r   R  s   r   )r   r   Zdjango.testr   r   Zdjango.urlsr   Zdjango.utilsr   Zwagtail.blocks.field_blockr   Z"wagtail.contrib.table_block.blocksr   r   Zwagtail.modelsr	   Zwagtail.test.testapp.modelsr
   Zwagtail.test.utilsr   blocksr   r   rp   r   r    r    r    r!   <module>   s"      3 