feat: swipeable media pager, favorite artists, optimized video preview, Gitea updates and v2.0.2 release

This commit is contained in:
2026-09-03 18:09:38 +03:00
parent cc5a1a4f82
commit e419c7ad78
23 changed files with 837 additions and 266 deletions
+10 -25
View File
@@ -82,16 +82,9 @@ void main() {
expect(providers.map((provider) => provider.id), [
'gelbooru',
'rule34',
'safebooru',
'konachan',
'yandere',
'realbooru',
'e621',
'e926',
'realbooru',
'xbooru',
'paheal',
'kemono',
'coomer',
'pawchive',
]);
final pawchive =
@@ -104,21 +97,13 @@ void main() {
expect(realbooru.enabled, isTrue);
expect(realbooru.apiType, 'realbooru_html');
expect(realbooru.baseUrl, 'https://realbooru.com');
expect(providers.where((provider) => provider.id == 'cosbooru'), isEmpty);
final xbooru = providers.singleWhere((provider) => provider.id == 'xbooru');
expect(xbooru.enabled, isTrue);
expect(xbooru.baseUrl, 'https://xbooru.com');
expect(xbooru.apiType, 'gelbooru');
final paheal = providers.singleWhere((provider) => provider.id == 'paheal');
expect(paheal.enabled, isTrue);
expect(paheal.baseUrl, 'https://rule34.paheal.net');
expect(paheal.apiType, 'paheal');
final kemono = providers.singleWhere((provider) => provider.id == 'kemono');
final coomer = providers.singleWhere((provider) => provider.id == 'coomer');
expect(kemono.enabled, isTrue);
expect(kemono.apiType, 'kemono');
expect(coomer.enabled, isFalse);
expect(coomer.apiType, 'coomer');
expect(providers.where((provider) => provider.id == 'safebooru'), isEmpty);
expect(providers.where((provider) => provider.id == 'konachan'), isEmpty);
expect(providers.where((provider) => provider.id == 'yandere'), isEmpty);
expect(providers.where((provider) => provider.id == 'xbooru'), isEmpty);
expect(providers.where((provider) => provider.id == 'paheal'), isEmpty);
expect(providers.where((provider) => provider.id == 'kemono'), isEmpty);
expect(providers.where((provider) => provider.id == 'coomer'), isEmpty);
});
test('provider repository disables old CosBooru config without deleting it',
@@ -157,11 +142,11 @@ void main() {
providerRepository: providerRepository,
);
await service.saveEnabledProviders(['safebooru']);
await service.saveEnabledProviders(['realbooru']);
final providers = (await providerRepository.getProviders() as Success).data;
expect(
providers.singleWhere((provider) => provider.id == 'safebooru').enabled,
providers.singleWhere((provider) => provider.id == 'realbooru').enabled,
isTrue);
expect(
providers.singleWhere((provider) => provider.id == 'gelbooru').enabled,
+26 -22
View File
@@ -231,13 +231,13 @@ void main() {
expect(posts.single.rating, 'unknown');
});
test('seed providers include Realbooru HTML Paheal and exclude CosBooru', () {
final paheal = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'paheal')
test('seed providers include Realbooru HTML Pawchive and exclude deprecated providers', () {
final pawchive = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'pawchive')
.single;
expect(paheal.enabled, isTrue);
expect(paheal.apiType, 'paheal');
expect(paheal.baseUrl, 'https://rule34.paheal.net');
expect(pawchive.enabled, isTrue);
expect(pawchive.apiType, 'pawchive');
expect(pawchive.baseUrl, 'https://pawchive.pw');
final realbooru = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'realbooru')
.single;
@@ -249,22 +249,26 @@ void main() {
.where((provider) => provider.id == 'cosbooru'),
isEmpty,
);
final xbooru = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'xbooru')
.single;
expect(xbooru.enabled, isTrue);
expect(xbooru.apiType, 'gelbooru');
expect(xbooru.baseUrl, 'https://xbooru.com');
final kemono = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'kemono')
.single;
final coomer = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'coomer')
.single;
expect(kemono.enabled, isTrue);
expect(kemono.apiType, 'kemono');
expect(coomer.enabled, isFalse);
expect(coomer.apiType, 'coomer');
expect(
ProviderRepository.seedProviders()
.where((provider) => provider.id == 'paheal'),
isEmpty,
);
expect(
ProviderRepository.seedProviders()
.where((provider) => provider.id == 'xbooru'),
isEmpty,
);
expect(
ProviderRepository.seedProviders()
.where((provider) => provider.id == 'kemono'),
isEmpty,
);
expect(
ProviderRepository.seedProviders()
.where((provider) => provider.id == 'coomer'),
isEmpty,
);
});
test('provider factory treats Realbooru api type as unsupported', () {
+41
View File
@@ -0,0 +1,41 @@
import 'package:dio/dio.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:gel_rule_app/backend/models/app_update_info.dart';
import 'package:gel_rule_app/backend/services/settings_service.dart';
import 'package:gel_rule_app/backend/services/update_service.dart';
import 'package:gel_rule_app/core/database/database_service.dart';
void main() {
test('UpdateService parses Gitea release JSON correctly', () {
final service = UpdateService(Dio(), SettingsService(_MockDatabaseService()));
// Use reflection or constructor to test info
final info = AppUpdateInfo(
version: '2.0.2',
tagName: 'v2.0.2',
name: 'Lunaris 2.0.2',
body: 'Release notes',
htmlUrl: 'https://gitea.rardogsynapse.online/RarDog/Lunaris/releases/tag/v2.0.2',
publishedAt: DateTime.parse('2026-09-03T18:00:00Z'),
apkUrl: 'https://gitea.rardogsynapse.online/attachments/apk',
linuxTarGzUrl: 'https://gitea.rardogsynapse.online/attachments/linux',
);
expect(info.hasAssets, isTrue);
expect(info.apkUrl, contains('apk'));
expect(info.linuxTarGzUrl, contains('linux'));
expect(
service.assetFileName(info, 'https://gitea.rardogsynapse.online/attachments/Lunaris-v2.0.2.apk'),
'Lunaris-v2.0.2.apk',
);
expect(
service.assetFileName(info, info.apkUrl!),
'Lunaris-v2.0.2-linux-x64.tar.gz',
);
});
}
class _MockDatabaseService implements DatabaseService {
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}