
    j                         d dl Zd dlmc mZ d dlZd dlZd dlm	Z	 d dl
Z
d dlmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZ de	defdZd	e	fd
Z d	e	defdZ!d Z"e
j#        $                    d e%e                    d             Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-de	de.e/eef                  fdZ0d Z1e
j#        $                    dg d          d             Z2d Z3d Z4d Z5dS )    N)Path)YouTubeAnalyticsCsvSanitizerbuild_learning_report_from_csvimport_youtube_analytics_csv)ALLOWED_UPLOAD_SCOPEBROAD_YOUTUBE_SCOPESBLOCKED_ENDPOINTS YOUTUBE_RAW_COMMENT_TEXT_ALLOWEDYouTubePrivateUploadPackagebuild_private_upload_packageenforce_upload_endpoint_allowedexecute_private_uploadparse_approval_commandvalidate_private_upload_gatevalidate_upload_token_scopes)mainpathreturnc                 |    dd l }|                    |                                                                           S )Nr   )hashlibsha256
read_bytes	hexdigest)r   r   s     X/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/tests/test_youtube_upload_only.py_shar      s3    NNN>>$//++,,66888    tmp_pathc                 r    | dz  }| dz  }|                     d           |                     d           ||fS )Nz	video.mp4z	thumb.pngs   video-bytess   thumb-bytes)write_bytesr   videothumbs      r   _media_filesr#   "   sH    {"E{"E	n%%%	n%%%%<r   c                     t          |           \  }}t          di ddddd|d|ddd	d
ddddddddddddddddddddS )Ncandidate_idzfake-invoiceversionv1
video_paththumbnail_pathtitlezFake Invoice Red Flagdescriptionz&Check the payment route before paying.tags)scaminvoicehashtags)z#ScamSafety
categoryId27selfDeclaredMadeForKidsFcontainsSyntheticMediaTlanguageensynthetic_media_reasonz/AI-assisted visuals and renderer-owned mockups.made_for_kids_reasonz%General adult digital safety content.claim_gate_resultvalidsafety_gate_result )r#   r   r    s      r   _packager<   *   s    ))LE5'   #^ 5 u	
 &% =< !  "! 4 !&  $t   QP ED "'  #7! r   c                  <   t          t          g          } | j        }d}||u }|st          j        d|fd||f          dt          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}| j        }t          f}||k    }|st          j        d|fd	||f          dt          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d S )
NTisz/%(py2)s
{%(py2)s = %(py0)s.is_safe
} is %(py5)sresultpy0py2py5assert %(py7)spy7==)z6%(py2)s
{%(py2)s = %(py0)s.granted_scopes
} == %(py5)s)r   r   is_safe
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationgranted_scopes)rA   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s         r   -test_token_with_youtube_upload_scope_acceptedrY   @   s   )+?*@AAF>!T!>T!!!!!!!!!!>T!!!!!!!!!!!!6!!!!!6!!!!!!>!!!!T!!!!!!!!!!!!!!!!!!!!!!!!!!! ;%9$;; $;;;;;;;;;;; $;;;;;;;;;;;;;6;;;;;6;;;;;; ;;;;$;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r   scopec                 p   t          t          | g          }|j        }d}||u }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}|j        }| |v }|st          j        d|fd	| |f          d
t          j                    v st          j        |           rt          j        |           nd
dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j
        |                    d x}}d}	|j        }|j        }
 |
            }|	|v }|st          j        d|fd|	|f          t          j        |	          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}	x}x}x}
}d S )NFr>   r@   rA   rB   rF   rG   in)z8%(py0)s in %(py4)s
{%(py4)s = %(py2)s.forbidden_scopes
}rZ   rC   rD   py4assert %(py6)spy6unsafe)zd%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.message
}.casefold
}()
})py1py3rE   rG   py9zassert %(py11)spy11)r   r   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   forbidden_scopesmessagecasefold)rZ   rA   rT   rU   rV   rW   rX   @py_format5@py_format7@py_assert0@py_assert6@py_assert8@py_assert2@py_format10@py_format12s                  r   -test_token_with_broad_youtube_scopes_rejectedrr   G   s   )+?*GHHF>"U">U"""""""""">U""""""""""""6"""""6"""""">""""U"""""""""""""""""""""""""""++5+++++++++++5+++++++++++++5+++++5+++++++++++++F+++++F++++++++++++++++++++++++++++++++0v~0~.0..0008000000000008000000800000000000v00000v000000~0000.00000000000000000000000000000000000000r   c                     dD ]T} t          |           }|j        }d}||u }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|j
        }|sxd	dt	          j                    v st          j        |          rt          j        |          ndt          j        |          d
