U
    {hU                     @   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    i/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/contrib/table_block/tests.pysetUp   s    zTestTableBlock.setUpc                 C   sT   dddddgdddgdddggd}t  }||}d}| || | d| dS )z(
        Test a generic render.
        FTest 1Test 2Test 3N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   renderassertHTMLEqualassertInr   valueblockresultexpectedr    r    r!   test_table_block_render"   s    	

z&TestTableBlock.test_table_block_renderc                 C   sj   ddddddddddgdd	d
gdddgdddg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%   N)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*   r.   r    r    r!   !test_table_block_alignment_render>   s    


z0TestTableBlock.test_table_block_alignment_renderc              	   C   sD   t  }|dddddgdddgdddggd}d}| || dS )z4
        An empty table should render okay.
        FNr&   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>
        r   r+   r,   )r   r0   r1   r2   r    r    r!   test_render_empty_table`   s    	z&TestTableBlock.test_render_empty_tablec                 C   sH   dddddgdddgdddggd}d}t  }||}| || dS )zI
        Ensure that raw html doesn't render
        by default.
        F<p><strong>Test</strong></p>Nr&   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>
        r8   r   r/   r2   r0   r1   r    r    r!   "test_do_not_render_html_by_defaultw   s    


z1TestTableBlock.test_do_not_render_html_by_defaultc                 C   s^   dddddgdddgdddggd}d}| j  }d|d< t|d}||}| || dS )	zQ
        Ensure html renders if table_options set renderer to allow html
        Fr:   Nr&   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_options)r   copyr   r+   r,   )r   r/   r2   new_optionsr0   r1   r    r    r!    test_does_render_html_if_allowed   s    




z/TestTableBlock.test_does_render_html_if_allowedc                 C   sH   dddddgdddgdddggd}d}t  }||}| || dS )	z@
        Ensure that row headers are properly rendered.
        TFFooBarBazNr&   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>
        r8   r;   r    r    r!   test_row_headers   s    
zTestTableBlock.test_row_headersc                 C   sH   dddddgdddgd	d
dggd}d}t  }||}| || dS )zC
        Ensure that column headers are properly rendered.
        FTrC   rD   rE   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>
        Nr8   r;   r    r    r!   test_column_headers   s    
	
z"TestTableBlock.test_column_headersc                 C   sH   dddddgdddgdd	d
ggd}d}t  }||}| || dS )z?
        Test row and column headers at the same time.
        TrC   rD   rE   rG   rH   rI   rJ   rK   rL   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>
        Nr8   r;   r    r    r!   test_row_and_column_headers   s    

z*TestTableBlock.test_row_and_column_headersc                 C   sH   dddddgdddgdd	d
ggd}d}t  }||}| || dS )z-
        Test table without headers.
        FrC   rD   rE   rG   rH   rI   rJ   rK   rL   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>
        Nr8   r;   r    r    r!   test_no_headers  s    
	
zTestTableBlock.test_no_headersc                 C   sR   dddddgdddggd}t  }d	}||}| || | ||| dS )
ze
        Make sure we get back good json and make
        sure it translates back to python.
        FrC   r   Ng      @rD   rE   r&   zs{"first_row_is_table_header": false, "first_col_is_header": false, "data": [["Foo", 1, null], [3.5, "Bar", "Baz"]]})r   Zvalue_for_formZassertJSONEqualassertEqualZvalue_from_form)r   r/   r0   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   r@   )r   Zblock1rA   Zblock2r    r    r!   test_is_html_renderer/  s    

z$TestTableBlock.test_is_html_rendererc                 C   sN   dddddgd dd gd dd ggd}t  }||}| |dddddg d S )NFr#   r$   r%   rD   rC   r&   r   get_searchable_contentrP   r   r/   r0   contentr    r    r!   test_searchable_content>  s$    	
z&TestTableBlock.test_searchable_contentc                 C   s$   d }t  }||}| |g  d S NrT   rV   r    r    r!   &test_searchable_content_for_null_blockU  s    
z5TestTableBlock.test_searchable_content_for_null_blockc                 C   s\   t dd}dddddgdddgdddg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%   Nr&   captionzA fascinating table.)contextz<div>A fascinating table.</div>)r   r+   r-   )r   r0   r/   r1   r    r    r!   test_render_with_extra_context[  s    
	z-TestTableBlock.test_render_with_extra_contextc                 C   sV   ddddddgdddgdddggd}t  }||}d}| || | d| dS )	z5
        Test a generic render with caption.
        r\   Fr#   r$   r%   N)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*   r.   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assertNotInr.   r    r    r!   &test_empty_table_block_is_not_rendered  s    
z5TestTableBlock.test_empty_table_block_is_not_renderedc              
   C   sx   dddddgdddgdd	dg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.
        FrG   NrH   rI   rJ   rK   rL   sevenr   r   T)r4   r5   Zhidden   )r4   r5   ZrowspanZcolspan)r'   r(   r)   r6   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>
        r8   r.   r    r    r!   test_merge_cells_render  s"    


	z&TestTableBlock.test_merge_cells_renderc                 C   s   t  }| |d  d S rY   )r   ZassertIsNoneZ	to_pythonr   r0   r    r    r!    test_empty_table_block_to_python  s    z/TestTableBlock.test_empty_table_block_to_pythonN)__name__
__module____qualname__r"   r3   r7   r9   r<   rB   rF   rM   rN   rO   rQ   rS   rX   rZ   r^   r_   rb   re   rg   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   sV   dddddgdddgddd	gd
ddgddd	ggd| _ t }t | _|| jd< d S )NTShipTypeStatus	Galactica
BattlestarActiveValkyrie	DestroyedCylon BasestarBasestarBrenikSmall Military Vesselr&   r   )r/   r   Zget_languager   r@   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   rP   r?   Zget_table_optionsr   r   rf   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-   r?   r   activaterP   ZassertNotEqual)r   r0   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   r?   rP   rR   )r   Zdefault_context_menur?   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.
           rd   )r   r   r>   r   r   r   noneZ
allowEmptyFN)r   r?   rP   rR   )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   sb   t  }|d t |}| |d d | |d t | |d dddddd	d
id d S )NZtest_tableblockr   r   rd   zTest tableblockTtablez0w-field w-field--char_field w-field--table_inputZADD_COMMENTzAdd Comment)labelrequiredicon	classnameZshowAddCommentButtonstrings)r   set_namer   js_argsrP   ZassertIsInstancer   )r   r0   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.
        )r/   ro   rv   N)r   rU   r/   r-   )r   r0   Zsearch_contentr    r    r!   rX   D  s    z*TestTableBlockForm.test_searchable_contentN)
rh   ri   rj   r"   rx   r|   r~   r   r   rX   r    r    r    r!   rk     s   rk   c                   @   s"   e Zd Zdd Zejdd ZdS )TestTableBlockPageEditc              	   C   s   dddddgdddgddd	gd
ddgddd	ggd| _ tjjdd| _tdtd| j dgd}| jj|d| _	| 
 | _d S )NTrl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   r&   rd   )idZShipsr   )typer/   )titler   )instance)r/   r	   objectsgetZ	root_pager
   jsondumpsZ	add_childtable_block_pageloginuser)r   Ztable_block_page_instancer    r    r!   r"   P  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">rp   ro   z#initTable("table\u002D0\u002Dvalue"r   r   N)clientr   r   r   r   ZassertContains)r   responser    r    r!   test_page_edit_page_viewe  s    z/TestTableBlockPageEdit.test_page_edit_page_viewN)rh   ri   rj   r"   unittestZexpectedFailurer   r    r    r    r!   r   O  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   rk   r   r    r    r    r!   <module>   s"      3 