Files
verstack/tests/test_preview.py

42 lines
2.9 KiB
Python

import json,pathlib,shutil,subprocess,sys,tempfile,unittest
sys.path.insert(0,str(pathlib.Path(__file__).resolve().parents[1]/'plugins'))
import media_preview
from PIL import Image
class PreviewTests(unittest.TestCase):
@unittest.skipUnless(shutil.which('ffmpeg') and shutil.which('ffprobe'), 'FFmpeg tools required')
def test_compatible_video_is_verified_without_reencoding(self):
with tempfile.TemporaryDirectory() as root:
root=pathlib.Path(root);source=root/'input';output=root/'output';source.mkdir();output.mkdir()
video=source/'source.mp4'
subprocess.run(['ffmpeg','-v','error','-f','lavfi','-i','color=c=blue:s=32x32:r=10',
'-t','0.3','-c:v','libx264','-threads','1','-pix_fmt','yuv420p',str(video)],check=True)
shutil.copyfile(video,source/'duplicate.mp4')
result=media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(output),
'settings':{},'workspace_bytes':1024*1024})
self.assertEqual(result['coverage'],'complete')
evidence=json.loads((output/'preview-evidence.json').read_text())['previews']
self.assertEqual(len(evidence),2)
self.assertTrue(all(row['status']=='verified_source' for row in evidence))
self.assertEqual(evidence[0]['source_sha256'],evidence[1]['source_sha256'])
self.assertEqual(list(output.rglob('*.mp4')),[])
def test_thumbnail_readback_and_failed_outputs(self):
with tempfile.TemporaryDirectory() as root:
root=pathlib.Path(root);source=root/'input';output=root/'output';source.mkdir();output.mkdir()
Image.new('RGB',(1600,400),'red').save(source/'wide.png')
(source/'broken.png').write_bytes(b'\x89PNG\r\n\x1a\ntruncated')
result=media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(output),'settings':{},'workspace_bytes':1024*1024})
self.assertEqual(result['coverage'],'partial')
evidence=json.loads((output/'preview-evidence.json').read_text())['previews']
good=next(r for r in evidence if r['source']=='wide.png')
self.assertEqual(good['status'],'verified');self.assertEqual(good['processing_revision'],3)
with Image.open(output/good['preview']) as image:self.assertEqual(image.size,(320,80))
self.assertEqual(next(r for r in evidence if r['source']=='broken.png')['status'],'failed')
self.assertFalse((output/'previews/broken.png.webp').exists())
filtered=root/'filtered';filtered.mkdir()
media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(filtered),'settings':{'include_extensions':['.mp4']},'workspace_bytes':1024*1024})
self.assertEqual(json.loads((filtered/'preview-evidence.json').read_text())['previews'],[])
if __name__=='__main__':unittest.main()