z  }t          t          j	        |                    d }Vd S )N)zanalytics.reports.querycommentThreads.listcomments.listFr>   )z/%(py2)s
{%(py2)s = %(py0)s.allowed
} is %(py5)srA   rB   rF   rG   z2assert %(py2)s
{%(py2)s = %(py0)s.blocked_reason
})rC   rD   )r   allowedrK   rL   rM   rN   rO   rP   rQ   rR   blocked_reason)endpointrA   rT   rU   rV   rW   rX   @py_format3s           r   ;test_upload_only_mode_cannot_call_analytics_or_comments_apirz   P   s   W % %0::~&&~&&&&&&&&&&~&&&&&&&&&&&&v&&&&&v&&&&&&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$$$$$$$$$$$v$$$$$v$$$$$$$$$$$$$$$$$$$$$$$$$% %r   c                     d} t           | u }|st          j        d|fdt           | f          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |           dz  }dd|iz  }t          t          j        |                    d x}} d}|t          v } | st          j        d	| fd
|t          f          t          j        |          dt          j                    v st          j        t                    rt          j        t                    nddz  }dd|iz  }t          t          j        |                    d x}} t          d          }|j        }d}||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )NFr>   )z%(py0)s is %(py3)sr
   )rC   rd   assert %(py5)srE   rt   r\   z%(py1)s in %(py3)sr	   rc   rd   ru   z)Raw YouTube comments are forbidden input.rH   )z6%(py2)s
{%(py2)s = %(py0)s.blocked_reason
} == %(py5)srA   rB   rF   rG   )r
   rK   rL   rM   rN   rO   rP   rQ   rR   r	   r   rw   )	ro   rT   @py_format4rW   rl   rA   rU   rV   rX   s	            r   0test_raw_comment_text_rule_and_endpoints_blockedr   W   s   /44+u4444444444+u444444444444+44444+444444u4444444444444444444444444 5 $55555555555 $555555 55555555555$555555$5555555555555555555555555555,_==F O$OO $OOOOOOOOOOO $OOOOOOOOOOOOO6OOOOO6OOOOOO OOOO$OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr   c           	      @   t          |           }|                    d          }|                    d          }|                    d          }d}d}t          ||          }|j        }||v }	|	st	          j        d|	fd	||f          t	          j        |          d
