handle batch rename paths and directory conflicts
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:guangya_flutter/models/batch_rename.dart';
|
||||
import 'package:guangya_flutter/models/cloud_file.dart';
|
||||
|
||||
CloudFile _file(String id, String name, {String folder = '/媒体'}) => CloudFile(
|
||||
id: id,
|
||||
name: name,
|
||||
isDirectory: false,
|
||||
cloudPath: '$folder/$name',
|
||||
);
|
||||
|
||||
void main() {
|
||||
const collapseNames = BatchRenameRule(
|
||||
id: 'collapse',
|
||||
kind: BatchRenameRuleKind.regex,
|
||||
pattern: r'\d+',
|
||||
);
|
||||
|
||||
test('rejects rule-generated names that collide in one folder', () {
|
||||
final previews = buildRenamePreviews(
|
||||
[_file('1', 'Episode 01.mkv'), _file('2', 'Episode 02.mkv')],
|
||||
[collapseNames],
|
||||
preserveExtension: true,
|
||||
);
|
||||
|
||||
expect(previews.every((item) => item.error != null), isTrue);
|
||||
expect(previews.first.error, contains('同名'));
|
||||
});
|
||||
|
||||
test('adds stable indexes for rule-generated duplicate names', () {
|
||||
final previews = buildRenamePreviews(
|
||||
[_file('1', 'Episode 01.mkv'), _file('2', 'Episode 02.mkv')],
|
||||
[collapseNames],
|
||||
preserveExtension: true,
|
||||
conflictStrategy: BatchRenameConflictStrategy.appendIndex,
|
||||
);
|
||||
|
||||
expect(previews.map((item) => item.newName), [
|
||||
'Episode .mkv',
|
||||
'Episode (2).mkv',
|
||||
]);
|
||||
expect(previews.every((item) => item.applicable), isTrue);
|
||||
});
|
||||
|
||||
test('allows the same generated name in separate cloud directories', () {
|
||||
final previews = buildRenamePreviews(
|
||||
[
|
||||
_file('1', 'Episode 01.mkv', folder: '/电视剧/第一季'),
|
||||
_file('2', 'Episode 02.mkv', folder: '/电视剧/第二季'),
|
||||
],
|
||||
[collapseNames],
|
||||
preserveExtension: true,
|
||||
);
|
||||
|
||||
expect(previews.map((item) => item.newName), [
|
||||
'Episode .mkv',
|
||||
'Episode .mkv',
|
||||
]);
|
||||
expect(previews.every((item) => item.applicable), isTrue);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user