Rename all OPDS-prefixed models to generic names (Server, Feed, Entry, Link, StreamLink), expand the ServerSoftware interface to cover all server interactions, and implement a full Kavita REST API client that replaces the OPDS delegation. - Rename OPDS* models to generic names across ~60 files - Add database migrations 13 (opds_id → entry_id) and 14 (unify credentials) - Create OPDSServerSoftware wrapping existing OPDS services - Create KavitaApiClient for direct Kavita REST API calls - Create KavitaFeedMapper to convert Kavita JSON to Feed/Entry models - Rewrite KavitaServerSoftware to use native API (no OPDS delegation) - Unify server credentials (remove softwareUsername/softwarePassword) - Simplify add/edit server UI to single auth section - Add test connection button to server add/edit screens - Add progress indicator to PublicationCard using local and server data - Eliminate softwareType branching in reader screens - Add EntryProgress and fetchEntryProgress to ServerSoftware interface - Fix Entry.acquisitionLink crash on empty links - Add 59 new tests covering models, services, and providers
70 lines
2.4 KiB
Dart
70 lines
2.4 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:worldhopper/models/server.dart';
|
|
import 'package:worldhopper/services/server_software/server_software_type.dart';
|
|
|
|
// Kavita URL detection regex — extracted from KavitaServerSoftware for
|
|
// isolated testing without needing to construct the full dependency tree.
|
|
final _kavitaUrlPattern = RegExp(
|
|
r'/api/opds/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}',
|
|
);
|
|
|
|
/// Lightweight detection that mirrors ServerSoftwareService.detect() logic.
|
|
ServerSoftwareType _detect(Server server) {
|
|
if (_kavitaUrlPattern.hasMatch(server.url)) return ServerSoftwareType.kavita;
|
|
return ServerSoftwareType.generic;
|
|
}
|
|
|
|
Server _server({
|
|
String url = 'https://example.com/opds',
|
|
ServerSoftwareType? softwareType,
|
|
}) {
|
|
return Server(
|
|
id: 's1',
|
|
name: 'Test Server',
|
|
url: url,
|
|
createdAt: DateTime(2024),
|
|
softwareType: softwareType,
|
|
);
|
|
}
|
|
|
|
void main() {
|
|
group('detect', () {
|
|
test('detects Kavita from URL pattern', () {
|
|
final server = _server(
|
|
url:
|
|
'https://kavita.example.com/api/opds/12345678-1234-1234-1234-123456789abc',
|
|
);
|
|
expect(_detect(server), ServerSoftwareType.kavita);
|
|
});
|
|
|
|
test('returns generic for plain OPDS URL', () {
|
|
final server = _server(url: 'https://example.com/opds');
|
|
expect(_detect(server), ServerSoftwareType.generic);
|
|
});
|
|
|
|
test('returns generic for non-matching URL', () {
|
|
final server = _server(url: 'https://example.com/feed.xml');
|
|
expect(_detect(server), ServerSoftwareType.generic);
|
|
});
|
|
});
|
|
|
|
group('getImplementation dispatch', () {
|
|
test('null softwareType dispatches to generic', () {
|
|
final server = _server(softwareType: null);
|
|
final type = server.softwareType ?? ServerSoftwareType.generic;
|
|
expect(type, ServerSoftwareType.generic);
|
|
});
|
|
|
|
test('generic softwareType dispatches to generic', () {
|
|
final server = _server(softwareType: ServerSoftwareType.generic);
|
|
final type = server.softwareType ?? ServerSoftwareType.generic;
|
|
expect(type, ServerSoftwareType.generic);
|
|
});
|
|
|
|
test('kavita softwareType dispatches to kavita', () {
|
|
final server = _server(softwareType: ServerSoftwareType.kavita);
|
|
final type = server.softwareType ?? ServerSoftwareType.generic;
|
|
expect(type, ServerSoftwareType.kavita);
|
|
});
|
|
});
|
|
}
|