t          j                    v st	          j	        t                    rt	          j        t                    nd
dt          j                    v st	          j	        |          rt	          j        |          ndt	          j        |          t	          j        |          t	          j        |          dz  }
dd|
iz  }t          t	          j        |                    d x}x}	x}x}}d}d}t          ||          }|j        }||v }	|	st	          j        d|	fd	||f          t	          j        |          d
t          j                    v st	          j	        t                    rt	          j        t                    nd
dt          j                    v st	          j	        |          rt	          j        |          ndt	          j        |          t	          j        |          t	          j        |          dz  }
dd|
iz  }t          t	          j        |                    d x}x}	x}x}}d}d}t          ||          }|j        }||v }	|	st	          j        d|	fd	||f          t	          j        |          d
t          j                    v st	          j	        t                    rt	          j        t                    nd
dt          j                    v st	          j	        |          rt	          j        |          ndt	          j        |          t	          j        |          t	          j        |          dz  }
dd|
iz  }t          t	          j        |                    d x}x}	x}x}}d S )Npublic)privacyStatusunlistedz2030-01-01T00:00:00Z)	publishAtzprivacyStatus=public is blocked r\   zW%(py1)s in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py3)s(%(py4)s, %(py6)s)
}.errors
}r   rc   rd   r_   ra   py8py10assert %(py12)spy12z!privacyStatus=unlisted is blockedzpublishAt must be absent	scheduled)r<   with_updatesr   errorsrK   rL   rP   rM   rN   rO   rQ   rR   )r   packager   r   r   rl   @py_assert5@py_assert7@py_assert9ro   @py_format11@py_format13s               r   +test_public_unlisted_and_publish_at_blockedr   ^   s~   x  G!!!99F##*#==H$$/E$FFI,_UW_0LVUW0X0X_0X0__,0___________,0______,___________0L_____0L_____________V_____V______UW____0X____0________________________________.cY[c2NxY[2\2\c2\2cc.2ccccccccccc.2cccccc.ccccccccccc2Nccccc2NcccccccccccccxcccccxccccccY[cccc2\cccc2cccccccccccccccccccccccccccccccc%[QS[)EiQS)T)T[)T)[[%)[[[[[[[[[[[%)[[[[[[%[[[[[[[[[[[)E[[[[[)E[[[[[[[[[[[[[i[[[[[i[[[[[[QS[[[[)T[[[[)[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[r   c           	      J   t          |           }|                    d          }|                    d           }|                    d           }d t          |d          j        D             }t	          |          }|sddt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          t          j	        |          d	z  }t          t          j        |                    d x}}d
}d}	t          ||	          }
|
j        }||v }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    nddt          j                    v st          j        |          rt          j	        |          ndt          j	        |	          t          j	        |
          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}	x}
}d}d}	t          ||	          }
|
j        }||v }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    nddt          j                    v st          j        |          rt          j	        |          ndt          j	        |	          t          j	        |
          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}	x}
}d S )N@0000000000000000000000000000000000000000000000000000000000000000)video_sha256)r3   )r2   c              3      K   | ]}d |v V  	dS )zvideo_sha256 mismatchNr;   ).0es     r   	<genexpr>zEtest_hash_mismatch_and_missing_disclosures_blocked.<locals>.<genexpr>o   s(      gg&!+ggggggr   r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr^   z"containsSyntheticMedia is requiredr\   r   r   missing_synthr   r   r   z#selfDeclaredMadeForKids is requiredmissing_kids)r<   r   r   r   r   rM   rN   rK   rO   rP   rQ   rR   rL   )r   r   bad_hashr   r   rT   rV   rj   rl   r   r   r   ro   r   r   s                  r   2test_hash_mismatch_and_missing_disclosures_blockedr   i   s   x  G###::H(((EEM'''EELgg5QRZ\^5_5_5fgggg3gggggggggggggggg3ggggg3ggggggggggggggggggggggggggggggg/i_ai3OP]_a3b3bi3b3ii/3iiiiiiiiiii/3iiiiii/iiiiiiiiiii3Oiiiii3OiiiiiiiiiiiiiP]iiiiiP]iiiiii_aiiii3biiii3iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0i_ai4PQ]_a4b4bi4b4ii04iiiiiiiiiii04iiiiii0iiiiiiiiiii4Piiiii4PiiiiiiiiiiiiiQ]iiiiiQ]iiiiii_aiiii4biiii4iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiir   c                 D   t          |           }d}t          ||          }|j        }d}||u }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d	}	|j        }|	|v }
|
st          j        d
|
fd|	|f          t          j        |	          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j
        |                    d x}	x}
}d S )NzDAPPROVED_FOR_PRIVATE_YOUTUBE_UPLOAD fake-invoice v1 deadbeef badpackFr>   )z0%(py2)s
{%(py2)s = %(py0)s.is_valid
} is %(py5)srA   rB   rF   rG   z&approval command is missing or invalidr\   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.errors
})rc   rd   rE   )r<   r   is_validrK   rL   rM   rN   rO   rP   rQ   rR   r   )r   r   wrongrA   rT   rU   rV   rW   rX   rl   ro   s              r   -test_execute_requires_exact_explicit_approvalr   t   s   x  GRE)'599F?#e#?e##########?e############6#####6######?####e###########################3Dv}D3}DDDDDDDDDD3}DDDDD3DDDDDDDDDDDvDDDDDvDDDDDD}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDr   c                 f   t          |           }|j        }g  G fdd          }t          || |            t          g          }d D             }ddg}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          d	z  }d
d|iz  }	t          t	          j        |	                    d x}x}}d         d         d         d         }d}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          d	z  }d
d|iz  }	t          t	          j        |	                    d x}x}}d         d         }d}||u }|slt	          j        d|fd||f          t	          j        |          t	          j        |          d	z  }d
d|iz  }	t          t	          j        |	                    d x}x}}|j	        }
d}|
|k    }|st	          j        d|fd|
|f          dt          j                    v st	          j        |          rt	          j        |          ndt	          j        |
          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}
