Files
tasq/test/programmer_task_card_test.dart
T
redz1029 f8c3422715 refactor(programmer): shared task card driven by run states
Extract _TaskCard from the list screen into ProgrammerTaskCard, a
shared ConsumerWidget that reads programmerRunStatesProvider so the
paused-task pill and Start/Resume/Complete buttons are consistent
across any surface that embeds it.

Move the _complete body verbatim to completeProgrammerTaskWithConfirm
in programmer_task_actions.dart; the detail screen's _ActionBar now
calls the shared function.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-27 21:40:07 +08:00

65 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tasq/models/programmer_task.model.dart';
import 'package:tasq/providers/programmer_day_data_provider.dart';
import 'package:tasq/screens/programmer_tasks/widgets/programmer_task_card.dart';
import 'package:tasq/utils/app_time.dart';
ProgrammerTask _task() => ProgrammerTask(
id: 't1',
title: 'Test Task',
category: ProgrammerTaskCategory.bugFix,
status: ProgrammerTaskStatus.inProgress,
createdAt: DateTime(2026, 1, 1),
updatedAt: DateTime(2026, 1, 1),
);
Widget _buildCard({required bool isMine, bool readOnly = false}) {
return ProviderScope(
overrides: [
programmerRunStatesProvider.overrideWithValue({
't1': (
state: ProgrammerRunState.paused,
since: DateTime(2026, 1, 1),
),
}),
],
child: MaterialApp(
home: Scaffold(
body: ProgrammerTaskCard(
task: _task(),
isMine: isMine,
readOnly: readOnly,
),
),
),
);
}
void main() {
setUpAll(AppTime.initialize);
testWidgets(
'paused pill shows for any assignee; Resume only for mine and not read-only',
(tester) async {
// Case 1: isMine: false -> Paused pill shown, Resume not shown
await tester.pumpWidget(_buildCard(isMine: false));
await tester.pump();
expect(find.text('PAUSED'), findsOneWidget);
expect(find.text('Resume'), findsNothing);
// Case 2: isMine: true -> Resume shown
await tester.pumpWidget(_buildCard(isMine: true));
await tester.pump();
expect(find.text('PAUSED'), findsOneWidget);
expect(find.text('Resume'), findsOneWidget);
// Case 3: isMine: true, readOnly: true -> Resume not shown
await tester.pumpWidget(_buildCard(isMine: true, readOnly: true));
await tester.pump();
expect(find.text('PAUSED'), findsOneWidget);
expect(find.text('Resume'), findsNothing);
});
}