File size: 2,948 Bytes
b701455
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

import unittest
from PIL import Image
import io
import base64
import time
import sys
import os
from pathlib import Path

# Add project root to sys.path
project_root = Path(__file__).resolve().parent.parent
sys.path.append(str(project_root))

from src.user.app_instance import AppInstance

class TestPreviewPipeline(unittest.TestCase):
    def setUp(self):
        self.app = AppInstance()

    def test_update_image_lazy(self):
        """Test that update_image stores images without converting to base64 immediately."""
        img1 = Image.new('RGB', (64, 64), color='red')
        img2 = Image.new('RGB', (64, 64), color='blue')
        
        self.app.update_image([img1, img2], step=5, total_steps=20)
        
        # Verify internal state
        self.assertEqual(len(self.app.preview_images), 2)
        self.assertEqual(self.app.preview_base64_cache, [])
        self.assertEqual(self.app.current_step, 5)
        self.assertEqual(self.app.total_steps, 20)
        self.assertGreater(self.app.last_preview_time, 0)

    def test_metadata_check(self):
        """Test lightweight metadata check."""
        img1 = Image.new('RGB', (64, 64), color='red')
        self.app.update_image([img1], step=2, total_steps=10)
        
        meta = self.app.get_preview_metadata()
        self.assertEqual(meta["step"], 2)
        self.assertEqual(meta["total_steps"], 10)
        self.assertTrue(meta["has_images"])
        self.assertGreater(meta["timestamp"], 0)

    def test_lazy_base64_conversion(self):
        """Test that base64 conversion happens on demand and is cached."""
        img1 = Image.new('RGB', (32, 32), color='green')
        self.app.update_image([img1], step=1, total_steps=10)
        
        # First call should trigger conversion
        previews = self.app.get_latest_previews()
        self.assertEqual(len(previews["base64"]), 1)
        self.assertTrue(previews["base64"][0].startswith("data:image/webp;base64,"))
        
        # Cache should now be populated
        cache_before = self.app.preview_base64_cache
        self.assertGreater(len(cache_before), 0)
        
        # Second call should use cache
        previews2 = self.app.get_latest_previews()
        self.assertIs(previews2["base64"], self.app.preview_base64_cache)
        
        # Invalidate cache with new update
        self.app.update_image([img1], step=2, total_steps=10)
        self.assertEqual(self.app.preview_base64_cache, [])

    def test_preview_format_and_quality(self):
        # Ensure preview format and quality preferences are respected
        img = Image.new('RGB', (64, 64), color='yellow')
        self.app.preview_format = 'JPEG'
        self.app.preview_quality = 85
        self.app.update_image([img], step=1, total_steps=10)
        previews = self.app.get_latest_previews()
        self.assertTrue(previews['base64'][0].startswith('data:image/jpeg;base64,'))

if __name__ == "__main__":
    unittest.main()