44
55namespace Symplify \MonorepoBuilder \Tests \Release \DisableDefaultWorkers ;
66
7+ use Symplify \MonorepoBuilder \Release \Contract \ReleaseWorker \ReleaseWorkerInterface ;
78use PHPUnit \Framework \TestCase ;
89use ReflectionClass ;
910use Symplify \MonorepoBuilder \Config \MBConfig ;
1011use Symplify \MonorepoBuilder \Kernel \MonorepoBuilderKernel ;
12+ use Symplify \MonorepoBuilder \Release \ReleaseWorker \AddTagToChangelogReleaseWorker ;
1113use Symplify \MonorepoBuilder \Release \ReleaseWorker \PushTagReleaseWorker ;
1214use Symplify \MonorepoBuilder \Release \ReleaseWorker \TagVersionReleaseWorker ;
15+ use Symplify \MonorepoBuilder \Release \ReleaseWorkerProvider ;
16+ use Symplify \MonorepoBuilder \Release \ValueObject \Stage ;
17+ use Symplify \MonorepoBuilder \Tests \Release \DisableDefaultWorkers \Fixture \FetchTagsReleaseWorker ;
18+ use Symplify \MonorepoBuilder \Tests \Release \DisableDefaultWorkers \Fixture \GenerateChangelogReleaseWorker ;
1319
1420/**
1521 * Tests for MBConfig::disableDefaultWorkers() functionality.
@@ -20,13 +26,11 @@ final class DisableDefaultWorkersTest extends TestCase
2026{
2127 protected function setUp (): void
2228 {
23- // Reset static state before each test
2429 $ this ->resetMBConfigState ();
2530 }
2631
2732 protected function tearDown (): void
2833 {
29- // Clean up static state after each test
3034 $ this ->resetMBConfigState ();
3135 }
3236
@@ -62,16 +66,70 @@ public function testDisableDefaultWorkersPreservesUserAddedWorker(): void
6266 $ monorepoBuilderKernel = new MonorepoBuilderKernel ();
6367 $ container = $ monorepoBuilderKernel ->createFromConfigs ([__DIR__ . '/config/disable_and_add_custom.php ' ]);
6468
65- // User explicitly added TagVersionReleaseWorker, so it should be preserved
66- $ this ->assertTrue ($ container ->has (TagVersionReleaseWorker::class));
6769 // User did not add PushTagReleaseWorker, so it should be removed
6870 $ this ->assertFalse ($ container ->has (PushTagReleaseWorker::class));
71+
72+ // User explicitly added TagVersionReleaseWorker via workers(), so it should be available
73+ /** @var ReleaseWorkerProvider $provider */
74+ $ provider = $ container ->get (ReleaseWorkerProvider::class);
75+ $ workers = $ provider ->provideByStage (Stage::MAIN );
76+ $ workerClasses = array_map (static fn (ReleaseWorkerInterface $ releaseWorker ): string => $ releaseWorker ::class, $ workers );
77+ $ this ->assertContains (TagVersionReleaseWorker::class, $ workerClasses );
78+ }
79+
80+ /**
81+ * Scenario 4: workers() without disableDefaultWorkers() should not duplicate overlapping workers
82+ */
83+ public function testWorkersWithoutDisableDoesNotDuplicate (): void
84+ {
85+ $ monorepoBuilderKernel = new MonorepoBuilderKernel ();
86+ $ container = $ monorepoBuilderKernel ->createFromConfigs ([__DIR__ . '/config/add_custom_without_disable.php ' ]);
87+
88+ /** @var ReleaseWorkerProvider $provider */
89+ $ provider = $ container ->get (ReleaseWorkerProvider::class);
90+ $ workers = $ provider ->provideByStage (Stage::MAIN );
91+ $ workerClasses = array_map (static fn (ReleaseWorkerInterface $ releaseWorker ): string => $ releaseWorker ::class, $ workers );
92+
93+ // Should have exactly 3 workers, no duplicates
94+ $ this ->assertSame ([
95+ AddTagToChangelogReleaseWorker::class,
96+ TagVersionReleaseWorker::class,
97+ PushTagReleaseWorker::class,
98+ ], $ workerClasses );
99+ }
100+
101+ /**
102+ * Scenario 5: Reproduces the exact scenario from issue #111.
103+ * User wants custom workers to run BEFORE the default tag/push workers.
104+ *
105+ * @see https://github.com/symplify/monorepo-builder/issues/111
106+ */
107+ public function testWorkerOrderIsRespected (): void
108+ {
109+ $ monorepoBuilderKernel = new MonorepoBuilderKernel ();
110+ $ container = $ monorepoBuilderKernel ->createFromConfigs ([__DIR__ . '/config/disable_and_reorder.php ' ]);
111+
112+ /** @var ReleaseWorkerProvider $provider */
113+ $ provider = $ container ->get (ReleaseWorkerProvider::class);
114+ $ workers = $ provider ->provideByStage (Stage::MAIN );
115+ $ workerClasses = array_map (static fn (ReleaseWorkerInterface $ releaseWorker ): string => $ releaseWorker ::class, $ workers );
116+
117+ $ this ->assertSame ([
118+ FetchTagsReleaseWorker::class,
119+ GenerateChangelogReleaseWorker::class,
120+ TagVersionReleaseWorker::class,
121+ PushTagReleaseWorker::class,
122+ ], $ workerClasses );
69123 }
70124
71125 private function resetMBConfigState (): void
72126 {
73127 $ reflectionClass = new ReflectionClass (MBConfig::class);
128+
74129 $ reflectionProperty = $ reflectionClass ->getProperty ('disableDefaultWorkers ' );
75130 $ reflectionProperty ->setValue (null , false );
131+
132+ $ reflectionProperty = $ reflectionClass ->getProperty ('userWorkerClasses ' );
133+ $ reflectionProperty ->setValue (null , []);
76134 }
77135}
0 commit comments