import 'package:flutter_test/flutter_test.dart'; import 'package:worldhopper/models/server.dart'; // Kavita URL pattern extracted from KavitaServerSoftware for isolated testing // without needing to construct the full OPDSServerSoftware dependency tree. final _urlPattern = 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}', ); bool _detectFromUrl(Server server) => _urlPattern.hasMatch(server.url); Server _server(String url) => Server( id: 's1', name: 'Test', url: url, createdAt: DateTime(2024), ); void main() { group('Kavita detectFromUrl', () { test('detects standard Kavita OPDS URL', () { final server = _server( 'https://kavita.example.com/api/opds/12345678-1234-1234-1234-123456789abc', ); expect(_detectFromUrl(server), isTrue); }); test('detects Kavita URL with trailing path', () { final server = _server( 'https://kavita.example.com/api/opds/12345678-1234-1234-1234-123456789abc/series/1', ); expect(_detectFromUrl(server), isTrue); }); test('rejects plain OPDS URL', () { final server = _server('https://example.com/opds'); expect(_detectFromUrl(server), isFalse); }); test('rejects URL with invalid UUID', () { final server = _server( 'https://kavita.example.com/api/opds/not-a-uuid', ); expect(_detectFromUrl(server), isFalse); }); test('rejects URL with /api/ but no opds path', () { final server = _server( 'https://kavita.example.com/api/library', ); expect(_detectFromUrl(server), isFalse); }); test('detects uppercase hex UUID', () { final server = _server( 'https://kavita.example.com/api/opds/ABCDEF12-1234-5678-9ABC-DEF012345678', ); expect(_detectFromUrl(server), isTrue); }); }); }