@@ -198,6 +198,7 @@ func TestResolveActiveGateway_WhitespaceHandling(t *testing.T) {
198198func TestResolveActiveGateway_FileMissing (t * testing.T ) {
199199 tmp := t .TempDir ()
200200 t .Setenv ("XDG_CONFIG_HOME" , tmp )
201+ t .Setenv (systemGatewayDirEnv , t .TempDir ())
201202 require .NoError (t , os .MkdirAll (filepath .Join (tmp , "openshell" ), 0o755 ))
202203
203204 _ , err := resolveActiveGateway ()
@@ -208,6 +209,7 @@ func TestResolveActiveGateway_FileMissing(t *testing.T) {
208209func TestResolveActiveGateway_EmptyFile (t * testing.T ) {
209210 tmp := t .TempDir ()
210211 t .Setenv ("XDG_CONFIG_HOME" , tmp )
212+ t .Setenv (systemGatewayDirEnv , t .TempDir ())
211213 require .NoError (t , os .MkdirAll (filepath .Join (tmp , "openshell" ), 0o755 ))
212214 require .NoError (t , os .WriteFile (filepath .Join (tmp , "openshell" , "active_gateway" ), []byte (" \n " ), 0o644 ))
213215
@@ -216,6 +218,53 @@ func TestResolveActiveGateway_EmptyFile(t *testing.T) {
216218 assert .ErrorIs (t , err , ErrNoActiveGateway )
217219}
218220
221+ func TestResolveActiveGateway_FallsBackToSystem (t * testing.T ) {
222+ user , system := t .TempDir (), t .TempDir ()
223+ t .Setenv ("XDG_CONFIG_HOME" , user )
224+ t .Setenv (systemGatewayDirEnv , system )
225+ require .NoError (t , os .WriteFile (filepath .Join (system , "active_gateway" ), []byte ("corp\n " ), 0o644 ))
226+
227+ name , err := resolveActiveGateway ()
228+ require .NoError (t , err )
229+ assert .Equal (t , "corp" , name )
230+ }
231+
232+ func TestResolveActiveGateway_PrefersUser (t * testing.T ) {
233+ user , system := t .TempDir (), t .TempDir ()
234+ t .Setenv ("XDG_CONFIG_HOME" , user )
235+ t .Setenv (systemGatewayDirEnv , system )
236+ require .NoError (t , os .MkdirAll (filepath .Join (user , "openshell" ), 0o755 ))
237+ require .NoError (t , os .WriteFile (filepath .Join (user , "openshell" , "active_gateway" ), []byte ("mine" ), 0o644 ))
238+ require .NoError (t , os .WriteFile (filepath .Join (system , "active_gateway" ), []byte ("corp" ), 0o644 ))
239+
240+ name , err := resolveActiveGateway ()
241+ require .NoError (t , err )
242+ assert .Equal (t , "mine" , name )
243+ }
244+
245+ func TestResolveActiveGateway_InvalidUserFallsBackToSystem (t * testing.T ) {
246+ user , system := t .TempDir (), t .TempDir ()
247+ t .Setenv ("XDG_CONFIG_HOME" , user )
248+ t .Setenv (systemGatewayDirEnv , system )
249+ require .NoError (t , os .MkdirAll (filepath .Join (user , "openshell" ), 0o755 ))
250+ require .NoError (t , os .WriteFile (filepath .Join (user , "openshell" , "active_gateway" ), []byte ("../escape" ), 0o644 ))
251+ require .NoError (t , os .WriteFile (filepath .Join (system , "active_gateway" ), []byte ("corp" ), 0o644 ))
252+
253+ name , err := resolveActiveGateway ()
254+ require .NoError (t , err )
255+ assert .Equal (t , "corp" , name )
256+ }
257+
258+ func TestResolveActiveGateway_InvalidSystemIsIgnored (t * testing.T ) {
259+ user , system := t .TempDir (), t .TempDir ()
260+ t .Setenv ("XDG_CONFIG_HOME" , user )
261+ t .Setenv (systemGatewayDirEnv , system )
262+ require .NoError (t , os .WriteFile (filepath .Join (system , "active_gateway" ), []byte ("../escape" ), 0o644 ))
263+
264+ _ , err := resolveActiveGateway ()
265+ assert .ErrorIs (t , err , ErrNoActiveGateway )
266+ }
267+
219268func TestValidateGatewayName_SpecialCharacters (t * testing.T ) {
220269 cases := []struct {
221270 name string
0 commit comments