Files
tasq/test/programmer_stat_tiles_test.dart
redz1029 a7fd1e74f1 feat(programmer): dashboard stat tiles + badges
Add StatTiles and BadgesStrip widgets wired into ProgrammerDashboard.

StatTiles shows 2 tiles (focus + completed) when showSheetStats is false,
and 5 tiles (+ streak, first-pass approval, help given) when the viewing
user's role is programmer. BadgesStrip renders earned/locked chips in a
horizontal Wrap with tap-to-dialog detail.

Dashboard feeds todayFocus via buildDayRows/totalSeconds, leaveDays via
approvedLeaveDays, and sheets: const [] until Task 20 wires real data.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-27 22:13:43 +08:00

76 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tasq/screens/programmer_tasks/dashboard/badges_strip.dart';
import 'package:tasq/screens/programmer_tasks/dashboard/stat_tiles.dart';
import 'package:tasq/utils/programmer_stats.dart';
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
ProgrammerStats _makeStats({
int currentStreak = 0,
int bestStreak = 0,
int completedThisWeek = 0,
int completedLastWeek = 0,
double? firstPassRate,
}) {
return ProgrammerStats(
todayFocus: Duration.zero,
helpGivenThisMonth: Duration.zero,
approvedTotal: Duration.zero,
helpGivenTotal: Duration.zero,
completedThisWeek: completedThisWeek,
completedLastWeek: completedLastWeek,
currentStreak: currentStreak,
bestStreak: bestStreak,
completedTotal: 0,
bugFixCompleted: 0,
firstPassRate: firstPassRate,
hasCleanWeek: false,
);
}
Widget _wrap(Widget child) {
return MaterialApp(home: Scaffold(body: SingleChildScrollView(child: child)));
}
// ---------------------------------------------------------------------------
// Tests
// ---------------------------------------------------------------------------
void main() {
testWidgets('sheet stats hidden when showSheetStats is false', (tester) async {
final stats = _makeStats(currentStreak: 6, bestStreak: 9);
await tester.pumpWidget(_wrap(
StatTiles(stats: stats, showSheetStats: false),
));
expect(find.text('STREAK'), findsNothing);
});
testWidgets('streak tile shows days and best', (tester) async {
final stats = _makeStats(currentStreak: 6, bestStreak: 9);
await tester.pumpWidget(_wrap(
StatTiles(stats: stats, showSheetStats: true),
));
expect(find.text('6 days'), findsOneWidget);
expect(find.text('Best 9'), findsOneWidget);
});
testWidgets('locked badge shows progress', (tester) async {
const badge = BadgeProgress(
id: 'finisher',
title: 'Finisher',
description: 'Complete 10 tasks',
icon: Icons.task_alt,
current: 7,
target: 10,
earned: false,
);
await tester.pumpWidget(_wrap(
const BadgesStrip(badges: [badge]),
));
expect(find.text('7/10'), findsOneWidget);
});
}