feat: Add Recommended badge for AUR packages with highest likes among app variants
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user