mirror of
https://github.com/vesper8/Quest2Frame.git
synced 2026-10-08 02:01:10 +02:00
59 lines
3.3 KiB
Python
59 lines
3.3 KiB
Python
# SPDX-License-Identifier: GPL-3.0-only
|
|
import json
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock, patch
|
|
from batch import run_batch
|
|
|
|
def item(package):
|
|
return dict(package=package,options=dict(title='',scale=100,steam_id='',controllers=True,foveation=True),status='Queued',error='',backup='',build='')
|
|
|
|
class BatchTests(unittest.TestCase):
|
|
def test_partial_failure_continues_and_saved_backup_is_reused(self):
|
|
items=[item('com.test.one'),item('com.test.two')];bridge=MagicMock();save=MagicMock()
|
|
bridge.backup.side_effect=['backup-one','backup-two']
|
|
bridge.convert.side_effect=[RuntimeError('bad APK'),'build-two']
|
|
run_batch(items,'convert',bridge,'quest',{},False,save)
|
|
self.assertEqual([i['status'] for i in items],['Failed','Ready'])
|
|
self.assertEqual(items[0]['backup'],'backup-one')
|
|
bridge.backup.reset_mock();bridge.convert.side_effect=None;bridge.convert.return_value='build-one'
|
|
run_batch(items,'convert',bridge,'quest',{},False,save)
|
|
bridge.backup.assert_not_called()
|
|
self.assertEqual([i['build'] for i in items],['build-one','build-two'])
|
|
self.assertGreater(save.call_count,4)
|
|
|
|
def test_install_uses_distinct_options_and_continues(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
items=[item('com.test.one'),item('com.test.two')]
|
|
for index,entry in enumerate(items):
|
|
folder=Path(tmp)/str(index);folder.mkdir();entry['build']=str(folder)
|
|
(folder/'game.json').write_text(json.dumps({'package':entry['package'],'title':'APK title'}))
|
|
entry['options']['scale']=75+index*50
|
|
entry['options']['steam_id']=str(100+index)
|
|
bridge=MagicMock();bridge.install.side_effect=[RuntimeError('connection lost'),('remote',1)]
|
|
run_batch(items,'install',bridge,None,{'host':'frame'},True,lambda:None)
|
|
self.assertEqual([i['status'] for i in items],['Failed','Installed'])
|
|
self.assertEqual([c.args[3] for c in bridge.install.call_args_list],['100','101'])
|
|
for index,entry in enumerate(items):
|
|
game=json.loads((Path(entry['build'])/'game.json').read_text())
|
|
self.assertEqual(game['scale'],75+index*50)
|
|
self.assertEqual(game['title'],'APK title')
|
|
|
|
def test_package_mismatch_not_installed(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
entry=item('com.test.one');entry['build']=tmp
|
|
(Path(tmp)/'game.json').write_text(json.dumps({'package':'com.test.other'}))
|
|
bridge=MagicMock();run_batch([entry],'install',bridge,None,{},False,lambda:None)
|
|
bridge.install.assert_not_called();self.assertEqual(entry['status'],'Failed')
|
|
|
|
def test_artwork_failure_does_not_fail_conversion(self):
|
|
bridge=MagicMock();bridge.backup.return_value='backup'
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
bridge.convert.return_value=tmp
|
|
(Path(tmp)/'game.json').write_text(json.dumps({'title':'Test'}))
|
|
entry=item('com.test.one')
|
|
with patch('batch.artwork_candidates',side_effect=TimeoutError()):
|
|
run_batch([entry],'convert',bridge,'quest',{},False,lambda:None,True)
|
|
self.assertEqual(entry['status'],'Ready')
|