U
    |h9$                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZ d dl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 G d
d deeZG dd deZG dd deZG dd deZdS )    N)
connection)F	JSONField	TextField)Cast)TestCase)timezone)RenameStreamChildrenOperation)	factoriesmodels)MigrationTestMixinc                   @   sd   e Zd ZdZdZeddddfgZdZdd Zd	d
 Z	dddZ
dd Zdd Zdd Zdd ZdS )BaseMigrationTestNFchar1renamed1)Zold_namenew_name c                 C   s0   | j ddddd| j dddd| j ddddgS )NzTest char 1zTest char 2zTest char 3zTest char 4)content__0__char1content__1__char1content__2__char2Zcontent__3__char2)r   r   r   )Zcontent__0__char2Zcontent__1__char2r   )factoryself r   |/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/tests/streamfield_migrations/test_migrations.py_get_test_instances   s"    z%BaseMigrationTest._get_test_instancesc                 C   s   |   }i | _i | _|D ]}|jj| j|j< | jrtdD ]D}| }t	
 tjd| d |_|  |dkr:||_|  q:t|j d| j|j< qd S )N   days   id)r   original_raw_dataoriginal_revisionscontentraw_datar   has_revisionsrangeZsave_revisionr   nowdatetime	timedelta
created_atsaveZlive_revisionlist	revisionsallorder_by)r   	instancesinstanceirevisionr   r   r   setUp0   s$    


zBaseMigrationTest.setUpTc                 C   sb   t ||D ]R\}}| |d |d  |rH|d dkrH| |d d q
| |d |d  q
d S )Nr   typer   r   )zipassertEqual)r   old_contentnew_content
is_alteredZ	old_blockZ	new_blockr   r   r   assertBlocksRenamedG   s
    z%BaseMigrationTest.assertBlocksRenamedc                 C   sR   |    | jj jttdt d}|D ] }| j|j	 }| j
||jd q,dS )aK  Test whether the stream data of the model instances have been updated properly

        Apply the migration and then query the raw data of the updated instances. Compare with
        original raw data and check whether all relevant `char1` blocks have been renamed and
        whether ids and other block types are intact.
        r"   raw_contentr7   r8   N)apply_migrationmodelobjectsr-   annotater   r   r   r    r   r:   r<   )r   r/   r0   Zprev_contentr   r   r   _test_migrate_stream_dataO   s     z+BaseMigrationTest._test_migrate_stream_datac                 C   s|   |    | jj }|D ]^}| j|j }t||j dD ]6\}}t	
|jd }t	
|jd }| j||d q>qdS )zTest whether all revisions have been updated properly

        Applying migration with `revisions_from=None`, so all revisions should be updated.
        r   r"   r=   N)r>   r?   r@   r-   r!   r   r5   r,   r.   jsonloadsr"   r:   )r   r/   r0   old_revisionsold_revisionnew_revisionr7   r8   r   r   r   _test_migrate_revisionse   s      z)BaseMigrationTest._test_migrate_revisionsc           
      C   s   t  tjdd }| j|d | jj }|D ]x}| j|j	 }t
||j dD ]P\}}|j	|jkpt|j	|jk}t|jd }t|jd }	| j||	|d qVq0dS )a  Test whether latest and live revisions are always updated

        Applying migration with `revisions_from` set to a date in the future, so there should be
        no revisions which are made after the date. Only the live and latest revisions should
        update in this case.
           r   revisions_fromr   r"   r7   r8   r9   N)r   r&   r'   r(   r>   r?   r@   r-   r!   r   r5   r,   r.   live_revision_idlatest_revision_idrC   rD   r"   r:   )
