o
    h*                     @   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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G dd deZdS )    N)
connection)F	JSONField	TextField)Cast)TestCase)timezone)RenameStreamChildrenOperation"StreamChildrenToListBlockOperation)	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)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__char2content__3__char2)r   r   r   )content__0__char2content__1__char2r   )factoryself r   t/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/tests/streamfield_migrations/test_migrations.py_get_test_instances   s"   z%BaseMigrationTest._get_test_instancesc                 C   s   |   }i | _i | _|D ]B}|jj| j|j< | jrNt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rangesave_revisionr   nowdatetime	timedelta
created_atsavelive_revisionlist	revisionsallorder_by)r   	instancesinstanceirevisionr   r   r   setUp3   s*   

zBaseMigrationTest.setUpTc                 C   sb   t ||D ])\}}| |d |d  |r$|d dkr$| |d d q| |d |d  qd S )Nr$   typer   r   )zipassertEqual)r   old_contentnew_content
is_altered	old_block	new_blockr   r   r   assertBlocksRenamedJ   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r>   r?   N)apply_migrationmodelobjectsr4   annotater   r   r   r%   r$   rC   rE   )r   r6   r7   prev_contentr   r   r   _test_migrate_stream_dataR   s   z+BaseMigrationTest._test_migrate_stream_datac                 C   s|   |    | jj }|D ]/}| j|j }t||j dD ]\}}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'   rF   N)rG   rH   rI   r4   r&   r$   r<   r3   r5   jsonloadsr'   rC   )r   r6   r7   old_revisionsold_revisionnew_revisionr>   r?   r   r   r   _test_migrate_revisionsh   s   z)BaseMigrationTest._test_migrate_revisionsc           
      C   s   t  tjdd }| j|d | jj }|D ]<}| j|j	 }t
||j dD ](\}}|j	|jkp:|j	|jk}t|jd }t|jd }	| j||	|d q+qd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'   r>   r?   r@   N)r   r,   r-   r.   rG   rH   rI   r4   r&   r$   r<   r3   r5   live_revision_idlatest_revision_idrM   rN   r'   rC   )
r   rU   r6   r7   rO   rP   rQ   is_latest_or_liver>   r?   r   r   r   ._test_always_migrate_live_and_latest_revisions}   s(   
z@BaseMigrationTest._test_always_migrate_live_and_latest_revisionsc                 C   s   t  tjdd }| j|d | jj }|D ]E}| j|j	 }t
||j dD ]1\}}|j	|jkp:|j	|jk}|j|k}|pC|}	t|jd }
t|jd }| j|
||	d q+qd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.
        rS   r!   rT   r$   r'   rV   N)r   r,   r-   r.   rG   rH   rI   r4   r&   r$   r<   r3   r5   rW   rX   r/   rM   rN   r'   rC   )r   rU   r6   r7   rO   rP   rQ   rY   is_after_revisions_fromr@   r>   r?   r   r   r   !_test_migrate_revisions_from_date   s,   

z3BaseMigrationTest._test_migrate_revisions_from_date)T)__name__
__module____qualname__r   r)   r	    default_operation_and_block_pathapp_namer   r:   rC   rL   rR   rZ   r\   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      |    d S NrL   r   r   r   r   test_migrate_stream_data      z9TestNonPageModelWithoutRevisions.test_migrate_stream_dataN)r]   r^   r_   r   SampleModelrH   r   SampleModelFactoryr   r)   ra   rg   r   r   r   r   rb      s    rb   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 )TestPageTrc   c                 C   rd   re   rf   r   r   r   r   rg      rh   z!TestPage.test_migrate_stream_datac                 C   rd   re   )rR   r   r   r   r   test_migrate_revisions   rh   zTestPage.test_migrate_revisionsc                 C   rd   re   )rZ   r   r   r   r   -test_always_migrate_live_and_latest_revisions   rh   z6TestPage.test_always_migrate_live_and_latest_revisionsc                 C   rd   re   )r\   r   r   r   r    test_migrate_revisions_from_date   rh   z)TestPage.test_migrate_revisions_from_dateN)r]   r^   r_   r   
SamplePagerH   r   SamplePageFactoryr   r)   ra   rg   rl   rm   rn   r   r   r   r   rk      s    rk   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.
    Trc   c                 C   s   | j jdd dS )Nr#   )r'   r   create_batchr   r   r   r   r      s   z'TestNullStreamField._get_test_instancesc                    sP   t    t }|d| jjj d W d    d S 1 s!w   Y  d S )NzUPDATE z SET content = 'null')superr:   r   cursorexecuterH   _metadb_table)r   ru   	__class__r   r   r:      s   

"zTestNullStreamField.setUpc              	   C   sh   | j j jttdt d}|D ]}| j|d | |j	d W d   n1 s,w   Y  qdS )zF
        The raw JSON of all instances for this test is null.
        r'   rD   )r7   nullN)
rH   rI   r4   rJ   r   r   r   subTestr=   rE   )r   r6   r7   r   r   r   assert_null_content   s   z'TestNullStreamField.assert_null_contentc                 C   s   |    |   |    d S re   )r}   rG   r   r   r   r   rg      s   z,TestNullStreamField.test_migrate_stream_data)r]   r^   r_   __doc__r   ro   rH   r   rp   r   r)   ra   r   r:   r}   rg   __classcell__r   r   ry   r   rq      s    rq   c                   @   s0   e Zd ZejZejZdZ	dZ
dd Zdd ZdS )*StreamChildrenToListBlockOperationTestCaseTrc   c                 C   s   | j jdddS )N   Char Block 1)sizecontent__0__char1__valuerr   r   r   r   r   r     s   z>StreamChildrenToListBlockOperationTestCase._get_test_instancesc                 C   s   | j tddddfgd | jj jttdt dD ]1}|j	d }| 
|d	 d | 
t|d
 d | 
|d
 d d	 d | 
|d
 d d
 d qdS )aL  
        StreamChildrenToListBlockOperation doesn't share state across model instances.

        As a single operation instance is used to transform the data of multiple model
        instances, we should not store model instance state on the operation instance.
        See https://github.com/wagtail/wagtail/issues/12391.
        r   list1)
block_namelist_block_namer   )operations_and_block_pathsr'   rD   r   r;   valuer#   itemr   N)rG   r
   rH   rI   r4   rJ   r   r   r   rE   r=   len)r   r7   rB   r   r   r   &test_state_not_shared_across_instances  s"   	


zQStreamChildrenToListBlockOperationTestCase.test_state_not_shared_across_instancesN)r]   r^   r_   r   ro   rH   r   rp   r   r)   ra   r   r   r   r   r   r   r     s    r   )r-   rM   	django.dbr   django.db.modelsr   r   r   django.db.models.functionsr   django.testr   django.utilsr   $wagtail.blocks.migrations.operationsr	   r
   #wagtail.test.streamfield_migrationsr   r   -wagtail.test.streamfield_migrations.testutilsr   r   rb   rk   rq   r   r   r   r   r   <module>   s      '
+