import 'package:flutter/cupertino.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:forge/src/rust/api/packages.dart'; import 'package:forge/src/services/catalog_service.dart'; void main() { group('CatalogService.extractAppBaseName', () { test('strips common AUR package suffixes correctly', () { expect(CatalogService.extractAppBaseName('paru'), 'paru'); expect(CatalogService.extractAppBaseName('paru-bin'), 'paru'); expect(CatalogService.extractAppBaseName('paru-git'), 'paru'); expect(CatalogService.extractAppBaseName('paru-static'), 'paru'); expect(CatalogService.extractAppBaseName('google-chrome-beta'), 'google-chrome'); expect(CatalogService.extractAppBaseName('google-chrome-dev'), 'google-chrome'); expect(CatalogService.extractAppBaseName('telegram-desktop-bin'), 'telegram-desktop'); expect(CatalogService.extractAppBaseName('visual-studio-code-insiders-bin'), 'visual-studio-code'); expect(CatalogService.extractAppBaseName('zen-browser-beta-bin'), 'zen-browser'); }); }); group('CatalogService.markRecommendedAurPackages', () { test('marks package with highest votes as recommended when multiple variants exist', () { final apps = [ CatalogApp( id: 'paru', name: 'paru', summary: 'Paru source', category: 'AUR', backend: BackendType.aur, votes: 1256, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'paru-bin', name: 'paru-bin', summary: 'Paru binary', category: 'AUR', backend: BackendType.aur, votes: 324, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'paru-git', name: 'paru-git', summary: 'Paru development git', category: 'AUR', backend: BackendType.aur, votes: 69, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'unique-single-utility', name: 'unique-single-utility', summary: 'Single tool', category: 'AUR', backend: BackendType.aur, votes: 50, fallbackIcon: CupertinoIcons.app, ), ]; CatalogService.markRecommendedAurPackages(apps); final paru = apps.firstWhere((a) => a.id == 'paru'); final paruBin = apps.firstWhere((a) => a.id == 'paru-bin'); final paruGit = apps.firstWhere((a) => a.id == 'paru-git'); final single = apps.firstWhere((a) => a.id == 'unique-single-utility'); expect(paru.isRecommended, isTrue); expect(paruBin.isRecommended, isFalse); expect(paruGit.isRecommended, isFalse); expect(single.isRecommended, isFalse); }); test('correctly handles multiple different app groups in the same search result', () { final apps = [ CatalogApp( id: 'spotify', name: 'spotify', summary: 'Spotify client', category: 'AUR', backend: BackendType.aur, votes: 276, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'spotify-dev', name: 'spotify-dev', summary: 'Spotify dev', category: 'AUR', backend: BackendType.aur, votes: 26, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'zen-browser-bin', name: 'zen-browser-bin', summary: 'Zen Browser Binary', category: 'AUR', backend: BackendType.aur, votes: 140, fallbackIcon: CupertinoIcons.app, ), CatalogApp( id: 'zen-browser-beta-bin', name: 'zen-browser-beta-bin', summary: 'Zen Browser Beta', category: 'AUR', backend: BackendType.aur, votes: 15, fallbackIcon: CupertinoIcons.app, ), ]; CatalogService.markRecommendedAurPackages(apps); final spotify = apps.firstWhere((a) => a.id == 'spotify'); final spotifyDev = apps.firstWhere((a) => a.id == 'spotify-dev'); final zenBin = apps.firstWhere((a) => a.id == 'zen-browser-bin'); final zenBeta = apps.firstWhere((a) => a.id == 'zen-browser-beta-bin'); expect(spotify.isRecommended, isTrue); expect(spotifyDev.isRecommended, isFalse); expect(zenBin.isRecommended, isTrue); expect(zenBeta.isRecommended, isFalse); }); }); }