feat: add travel album OTG import flow
This commit is contained in:
109
suixinkanTests/TravelAlbumOTGStorageTests.swift
Normal file
109
suixinkanTests/TravelAlbumOTGStorageTests.swift
Normal file
@ -0,0 +1,109 @@
|
||||
//
|
||||
// TravelAlbumOTGStorageTests.swift
|
||||
// suixinkanTests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import suixinkan
|
||||
|
||||
/// 旅拍相册 OTG 本地存储测试。
|
||||
final class TravelAlbumOTGStorageTests: XCTestCase {
|
||||
func testStoragePathContainsAccountScenicStoreAndAlbum() throws {
|
||||
let root = try makeTempDirectory()
|
||||
defer { try? FileManager.default.removeItem(at: root) }
|
||||
let store = makeStore(root: root)
|
||||
|
||||
let originals = try store.originalsDirectory(albumId: 33)
|
||||
let previews = try store.previewsDirectory(albumId: 33)
|
||||
|
||||
XCTAssertTrue(originals.path.contains("u1_photog/scenic_11/store_22/album_33/originals"))
|
||||
XCTAssertTrue(previews.path.contains("u1_photog/scenic_11/store_22/album_33/previews"))
|
||||
}
|
||||
|
||||
func testUniqueOriginalFileURLAvoidsOverwrite() throws {
|
||||
let root = try makeTempDirectory()
|
||||
defer { try? FileManager.default.removeItem(at: root) }
|
||||
let store = makeStore(root: root)
|
||||
|
||||
let first = try store.uniqueOriginalFileURL(filename: "IMG/1.JPG", albumId: 33)
|
||||
try Data([1]).write(to: first)
|
||||
let second = try store.uniqueOriginalFileURL(filename: "IMG/1.JPG", albumId: 33)
|
||||
|
||||
XCTAssertEqual(first.lastPathComponent, "IMG_1.JPG")
|
||||
XCTAssertEqual(second.lastPathComponent, "IMG_1_1.JPG")
|
||||
}
|
||||
|
||||
func testLoadNormalizesInterruptedTransferToPending() throws {
|
||||
let root = try makeTempDirectory()
|
||||
defer { try? FileManager.default.removeItem(at: root) }
|
||||
let store = makeStore(root: root)
|
||||
let file = try store.uniqueOriginalFileURL(filename: "A.JPG", albumId: 33)
|
||||
try Data([1, 2, 3]).write(to: file)
|
||||
let record = TravelAlbumOTGPhotoRecord(
|
||||
id: "1",
|
||||
fileName: "A.JPG",
|
||||
localPath: file.path,
|
||||
capturedAt: "2026-07-07 10:00:00",
|
||||
fileSizeBytes: 3,
|
||||
status: .uploading,
|
||||
progress: 50,
|
||||
albumId: 33,
|
||||
userId: "u1"
|
||||
)
|
||||
|
||||
store.save([record], albumId: 33)
|
||||
let loaded = store.load(albumId: 33)
|
||||
|
||||
XCTAssertEqual(loaded.first?.status, .pending)
|
||||
XCTAssertEqual(loaded.first?.progress, 0)
|
||||
}
|
||||
|
||||
func testRemoveAndClearAlbumDeleteFiles() throws {
|
||||
let root = try makeTempDirectory()
|
||||
defer { try? FileManager.default.removeItem(at: root) }
|
||||
let store = makeStore(root: root)
|
||||
let file = try store.uniqueOriginalFileURL(filename: "A.JPG", albumId: 33)
|
||||
try Data([1]).write(to: file)
|
||||
let record = TravelAlbumOTGPhotoRecord(
|
||||
id: "1",
|
||||
fileName: "A.JPG",
|
||||
localPath: file.path,
|
||||
capturedAt: "2026-07-07 10:00:00",
|
||||
fileSizeBytes: 1,
|
||||
status: .pending,
|
||||
albumId: 33,
|
||||
userId: "u1"
|
||||
)
|
||||
store.save([record], albumId: 33)
|
||||
|
||||
store.remove(albumId: 33, photoId: "1")
|
||||
|
||||
XCTAssertFalse(FileManager.default.fileExists(atPath: file.path))
|
||||
XCTAssertTrue(store.load(albumId: 33).isEmpty)
|
||||
|
||||
let another = try store.uniqueOriginalFileURL(filename: "B.JPG", albumId: 33)
|
||||
try Data([2]).write(to: another)
|
||||
store.clearAlbum(albumId: 33)
|
||||
|
||||
XCTAssertFalse(FileManager.default.fileExists(atPath: another.deletingLastPathComponent().deletingLastPathComponent().path))
|
||||
}
|
||||
|
||||
private func makeStore(root: URL) -> TravelAlbumOTGPhotoStore {
|
||||
TravelAlbumOTGPhotoStore(
|
||||
context: TravelAlbumOTGStorageContext(
|
||||
accountCachePrefix: "u1_photog",
|
||||
userId: "u1",
|
||||
scenicId: 11,
|
||||
storeId: 22
|
||||
),
|
||||
applicationSupportDirectory: root.appendingPathComponent("ApplicationSupport", isDirectory: true),
|
||||
cachesDirectory: root.appendingPathComponent("Caches", isDirectory: true)
|
||||
)
|
||||
}
|
||||
|
||||
private func makeTempDirectory() throws -> URL {
|
||||
let url = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)
|
||||
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
|
||||
return url
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user