a7fd1e74f1
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>
76 lines
2.3 KiB
Dart
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);
|
|
});
|
|
}
|