Release RuleGel 1.0.1 with Realbooru

This commit is contained in:
2026-05-25 14:33:59 +03:00
parent 16e86fb9d5
commit ea39cf8567
28 changed files with 1217 additions and 263 deletions
+1
View File
@@ -72,6 +72,7 @@ void main() {
'yandere',
'e621',
'e926',
'realbooru',
]);
});
+48
View File
@@ -0,0 +1,48 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:gel_rule_app/app/motion.dart';
import 'package:gel_rule_app/backend/services/settings_service.dart';
void main() {
test('app settings json roundtrip keeps motion settings', () {
final settings = AppSettings.defaults.copyWith(
motionRefreshMode: MotionRefreshMode.hz144.name,
autoBatterySaver60Hz: false,
);
final restored = AppSettings.fromJson(settings.toJson());
expect(restored.motionRefreshMode, MotionRefreshMode.hz144.name);
expect(restored.autoBatterySaver60Hz, isFalse);
});
test('battery saver forces effective 60hz below 20 percent', () {
final motion = resolveMotionSettings(
settings: AppSettings.defaults.copyWith(
motionRefreshMode: MotionRefreshMode.hz165.name,
autoBatterySaver60Hz: true,
),
detectedHz: 165,
device: const DeviceMotionInfo(
batteryLevel: 12,
supportedRefreshRates: [60, 120, 165],
),
);
expect(motion.batterySaverActive, isTrue);
expect(motion.effectiveHz, 60);
});
test('unsupported requested refresh uses nearest supported mode', () {
final motion = resolveMotionSettings(
settings: AppSettings.defaults.copyWith(
motionRefreshMode: MotionRefreshMode.hz144.name,
),
detectedHz: 144,
device: const DeviceMotionInfo(
supportedRefreshRates: [60, 120],
),
);
expect(motion.effectiveHz, 120);
});
}
+49
View File
@@ -4,6 +4,10 @@ import 'package:gel_rule_app/backend/mappers/e621_mapper.dart';
import 'package:gel_rule_app/backend/mappers/gelbooru_mapper.dart';
import 'package:gel_rule_app/backend/mappers/moebooru_mapper.dart';
import 'package:gel_rule_app/backend/mappers/rule34_mapper.dart';
import 'package:gel_rule_app/backend/models/content_provider_config.dart';
import 'package:gel_rule_app/backend/providers/provider_factory.dart';
import 'package:gel_rule_app/backend/providers/realbooru_provider.dart';
import 'package:gel_rule_app/backend/repositories/provider_repository.dart';
void main() {
test('parses Gelbooru array response', () {
@@ -46,6 +50,23 @@ void main() {
expect(posts.single.fileType, 'gif');
});
test('parses Gelbooru compatible XML post response', () {
final posts = GelbooruMapper.postsFromResponse(
'''
<posts count="1">
<post id="7" file_url="https://example.test/r.jpg" preview_url="https://example.test/r-preview.jpg" tags="real booru" rating="explicit" width="300" height="400" score="12" />
</posts>
''',
providerId: 'realbooru',
providerName: 'Realbooru',
);
expect(posts.single.id, '7');
expect(posts.single.providerId, 'realbooru');
expect(posts.single.tags, ['real', 'booru']);
expect(posts.single.rating, 'explicit');
});
test('parses Rule34 compatible response', () {
final posts = Rule34Mapper.postsFromResponse(
{
@@ -183,4 +204,32 @@ void main() {
expect(posts.single.fileUrl, '');
expect(posts.single.rating, 'unknown');
});
test('seed providers include enabled Realbooru', () {
final realbooru = ProviderRepository.seedProviders()
.where((provider) => provider.id == 'realbooru')
.single;
expect(realbooru.enabled, isTrue);
expect(realbooru.apiType, 'realbooru');
expect(realbooru.baseUrl, 'https://realbooru.com');
});
test('provider factory creates Realbooru provider', () {
final now = DateTime(2026);
final provider = ProviderFactory().create(ContentProviderConfig(
id: 'realbooru',
name: 'Realbooru',
baseUrl: 'https://realbooru.com',
apiType: 'realbooru',
enabled: true,
priority: 7,
timeoutSeconds: 20,
customHeaders: const {},
createdAt: now,
updatedAt: now,
));
expect(provider, isA<RealbooruProvider>());
});
}