Files
Magent/backend/tests/test_request_language.py
T
Assclaw 38169b881e
Magent CI/CD / verify (push) Successful in 1m54s
Magent CI/CD / deploy-prod (push) Skipped
Magent CI/CD / deploy-beta (push) Skipped
Support original-language movie requests and fix repair dialog layout
2026-09-11 18:05:18 +12:00

68 lines
4.2 KiB
Python

import copy
import unittest
from types import SimpleNamespace
from unittest.mock import AsyncMock, patch
from fastapi import HTTPException
from backend.app.services.request_language import language_info, original_profile, is_original_profile
from backend.app.routers import requests
class RequestLanguageTests(unittest.IsolatedAsyncioTestCase):
def test_metadata_is_not_audio_evidence(self):
for code in ('en', '', 'xx', 'invalid'):
self.assertIsNone(language_info({'originalLanguage': code}))
self.assertEqual(language_info({'original_language': 'es'}), {'code': 'es'})
async def test_copy_preserves_quality_and_reuses_verified_profile(self):
default = {'id': 6, 'name': 'HD', 'language': {'id': 1, 'name': 'English'},
'items': [{'quality': {'id': 7}, 'allowed': True}], 'minFormatScore': 50,
'formatItems': [{'format': 10, 'score': -1000}], 'upgradeAllowed': True}
original = copy.deepcopy(default)
client = SimpleNamespace(get_quality_profiles=AsyncMock(return_value=[default]), post=AsyncMock(return_value={'id': 20}))
self.assertEqual(await original_profile(client, 6), 20)
payload = client.post.await_args.kwargs['payload']
self.assertEqual(payload['language']['id'], -2)
self.assertEqual(payload['items'], default['items'])
self.assertEqual(payload['formatItems'], default['formatItems'])
self.assertEqual(payload['minFormatScore'], 50)
self.assertEqual(default, original)
self.assertTrue(is_original_profile(payload))
client.get_quality_profiles.return_value.append({**payload, 'id': 20})
self.assertEqual(await original_profile(client, 6), 20)
self.assertEqual(client.post.await_count, 1)
payload['minFormatScore'] = 0
self.assertFalse(is_original_profile(payload))
async def test_missing_default_never_creates_profile(self):
client = SimpleNamespace(get_quality_profiles=AsyncMock(return_value=[]), post=AsyncMock())
with self.assertRaises(HTTPException):
await original_profile(client, 6)
client.post.assert_not_awaited()
async def test_only_explicit_verified_movie_consent_changes_destination(self):
runtime = SimpleNamespace(jellyseerr_base_url='http://seerr', jellyseerr_api_key='key',
radarr_base_url='http://radarr', radarr_api_key='key')
seerr = SimpleNamespace(configured=lambda: True, get_movie=AsyncMock(), get_tv=AsyncMock(),
create_request=AsyncMock(return_value={'status': 1}))
for code, consent, media_type, expected in [('es', True, 'movie', 20), ('es', False, 'movie', 6),
('en', True, 'movie', None), ('es', 'yes', 'movie', None),
('ja', True, 'tv', 6)]:
details = {'title': 'Title', 'originalLanguage': code, 'seasons': [{'seasonNumber': 1}]}
seerr.get_movie.return_value = seerr.get_tv.return_value = details
seerr.create_request.reset_mock()
with patch.object(requests, 'get_runtime_settings', return_value=runtime), \
patch.object(requests, 'JellyseerrClient', return_value=seerr), \
patch.object(requests, '_resolve_request_destination', new=AsyncMock(return_value={'server_id': 1, 'profile_id': 6, 'root_folder': '/media'})), \
patch.object(requests, 'original_profile', new=AsyncMock(return_value=20)) as clone:
payload = {'mediaType': media_type, 'tmdbId': 1417, 'acceptOriginalLanguage': consent, 'seasons': [1]}
if expected is None:
with self.assertRaises(HTTPException):
await requests.create_request(payload, {'username': 'viewer'})
seerr.create_request.assert_not_awaited()
clone.assert_not_awaited()
else:
await requests.create_request(payload, {'username': 'viewer'})
self.assertEqual(seerr.create_request.await_args.kwargs['profile_id'], expected)
self.assertEqual(clone.await_count, int(expected == 20))