taproom/test/app_test.dart
Philip Peterson 24dcfcf70d Taproom: a Flutter desktop frontend for Homebrew
Browse installed packages, upgrade outdated ones, search formulae and
casks, and explore taps, all by driving the brew CLI. Includes a
Taskfile for running, testing and building.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:12:21 -08:00

82 lines
2.5 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:taproom/brew/brew_client.dart';
import 'package:taproom/main.dart';
import 'package:taproom/state/app_state.dart';
void main() {
testWidgets('shows installed packages and outdated badge', (tester) async {
final client = BrewClient(
brewPath: '/fake/brew',
runner: (exe, args, env) async {
final out = switch (args.first) {
'info' => {
'formulae': [
{
'name': 'jq',
'desc': 'Lightweight and flexible command-line JSON processor',
'installed': [
{'version': '1.8.1', 'installed_on_request': true},
],
'outdated': true,
},
{
'name': 'oniguruma',
'installed': [
{'version': '6.9.10', 'installed_on_request': false},
],
},
],
'casks': [
{
'token': 'firefox',
'name': ['Mozilla Firefox'],
'installed': '141.0',
},
],
},
'outdated' => {
'formulae': [
{
'name': 'jq',
'installed_versions': ['1.8.1'],
'current_version': '1.8.2',
},
],
'casks': [],
},
'tap-info' => [
{
'name': 'homebrew/core',
'official': true,
'formula_names': ['jq'],
},
],
_ => throw UnimplementedError('$args'),
};
return ProcessResult(0, 0, jsonEncode(out), '');
},
);
final state = AppState(client);
await tester.binding.setSurfaceSize(const Size(1200, 800));
await tester.pumpWidget(TaproomApp(state: state));
await tester.runAsync(state.refresh);
await tester.pump();
expect(find.text('jq'), findsOneWidget);
expect(find.text('oniguruma'), findsOneWidget);
expect(find.text('Mozilla Firefox'), findsOneWidget);
expect(find.text('dependency'), findsOneWidget);
expect(find.text('3 of 3'), findsOneWidget);
// Badge on the Outdated rail item.
expect(find.text('1'), findsOneWidget);
await tester.tap(find.text('Requested only'));
await tester.pump();
expect(find.text('oniguruma'), findsNothing);
expect(find.text('2 of 3'), findsOneWidget);
});
}