Files
plezy/test/services/plex_image_url_test.dart
T

84 lines
2.8 KiB
Dart

import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/database/app_database.dart';
import 'package:plezy/services/plex_api_cache.dart';
import 'package:plezy/services/plex_client.dart';
import 'package:plezy/utils/media_image_helper.dart';
import '../test_helpers/backend_client_fixtures.dart';
void main() {
late AppDatabase db;
late PlexClient client;
setUp(() {
db = AppDatabase.forTesting(NativeDatabase.memory());
PlexApiCache.initialize(db);
client = testPlexClient();
});
tearDown(() async {
client.close();
await db.close();
});
// Verified against PMS 1.43: `minSize=1&upscale=1` scales until the smaller
// axis reaches the request and returns the whole image (a 4313x1035 logo
// asked for at 1200x360 comes back 1500x360), while `minSize=0&upscale=0`
// fits the longer axis inside the box (1200x288). Neither crops, so this is
// purely about not fetching pixels that BoxFit.contain will discard.
group('PlexClient transcode sizing flags', () {
test('slot-filling artwork covers the requested box', () {
final url = client.thumbnailUrl('/library/metadata/1/thumb/2', width: 400, height: 600);
expect(url, contains('minSize=1'));
expect(url, contains('upscale=1'));
});
test('contain artwork fits inside the requested box', () {
final url = client.thumbnailUrl('/library/metadata/1/clearLogo', width: 1200, height: 360, cover: false);
expect(url, contains('minSize=0'));
expect(url, contains('upscale=0'));
expect(url, contains('width=1200'));
expect(url, contains('height=360'));
});
test('proxied external images honour the same flag', () {
final covering = client.externalImageUrl('https://epg.example/logo.png', width: 200, height: 200);
final fitting = client.externalImageUrl('https://epg.example/logo.png', width: 200, height: 200, cover: false);
expect(covering, contains('minSize=1'));
expect(fitting, contains('minSize=0'));
});
test('logo slots reach the client as fitting requests', () {
final url = MediaImageHelper.getOptimizedImageUrl(
client: client,
thumbPath: '/library/metadata/1/clearLogo',
maxWidth: 400,
maxHeight: 120,
devicePixelRatio: 3,
imageType: ImageType.heroLogo,
);
expect(url, contains('minSize=0'));
expect(url, contains('upscale=0'));
});
test('poster slots stay covering requests', () {
final url = MediaImageHelper.getOptimizedImageUrl(
client: client,
thumbPath: '/library/metadata/1/thumb/2',
maxWidth: 200,
maxHeight: 300,
devicePixelRatio: 2,
imageType: ImageType.poster,
);
expect(url, contains('minSize=1'));
expect(url, contains('upscale=1'));
});
});
}