fix(import): 修复本地 TXT 文件选择与导入

- 书架和文件管理统一使用 TXT 文件选择器,支持大小写扩展名及多选,排除 JSON 书源
- 保留所选文件访问权限至异步导入完成,等待选择器关闭后展示导入确认
- 补充双入口文件选择回归、导入校验和 TXT 测试样本
This commit is contained in:
Aminark
2026-10-22 10:51:09 +08:00
parent 7daa6b5635
commit bf72ebc894
9 changed files with 252 additions and 37 deletions
@@ -5,6 +5,38 @@ import LegadoCore
@MainActor
struct LocalFileManagementTests {
@Test func pickedTXTImportsButJSONFilesCannotBecomeLocalBooks() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)
try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
defer { try? FileManager.default.removeItem(at: root) }
let inputs = [
("小说.TXT", "第一章 开始\n本地小说的正文"),
("书源.json", #"{"bookSourceName":"书源"}"#),
("大写书源.JSON", #"{"bookSourceName":"书源"}"#)
]
let files = try inputs.map { name, text in
let url = root.appendingPathComponent(name)
try Data(text.utf8).write(to: url)
return LocalBookImportFile(url: url)
}
let model = BookLibraryModel(repository: InMemoryBookRepository(),
localDirectory: root.appendingPathComponent("managed"),
chapterRepository: InMemoryBookChapterRepository())
await model.load()
await model.importPickedLocalFiles(files)
let book = try #require(model.books.first)
#expect(model.books.count == 1)
#expect(book.origin == "local")
#expect(book.originName == "小说.TXT")
#expect(model.errorMessage?.contains("书源.json") == true)
#expect(model.errorMessage?.contains("大写书源.JSON") == true)
#expect(try await model.localFiles.list().count == 1)
let imported = try #require(URL(string: book.bookUrl))
#expect(try Data(contentsOf: imported) == Data(inputs[0].1.utf8))
}
private func fixture(fails: Bool = false) async throws -> (URL, Book, BookLibraryModel) {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)
try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)