@@ -116,3 +116,48 @@ fn test_allow_glob_extension() -> Result<()> {
116116
117117 Ok ( ( ) )
118118}
119+
120+ #[ test]
121+ fn test_allowlist_extend ( ) -> Result < ( ) > {
122+ let baseline_text = "! bad/*
123+ other/*" ;
124+ let baseline = AllowList :: parse ( baseline_text) ?;
125+
126+ assert ! ( !baseline. is_allowed( "bad/a" ) ) ;
127+ assert ! ( !baseline. is_allowed( "bad/b" ) ) ;
128+ assert ! ( !baseline. is_allowed( "good/a" ) ) ;
129+ assert ! ( !baseline. is_allowed( "good/b" ) ) ;
130+ assert ! ( !baseline. is_allowed( "good/bad/c" ) ) ;
131+ assert ! ( baseline. is_allowed( "other/a" ) ) ;
132+ assert ! ( baseline. is_allowed( "other/b" ) ) ;
133+
134+ let provided_text = "good/*
135+ bad/*
136+ ! other/*" ;
137+ let provided = AllowList :: parse ( provided_text) ?;
138+
139+ assert ! ( provided. is_allowed( "bad/a" ) ) ;
140+ assert ! ( provided. is_allowed( "bad/b" ) ) ;
141+ assert ! ( provided. is_allowed( "good/a" ) ) ;
142+ assert ! ( provided. is_allowed( "good/b" ) ) ;
143+ assert ! ( provided. is_allowed( "good/bad/c" ) ) ;
144+ assert ! ( !provided. is_allowed( "other/a" ) ) ;
145+ assert ! ( !provided. is_allowed( "other/b" ) ) ;
146+
147+ let extended = baseline. extend ( & provided) ;
148+
149+ // Deny rules from `baseline` should not be overridden by `provided`, but
150+ // allow rules should be.
151+ //
152+ // A provided allowlist can deny patterns that are baseline-allowed, but
153+ // cannot allow patterns that are baseline-denied.
154+ assert ! ( !extended. is_allowed( "bad/a" ) ) ;
155+ assert ! ( !extended. is_allowed( "bad/b" ) ) ;
156+ assert ! ( extended. is_allowed( "good/a" ) ) ;
157+ assert ! ( extended. is_allowed( "good/b" ) ) ;
158+ assert ! ( extended. is_allowed( "good/bad/c" ) ) ;
159+ assert ! ( !extended. is_allowed( "other/a" ) ) ;
160+ assert ! ( !extended. is_allowed( "other/b" ) ) ;
161+
162+ Ok ( ( ) )
163+ }
0 commit comments