@@ -46,15 +46,18 @@ describe('lifecycle commands', () => {
4646 )
4747
4848 await runSource ( workspace , [ 'start' , 'service' , 'api' , '--project' , projectRoot ] , {
49+ SSM_TEST_EUID : '0' ,
4950 SSM_SYSTEMCTL_LOG : systemctlLog ,
5051 } )
5152 await runSource ( workspace , [ 'enable' , 'service' , 'api' , '--project' , projectRoot ] , {
53+ SSM_TEST_EUID : '0' ,
5254 SSM_SYSTEMCTL_LOG : systemctlLog ,
5355 } )
5456 const status = await runSource (
5557 workspace ,
5658 [ 'status' , 'service' , 'api' , '--project' , projectRoot ] ,
5759 {
60+ SSM_TEST_EUID : '0' ,
5861 SSM_SYSTEMCTL_LOG : systemctlLog ,
5962 } ,
6063 )
@@ -100,6 +103,7 @@ describe('lifecycle commands', () => {
100103 workspace ,
101104 [ 'logs' , 'service' , 'user-agent' , '--project' , projectRoot , '--follow' ] ,
102105 {
106+ SSM_TEST_EUID : '0' ,
103107 SSM_JOURNALCTL_LOG : journalLog ,
104108 } ,
105109 )
@@ -129,10 +133,52 @@ describe('lifecycle commands', () => {
129133 )
130134
131135 const result = await runSource ( workspace , [ 'start' , 'api' , '--project' , projectRoot ] , {
136+ SSM_TEST_EUID : '0' ,
132137 SSM_SYSTEMCTL_LOG : systemctlLog ,
133138 } )
134139
135140 expect ( result . exitCode ) . toBe ( 0 )
136141 expect ( fs . readFileSync ( systemctlLog , 'utf8' ) ) . toContain ( 'start myapp-api.service' )
137142 } )
143+
144+ it ( 'auto-elevates system-scope start when not root' , async ( ) => {
145+ const workspace = createWorkspace ( )
146+ workspaces . push ( workspace )
147+
148+ const sudoLog = path . join ( workspace . root , 'sudo.log' )
149+ const systemctlLog = path . join ( workspace . root , 'systemctl.log' )
150+
151+ installMockCommand (
152+ workspace ,
153+ 'sudo' ,
154+ [
155+ '#!/usr/bin/env bash' ,
156+ 'printf "%s\\n" "$*" >>"${SSM_SUDO_LOG}"' ,
157+ 'if [[ "$1" == "--" ]]; then shift; fi' ,
158+ 'SSM_TEST_EUID=0 exec "$@"' ,
159+ ] . join ( '\n' ) ,
160+ )
161+ installMockCommand (
162+ workspace ,
163+ 'systemctl' ,
164+ '#!/usr/bin/env bash\nprintf "%s\\n" "$*" >>"${SSM_SYSTEMCTL_LOG}"\nexit 0\n' ,
165+ )
166+
167+ const projectRoot = path . join (
168+ workspace . managerHome ,
169+ 'tests' ,
170+ 'fixtures' ,
171+ 'project-basic' ,
172+ )
173+
174+ const result = await runSource ( workspace , [ 'start' , 'api' , '--project' , projectRoot ] , {
175+ SSM_TEST_EUID : '1000' ,
176+ SSM_SUDO_LOG : sudoLog ,
177+ SSM_SYSTEMCTL_LOG : systemctlLog ,
178+ } )
179+
180+ expect ( result . exitCode ) . toBe ( 0 )
181+ expect ( fs . readFileSync ( sudoLog , 'utf8' ) ) . toContain ( workspace . sourceEntry )
182+ expect ( fs . readFileSync ( systemctlLog , 'utf8' ) ) . toContain ( 'start myapp-api.service' )
183+ } )
138184} )
0 commit comments