x}}|j        }
d}|
|u }|st	          j        d|fd|
|f          dt          j                    v st	          j        |          rt	          j        |          ndt	          j        |
          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}
x}}|j        }
d}|
|u }|st	          j        d|fd|
|f          dt          j                    v st	          j        |          rt	          j        |          ndt	          j        |
          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}
x}}d S )Nc                   $    e Zd Z fdZ fdZdS )]test_execute_private_upload_calls_only_insert_and_thumbnail_when_approved.<locals>.FakeClientc                L                         d|||f           d|d         dS )Nvideos.insertabc123status)idr   append)selfbody
media_pathnotifySubscriberscallss       r   videos_insertzktest_execute_private_upload_calls_only_insert_and_thumbnail_when_approved.<locals>.FakeClient.videos_insert   s1    LL/4=NOPPP"d8n===r   c                F                         d||f           ddddiigiS )Nthumbnails.setitemsdefaulturllocalr   )r   video_idr   r   s      r   thumbnails_setzltest_execute_private_upload_calls_only_insert_and_thumbnail_when_approved.<locals>.FakeClient.thumbnails_set   s5    LL*HjABBBy5'*:;<==r   N)__name__
__module____qualname__r   r   )r   s   r   
FakeClientr      sG        	> 	> 	> 	> 	>	> 	> 	> 	> 	> 	> 	>r   r   )youtube_clienttoken_scopesc                     g | ]
}|d          S )r   r;   )r   cs     r   
<listcomp>z]test_execute_private_upload_calls_only_insert_and_thumbnail_when_approved.<locals>.<listcomp>   s       QAaD   r   r   r   rH   z%(py1)s == %(py4)src   r_   r`   ra   r      r   r   private   Fr>   )z%(py1)s is %(py4)s)z5%(py2)s
{%(py2)s = %(py0)s.privacyStatus
} == %(py5)sauditrB   rF   rG   )z>%(py2)s
{%(py2)s = %(py0)s.public_publish_allowed
} is %(py5)sT)z>%(py2)s
{%(py2)s = %(py0)s.manual_review_required
} is %(py5)s)r<   approval_commandr   r   rK   rL   rP   rQ   rR   r   rM   rN   rO   public_publish_allowedmanual_review_required)r   r   approvalr   r   rl   rV   ro   rj   rk   rT   rU   rW   rX   r   s                 @r   Itest_execute_private_upload_calls_only_insert_and_thumbnail_when_approvedr   ~   s4   x  G'HE> > > > > > > > > > #7HZZ\\au`vwwwE  %   G_6F$GG $GGGGGGGGGGG $GGGGGG GGGG$GGGGGGGGGGGGGGGGGGGGGGGGGGGG8A;x 1>Y>1Y>>>>>>>>>>1Y>>>>>1>>>>Y>>>>>>>>>>>>>>>>>>>>>>>>>>>8A;%;%;%;%+)+)++++++++++)++++++++++++5+++++5++++++++++)+++++++++++++++++++++++++++'050'50000000000'50000000000005000005000000'00005000000000000000000000000000'/4/'4//////////'4////////////5/////5//////'////4/////////////////////////////r   c                 `   t          |           }| dz  }|                    |                                           |                    dt	          |                      |j        g}t          |          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dz  }	dd	|	iz  }
t          t          j        |
                    d x}x}x}}|                                j        }d
}||v }|st          j        d|fd||f          t          j        |          dt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}}d S )Nz#youtube_private_upload_package.jsonAUTOSHORTS_YOUTUBE_PACKAGE_DIRr   rH   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sdry_run_main)rC   rD   r_   rG   assert %(py9)sre   zprivacyStatus=privater\   r}   outr~   r|   rE   z&No external API write action performed)r<   
write_textto_jsonsetenvstrr%   r   rK   rL   rM   rN   rO   rP   rQ   rR   
readouterrr   )r   monkeypatchcapsysr   	pack_pathrT   rV   rm   r   rX   rp   r   rl   ro   r   rW   s                   r   'test_dry_run_makes_no_external_api_callr      s    x  G@@I**+++7XGGG -.4<.//414/14444444444/1444444444444<44444<444444.4444/4444144444444444444444444444444444





