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>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user