diff --git a/legacy/phpstan-stubs/Activity.stub b/legacy/phpstan-stubs/Activity.stub
new file mode 100644
index 00000000..483ead1d
--- /dev/null
+++ b/legacy/phpstan-stubs/Activity.stub
@@ -0,0 +1,38 @@
+result;
+ // The result is null until the activity has finished.
+ $result = $activity->result ?? '';
$name = self::RESULT_NAMES[$result] ?? $result;
foreach ($activity->commands ?? [] as $command) {
diff --git a/legacy/tests/Service/ActivityMonitorTest.php b/legacy/tests/Service/ActivityMonitorTest.php
new file mode 100644
index 00000000..337dc129
--- /dev/null
+++ b/legacy/tests/Service/ActivityMonitorTest.php
@@ -0,0 +1,60 @@
+ 'a', 'result' => Activity::RESULT_SUCCESS]);
+ $this->assertSame('success', ActivityMonitor::formatResult($activity, false));
+ }
+
+ public function testFormatResultFailure(): void
+ {
+ $activity = new Activity(['id' => 'a', 'result' => Activity::RESULT_FAILURE]);
+ $this->assertSame('failure', ActivityMonitor::formatResult($activity, false));
+ $this->assertSame('failure', ActivityMonitor::formatResult($activity, true));
+ }
+
+ public function testFormatResultNull(): void
+ {
+ // An in-progress activity has no result yet.
+ $activity = new Activity(['id' => 'a', 'state' => Activity::STATE_IN_PROGRESS, 'result' => null]);
+ $this->assertSame('', ActivityMonitor::formatResult($activity, false));
+ $this->assertSame('', ActivityMonitor::formatResult($activity, true));
+ }
+
+ public function testFormatResultFailedCommandOverridesSuccess(): void
+ {
+ $activity = new Activity([
+ 'id' => 'a',
+ 'result' => Activity::RESULT_SUCCESS,
+ 'commands' => [
+ ['exit_code' => 0],
+ ['exit_code' => 1],
+ ],
+ ]);
+ $this->assertSame('failure', ActivityMonitor::formatResult($activity, false));
+ $this->assertSame('failure', ActivityMonitor::formatResult($activity, true));
+ }
+
+ public function testFormatResultFailedCommandWithNullResult(): void
+ {
+ $activity = new Activity([
+ 'id' => 'a',
+ 'state' => Activity::STATE_IN_PROGRESS,
+ 'result' => null,
+ 'commands' => [
+ ['exit_code' => 1],
+ ],
+ ]);
+ $this->assertSame('failure', ActivityMonitor::formatResult($activity, false));
+ }
+}