84 lines
2.8 KiB
Dart
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'));
|
|
});
|
|
});
|
|
}
|