mirror of
https://github.com/Aminark/legado-ios.git
synced 2026-10-24 04:41:23 +08:00
fix(import): 修复本地 TXT 文件选择与导入
- 书架和文件管理统一使用 TXT 文件选择器,支持大小写扩展名及多选,排除 JSON 书源 - 保留所选文件访问权限至异步导入完成,等待选择器关闭后展示导入确认 - 补充双入口文件选择回归、导入校验和 TXT 测试样本
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user