22
33namespace Tests \Feature ;
44
5+ use App \Actions \CronJob \SyncCronJobs ;
56use App \Enums \CronjobStatus ;
67use App \Facades \SSH ;
78use App \Models \CronJob ;
@@ -76,7 +77,7 @@ public function test_create_cronjob(): void
7677 'name ' => 'My Cronjob ' ,
7778 ]);
7879
79- SSH ::assertExecutedContains ("echo '* * * * * ls -la' | sudo -u vito crontab - " );
80+ SSH ::assertExecutedContains ("echo '* * * * * bash -lc ' \\ '' ls -la' \\ '' ' | sudo -u vito crontab - " );
8081 SSH ::assertExecutedContains ('sudo -u vito crontab -l ' );
8182 }
8283
@@ -100,7 +101,7 @@ public function test_create_cronjob_for_isolated_user(): void
100101 'user ' => 'example ' ,
101102 ]);
102103
103- SSH ::assertExecutedContains ("echo '* * * * * ls -la' | sudo -u example crontab - " );
104+ SSH ::assertExecutedContains ("echo '* * * * * bash -lc ' \\ '' ls -la' \\ '' ' | sudo -u example crontab - " );
104105 SSH ::assertExecutedContains ('sudo -u example crontab -l ' );
105106 }
106107
@@ -166,10 +167,53 @@ public function test_create_custom_cronjob(): void
166167 'status ' => CronjobStatus::READY ,
167168 ]);
168169
169- SSH ::assertExecutedContains ("echo '* * * 1 1 ls -la' | sudo -u vito crontab - " );
170+ SSH ::assertExecutedContains ("echo '* * * 1 1 bash -lc ' \\ '' ls -la' \\ '' ' | sudo -u vito crontab - " );
170171 SSH ::assertExecutedContains ('sudo -u vito crontab -l ' );
171172 }
172173
174+ public function test_cronjob_is_wrapped_in_login_shell_and_survives_sync (): void
175+ {
176+ SSH ::fake ();
177+ $ this ->actingAs ($ this ->user );
178+
179+ /** @var CronJob $cronjob */
180+ $ cronjob = CronJob::factory ()->create ([
181+ 'server_id ' => $ this ->server ->id ,
182+ 'user ' => 'vito ' ,
183+ 'command ' => "echo 'hi' " ,
184+ 'frequency ' => '* * * * * ' ,
185+ 'status ' => CronjobStatus::READY ,
186+ 'site_id ' => null ,
187+ ]);
188+
189+ $ crontab = CronJob::crontab ($ this ->server , 'vito ' );
190+ $ this ->assertSame ("* * * * * bash -lc 'echo ' \\''hi' \\''' " , $ crontab );
191+ $ this ->assertSame ("echo 'hi' " , CronJob::unwrapCommand ("bash -lc 'echo ' \\''hi' \\''' " ));
192+
193+ SSH ::fake ($ crontab );
194+ app (SyncCronJobs::class)->sync ($ this ->server );
195+
196+ $ cronjob ->refresh ();
197+ $ this ->assertSame (CronjobStatus::READY , $ cronjob ->status );
198+ $ this ->assertSame (1 , CronJob::query ()->where ('user ' , 'vito ' )->where ('command ' , "echo 'hi' " )->count ());
199+ }
200+
201+ public function test_root_cronjob_is_not_wrapped (): void
202+ {
203+ $ this ->actingAs ($ this ->user );
204+
205+ CronJob::factory ()->create ([
206+ 'server_id ' => $ this ->server ->id ,
207+ 'user ' => 'root ' ,
208+ 'command ' => '/usr/bin/backup.sh ' ,
209+ 'frequency ' => '0 2 * * * ' ,
210+ 'status ' => CronjobStatus::READY ,
211+ 'site_id ' => null ,
212+ ]);
213+
214+ $ this ->assertSame ('0 2 * * * /usr/bin/backup.sh ' , CronJob::crontab ($ this ->server , 'root ' ));
215+ }
216+
173217 public function test_enable_cronjob (): void
174218 {
175219 SSH ::fake ();
@@ -195,7 +239,7 @@ public function test_enable_cronjob(): void
195239
196240 $ this ->assertEquals (CronjobStatus::READY , $ cronjob ->status );
197241
198- SSH ::assertExecutedContains ("echo '* * * 1 1 ls -la' | sudo -u vito crontab - " );
242+ SSH ::assertExecutedContains ("echo '* * * 1 1 bash -lc ' \\ '' ls -la' \\ '' ' | sudo -u vito crontab - " );
199243 SSH ::assertExecutedContains ('sudo -u vito crontab -l ' );
200244 }
201245
0 commit comments