!C")"c))))))))))"c)))))")))))))))))c)))))c)))))))))))))))))))))))))))3:3s::::::::::3s:::::3:::::::::::s:::::s:::::::::::::::::::::::::::::r   rowsc                 0   |                      ddd          5 }t          j        |t          |d                                                             }|                                 |                    |           d d d            d S # 1 swxY w Y   d S )Nwr   zutf-8)newlineencodingr   )
fieldnames)opencsv
DictWriterlistkeyswriteheader	writerows)r   r   fwriters       r   
_write_csvr      s    	3W	5	5 d47<<>>.B.BCCC                 s   A%BBBc           	         | dz  }t          |ddddddg           t          |          }|d         d	         }d}||k    }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         d         }d}||k    }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )Nanalytics.csvr'   c11003z	Good hook)r   r%   viewscomments_countnotes_by_userr   r   rH   r   r   r`   ra   r   )r   r   rK   rL   rP   rQ   rR   )r   csv_pathr   rl   rV   ro   rj   rk   s           r   %test_csv_with_allowed_metrics_importsr      s   /)HxtTEeh  |G  H  H  I  J  J  J'11D7#$++$++++++++++$+++++$+++++++++++++++++++++++++++++++7?#2{2#{2222222222#{22222#2222{22222222222222222222222222222r   column)comment_textauthorr   linkexternal_textc                    | dz  }t          |dd|dig           t          j        t                    5 }t	          |           d d d            n# 1 swxY w Y   |j        }t          |          }||v }|s0t          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          nddt          j
                    v st          j        t                    rt          j        t                    ndd	t          j
                    v st          j        |          rt          j        |          nd	t          j        |          t          j        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}d}	|j        }
t          |
          }|	|v}|st          j        d|fd|	|f          t          j        |	          dt          j
                    v st          j        t                    rt          j        t                    ndd	t          j
                    v st          j        |          rt          j        |          nd	t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}	x}x}
}d S )Nzbad.csvr   r'   zsecret raw textr\   )zK%(py0)s in %(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.value
})
}r   r   exc)rC   rD   rd   rE   rG   r   re   not inzO%(py1)s not in %(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.value
})
}rc   rd   r_   ra   r   assert %(py10)sr   )r   pytestraises
ValueErrorr   valuer   rK   rL   rM   rN   rO   rP   rQ   rR   )r   r   r   r  rU   rm   rT   rX   rp   rl   r   r   ro   @py_format9r   s                  r   >test_csv_with_forbidden_columns_blocks_without_showing_contentr     s1   )#Hx:tV5FGHIII	z	"	" /c$X.../ / / / / / / / / / / / / / / #S^^#6^##########6^############6#####6#############S#####S############################^###########################2	2C	NN2N2222222222N2222222222222222C22222C222222222222222222222222	2222N2222222222222222222222222222222s   AAAc                 h   | dz  }t          |dddg           t          j        t                    5 }t	          |           d d d            n# 1 swxY w Y   d}|j        }t          |          }||v }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    ndd	t          j                    v st          j        |          rt          j	        |          nd	t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}x}}d}|j        }t          |          }||v}|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    ndd	t          j                    v st          j        |          rt          j	        |          nd	t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}x}}d S )Nzbad_unknown.csvr'   zdo this external command)r   viewer_messager  r\   )zK%(py1)s in %(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.value
})
}r   r  r  r  r   zdo thisr  r  )r   r  r  r	  r   r
  r   rK   rL   rP   rM   rN   rO   rQ   rR   )	r   r   r  rl   r   r   ro   r  r   s	            r   (test_unknown_external_text_column_blocksr     s   ++Hxt?YZZ[\\\	z	"	" /c$X.../ / / / / / / / / / / / / / / -39-s9~~-~----------~----------------s-----s-------------3-----3------9----~-----------------------------*	*C	NN*9N**********9N*****9***********C*****C************************	****N*******************************s   AAAc                    | dz  }t          |dddg           t          |          }|d         d         }t          |          }t          j        }||k    }|st          j        d|fd||f          d	t          j                    v st          j	        t                    rt          j
        t                    nd	t          j
        |          t          j
        |          d
