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