@@ -92,6 +92,8 @@ function renderSection(overrides: Record<string, unknown> = {}) {
9292 experimentalCnUseCnRuleSet : true ,
9393 ruleOrder : [ "module:geo" , "custom:one" ] ,
9494 setRuleOrder : vi . fn ( ) ,
95+ allRulesOrderEditingEnabled : false ,
96+ setAllRulesOrderEditingEnabled : vi . fn ( ) ,
9597 ...overrides ,
9698 } ;
9799 stateMock . setter . mockClear ( ) ;
@@ -138,15 +140,17 @@ describe("RulesManagementSection", () => {
138140 const tree = renderSection ( ) ;
139141 const text = collectText ( tree ) ;
140142 const header = collectElements ( tree , ( element ) => element . props . title === "规则管理" ) [ 0 ] ;
143+ const switchElement = collectElements ( tree , ( element ) => Boolean ( ( element . props as any ) . onCheckedChange ) ) [ 0 ] ;
141144 const orderInputs = collectElements ( tree , ( element ) => ( element . props as any ) . title === "最终规则行号(1=最前)" ) ;
142145
143146 expect ( header . props . title ) . toBe ( "规则管理" ) ;
144- expect ( collectText ( header . props . badge ) ) . toContain ( "可调 2 / 全部 3" ) ;
145- expect ( text ) . toContain ( "可移动任意非 MATCH 规则 " ) ;
147+ expect ( collectText ( header . props . badge ) ) . toContain ( "可调 1 / 全部 3" ) ;
148+ expect ( text ) . toContain ( "默认只能调整自定义规则顺序。 " ) ;
146149 expect ( text ) . toContain ( "系统 GEO" ) ;
147150 expect ( text ) . toContain ( "自定义规则" ) ;
148151 expect ( text ) . toContain ( "no-resolve" ) ;
149- expect ( orderInputs . map ( ( input ) => input . props . disabled ) ) . toEqual ( [ false , false , true ] ) ;
152+ expect ( switchElement . props . disabled ) . toBe ( false ) ;
153+ expect ( orderInputs . map ( ( input ) => input . props . disabled ) ) . toEqual ( [ true , false , true ] ) ;
150154 expect ( mocks . buildGeneratedRuleEntries ) . toHaveBeenCalledWith (
151155 expect . objectContaining ( {
152156 enabledModules : [ "core" ] ,
@@ -179,7 +183,7 @@ describe("RulesManagementSection", () => {
179183 ] ;
180184
181185 const defaultTree = renderSection ( ) ;
182- const allRulesTree = renderSection ( ) ;
186+ const allRulesTree = renderSection ( { allRulesOrderEditingEnabled : true } ) ;
183187 const detail = collectElements (
184188 defaultTree ,
185189 ( element ) =>
@@ -260,7 +264,7 @@ describe("RulesManagementSection", () => {
260264 } ,
261265 {
262266 key : "module:education:scholar" ,
263- editable : true ,
267+ editable : false ,
264268 summary : "Scholar" ,
265269 sourceLabel : "📚 教育学术" ,
266270 target : "💬 自定义1" ,
@@ -287,6 +291,33 @@ describe("RulesManagementSection", () => {
287291 expect ( text ) . not . toContain ( "自定义分组 ·" ) ;
288292 } ) ;
289293
294+ it ( "confirms before enabling all-rules order mode and disables without confirmation" , async ( ) => {
295+ const switchElement = collectElements ( renderSection ( ) , ( element ) => Boolean ( ( element . props as any ) . onCheckedChange ) ) [ 0 ] ;
296+
297+ mocks . confirmDialog . mockResolvedValueOnce ( false ) ;
298+ await switchElement . props . onCheckedChange ( true ) ;
299+ expect ( mocks . store . setAllRulesOrderEditingEnabled ) . not . toHaveBeenCalled ( ) ;
300+
301+ mocks . confirmDialog . mockResolvedValueOnce ( true ) ;
302+ await switchElement . props . onCheckedChange ( true ) ;
303+ expect ( mocks . confirmDialog ) . toHaveBeenCalledWith (
304+ expect . objectContaining ( {
305+ title : "开启“调整所有规则顺序”?" ,
306+ cancelText : "保持默认" ,
307+ confirmText : "继续开启" ,
308+ variant : "warning" ,
309+ } )
310+ ) ;
311+ expect ( mocks . store . setAllRulesOrderEditingEnabled ) . toHaveBeenCalledWith ( true ) ;
312+
313+ const enabledSwitch = collectElements (
314+ renderSection ( { allRulesOrderEditingEnabled : true } ) ,
315+ ( element ) => Boolean ( ( element . props as any ) . onCheckedChange )
316+ ) [ 0 ] ;
317+ await enabledSwitch . props . onCheckedChange ( false ) ;
318+ expect ( mocks . store . setAllRulesOrderEditingEnabled ) . toHaveBeenCalledWith ( false ) ;
319+ } ) ;
320+
290321 it ( "moves editable rules by buttons, absolute order input, blur, and escape cleanup" , ( ) => {
291322 stateMock . value = { "custom:one" : "1" } ;
292323 const tree = renderSection ( ) ;
@@ -327,6 +358,8 @@ describe("RulesManagementSection", () => {
327358 experimentalCnUseCnRuleSet : false ,
328359 ruleOrder : [ ] ,
329360 setRuleOrder : vi . fn ( ) ,
361+ allRulesOrderEditingEnabled : false ,
362+ setAllRulesOrderEditingEnabled : vi . fn ( ) ,
330363 } ;
331364 const tree = RulesManagementSection ( { isExpanded : false , onToggle : vi . fn ( ) } ) ;
332365 const header = collectElements ( tree , ( element ) => element . props . title === "规则管理" ) [ 0 ] ;
0 commit comments