@@ -62,6 +62,10 @@ impl GraphQlTargetPlugin for JobberPlugin {
6262#[ allow( unsafe_code, clippy:: expect_used) ] // set_var/remove_var are unsafe in Rust ≥1.93; scoped to tests only
6363mod tests {
6464 use super :: * ;
65+ use std:: sync:: Mutex ;
66+
67+ // Serialise env-var mutations so parallel test threads don't race each other.
68+ static ENV_LOCK : Mutex < ( ) > = Mutex :: new ( ( ) ) ;
6569
6670 #[ test]
6771 fn plugin_name_is_jobber ( ) {
@@ -88,8 +92,11 @@ mod tests {
8892 #[ test]
8993 fn default_auth_reads_env ( ) {
9094 let key = "JOBBER_ACCESS_TOKEN" ;
95+ let _guard = ENV_LOCK
96+ . lock ( )
97+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
9198 let prev = std:: env:: var ( key) . ok ( ) ;
92- // SAFETY: single-threaded test; no concurrent env access
99+ // SAFETY: ENV_LOCK serialises all env mutations in this module
93100 unsafe { std:: env:: set_var ( key, "test-token-abc" ) } ;
94101
95102 let auth = JobberPlugin . default_auth ( ) ;
@@ -109,8 +116,11 @@ mod tests {
109116 #[ test]
110117 fn default_auth_absent_when_no_env ( ) {
111118 let key = "JOBBER_ACCESS_TOKEN" ;
119+ let _guard = ENV_LOCK
120+ . lock ( )
121+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
112122 let prev = std:: env:: var ( key) . ok ( ) ;
113- // SAFETY: single-threaded test; no concurrent env access
123+ // SAFETY: ENV_LOCK serialises all env mutations in this module
114124 unsafe { std:: env:: remove_var ( key) } ;
115125
116126 assert ! ( JobberPlugin . default_auth( ) . is_none( ) ) ;
0 commit comments