r   rK   r/   r0   rE   rF   rG   is_latest_or_liver7   r8   r   r   r   ._test_always_migrate_live_and_latest_revisionsz   s&     
z@BaseMigrationTest._test_always_migrate_live_and_latest_revisionsc                 C   s   t  tjdd }| j|d | jj }|D ]}| j|j	 }t
||j dD ]b\}}|j	|jkpt|j	|jk}|j|k}|p|}	t|jd }
t|jd }| j|
||	d qVq0dS )a'  Test whether revisions from a given date onwards are updated

        Applying migration with `revisions_from` set to a date between the created date of the first
        and last revision, so only the revisions after the date and the live and latest revision
        should be updated.
        rI   r   rJ   r   r"   rL   N)r   r&   r'   r(   r>   r?   r@   r-   r!   r   r5   r,   r.   rM   rN   r)   rC   rD   r"   r:   )r   rK   r/   r0   rE   rF   rG   rO   Zis_after_revisions_fromr9   r7   r8   r   r   r   !_test_migrate_revisions_from_date   s*     

z3BaseMigrationTest._test_migrate_revisions_from_date)T)__name__
__module____qualname__r   r$   r	   Z default_operation_and_block_pathapp_namer   r3   r:   rB   rH   rP   rQ   r   r   r   r   r      s   

r   c                   @   s(   e Zd ZejZejZdZ	dZ
dd ZdS ) TestNonPageModelWithoutRevisionsFstreamfield_migration_testsc                 C   s   |    d S NrB   r   r   r   r   test_migrate_stream_data   s    z9TestNonPageModelWithoutRevisions.test_migrate_stream_dataN)rR   rS   rT   r   ZSampleModelr?   r
   ZSampleModelFactoryr   r$   rU   rZ   r   r   r   r   rV      s
   rV   c                   @   s@   e Zd ZejZejZdZ	dZ
dd Zdd Zdd Zd	d
 ZdS )TestPageTrW   c                 C   s   |    d S rX   rY   r   r   r   r   rZ      s    z!TestPage.test_migrate_stream_datac                 C   s   |    d S rX   )rH   r   r   r   r   test_migrate_revisions   s    zTestPage.test_migrate_revisionsc                 C   s   |    d S rX   )rP   r   r   r   r   -test_always_migrate_live_and_latest_revisions   s    z6TestPage.test_always_migrate_live_and_latest_revisionsc                 C   s   |    d S rX   )rQ   r   r   r   r    test_migrate_revisions_from_date   s    z)TestPage.test_migrate_revisions_from_dateN)rR   rS   rT   r   
SamplePager?   r
   SamplePageFactoryr   r$   rU   rZ   r\   r]   r^   r   r   r   r   r[      s   r[   c                       sL   e Zd ZdZejZejZ	dZ
dZdd Z fddZdd	 Zd
d Z  ZS )TestNullStreamFieldz
    Migrations are processed if the underlying JSON is null.

    This might occur if we're operating on a StreamField that was added to a model that
    had existing records.
    TrW   c                 C   s   | j jdd dS )Nr   )r"   )r   Zcreate_batchr   r   r   r   r      s    z'TestNullStreamField._get_test_instancesc              	      s:   t    t }|d| jjj d W 5 Q R X d S )NzUPDATE z SET content = 'null')superr3   r   cursorexecuter?   _metaZdb_table)r   rc   	__class__r   r   r3      s    

zTestNullStreamField.setUpc              
   C   sT   | j j jttdt d}|D ]*}| j|d | |j	d W 5 Q R X q$dS )zF
        The raw JSON of all instances for this test is null.
        r"   r;   )r0   nullN)
r?   r@   r-   rA   r   r   r   ZsubTestr6   r<   )r   r/   r0   r   r   r   assert_null_content   s    z'TestNullStreamField.assert_null_contentc                 C   s   |    |   |    d S rX   )ri   r>   r   r   r   r   rZ      s    z,TestNullStreamField.test_migrate_stream_data)rR   rS   rT   __doc__r   r_   r?   r
   r`   r   r$   rU   r   r3   ri   rZ   __classcell__r   r   rf   r   ra      s   ra   )r'   rC   Z	django.dbr   Zdjango.db.modelsr   r   r   Zdjango.db.models.functionsr   Zdjango.testr   Zdjango.utilsr   Z$wagtail.blocks.migrations.operationsr	   Z#wagtail.test.streamfield_migrationsr
   r   Z-wagtail.test.streamfield_migrations.testutilsr   r   rV   r[   ra   r   r   r   r   <module>   s    '