t          j                    v st          j	        t                    rt          j
        t                    nd
t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}}d S )Nz	notes.csvr'   ^  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r   r   r   r   rH   )zU%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py8)s
{%(py8)s = %(py6)s.NOTES_MAX_CHARS
}lenr   )rC   rD   r_   ra   r   r  r   )r   r   r  r   NOTES_MAX_CHARSrK   rL   rM   rN   rO   rP   rQ   rR   )	r   r   r   rT   rV   r   r   r  r   s	            r    test_notes_by_user_length_cappedr     s   +%HxtiHHIJJJ'11DAw'X3'((X,H,XX(,XXXXXXXXXXX(,XXXXXXXXXXXXX3XXXXX3XXXXXX'XXXX(XXXXXXXXXXX,HXXXXX,HXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   c                    | dz  }t          |dddddddd	g           |                    d
d           t          |          }d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j
        |                    d x}}d}|j        } |            }	||	v}|st          j        d|fd||	f          t          j        |          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j
        |                    d x}x}x}}	d}||v}|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j
        |                    d x}}d}|j        } |            }	||	v }|st          j        d|fd||	f          t          j        |          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j
        |                    d x}x}x}}	d S )Nr   r'   r   zOur uploaded titler   102zManual summary only)r   r%   r*   r   sharesr   r   YOUTUBE_API_KEYzshould-not-be-usedr\   r}   reportr~   r|   rE   zcomment textr  )zK%(py1)s not in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.casefold
}()
})rc   rd   rE   rG   r   re   zYouTube API)z%(py1)s not in %(py3)szno external api calls)zG%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.casefold
}()
})r   r   r   rK   rL   rP   rM   rN   rO   rQ   rR   ri   )r   r   r   r  rl   ro   r   rW   rU   rm   rX   rp   s               r   Ntest_learning_report_never_includes_raw_external_text_and_calls_no_youtube_apir     s   /)HxtTL`kp  }A  UX  k@  A  A  B  C  C  C(*>???+H55F * F********** F***** ***********F*****F***************************22!2!22>!22222222222>!222222>22222222222222222222222222!222222222222222222222222222222&=&&&&&&&&&&=&&&&&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"7fo7oo&7&77"&77777777777"&777777"77777777777f77777f777777o7777&77777777777777777777777777777777r   )6builtinsrM   _pytest.assertion.rewrite	assertionrewriterK   r   jsonpathlibr   r   autoshorts.youtube.analytics_csvr   r   r   autoshorts.youtube.upload_onlyr   r   r	   r
   r   r   r   r   r   r   r   -autoshorts.cli.youtube_private_upload_dry_runr   r   r   r   r#   r<   rY   markparametrizesortedrr   rz   r   r   r   r   r   r   r   dictr   r   r  r  r  r  r;   r   r   <module>r)     s                



                 
                          O N N N N N9t 9 9 9 9 94    t  ;    ,< < < &&)=">">??1 1 @?1% % %P P P\ \ \j j jE E E0 0 00	; 	; 	;T d38n!5    3 3 3 #]#]#]^^3 3 _^3+ + +Y Y Y
8 
8 
8 
8 
8r   