修复边拍边传自动上传范围,并避免上传状态被旧快照回退。
拍后传输下载的历史照片切换模式后不再自动补传;刷新相机文件仅同步本地。重试上传后刷新单张状态,并忽略乱序 pipeline 通知导致的已上传回退。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -60,6 +60,45 @@ final class CameraTransferPipelineTests: XCTestCase {
|
||||
XCTAssertEqual(pipeline.task(forAssetID: "asset_retry_001")?.status, .uploaded)
|
||||
}
|
||||
|
||||
/// 测试拍后传输下载的旧照片,切到边拍边传后不会被新照片触发自动上传。
|
||||
func testSwitchingToLiveCaptureDoesNotUploadPostShootDownloads() async throws {
|
||||
let camera = MockCameraService()
|
||||
let sink = MockUploadSink()
|
||||
let pipeline = CameraTransferPipeline(cameraService: camera)
|
||||
pipeline.configure(uploadSink: sink, uploadEnabled: false)
|
||||
|
||||
camera.onNewAsset?(CameraAsset(id: "post_001", filename: "POST_001.JPG", fileSize: 1024))
|
||||
try await Task.sleep(nanoseconds: 400_000_000)
|
||||
|
||||
XCTAssertEqual(sink.uploadedFileNames, [])
|
||||
XCTAssertEqual(pipeline.task(forAssetID: "post_001")?.status, .downloaded)
|
||||
|
||||
pipeline.configure(uploadSink: sink, uploadEnabled: true)
|
||||
camera.onNewAsset?(CameraAsset(id: "live_001", filename: "LIVE_001.JPG", fileSize: 1024))
|
||||
try await Task.sleep(nanoseconds: 500_000_000)
|
||||
|
||||
XCTAssertEqual(sink.uploadedFileNames, ["LIVE_001.JPG"])
|
||||
XCTAssertEqual(pipeline.task(forAssetID: "post_001")?.status, .downloaded)
|
||||
XCTAssertEqual(pipeline.task(forAssetID: "live_001")?.status, .uploaded)
|
||||
}
|
||||
|
||||
/// 测试边拍边传模式下刷新历史照片只同步到本地,不授予自动上传资格。
|
||||
func testSyncExistingPhotosDoesNotAutoUploadInLiveCaptureMode() async throws {
|
||||
let camera = MockCameraService()
|
||||
let sink = MockUploadSink()
|
||||
let pipeline = CameraTransferPipeline(cameraService: camera)
|
||||
pipeline.configure(uploadSink: sink, uploadEnabled: true)
|
||||
camera.listedAssets = [
|
||||
CameraAsset(id: "history_001", filename: "HISTORY_001.JPG", fileSize: 1024)
|
||||
]
|
||||
|
||||
await pipeline.syncExistingPhotos()
|
||||
try await Task.sleep(nanoseconds: 200_000_000)
|
||||
|
||||
XCTAssertEqual(sink.uploadedFileNames, [])
|
||||
XCTAssertEqual(pipeline.task(forAssetID: "history_001")?.status, .downloaded)
|
||||
}
|
||||
|
||||
/// 测试边拍边传连拍时,多张照片会按并发上限同时上传。
|
||||
func testBurstCaptureUploadsAllAssetsWhileFirstUploadInProgress() async throws {
|
||||
let camera = MockBurstCameraService()
|
||||
@ -111,12 +150,13 @@ private final class MockCameraService: CameraServiceProtocol {
|
||||
var connectionState: CameraConnectionState = .connected(deviceName: "Mock")
|
||||
var onConnectionStateChange: ((CameraConnectionState) -> Void)?
|
||||
var onNewAsset: ((CameraAsset) -> Void)?
|
||||
var listedAssets: [CameraAsset] = []
|
||||
|
||||
func connect() async {}
|
||||
func disconnect() async {}
|
||||
|
||||
func listAssets() async throws -> [CameraAsset] {
|
||||
[]
|
||||
listedAssets
|
||||
}
|
||||
|
||||
func downloadAsset(_ asset: CameraAsset) async throws -> URL {
|
||||
@ -179,6 +219,7 @@ private final class MockSlowUploadSink: CameraAssetUploadSink {
|
||||
@MainActor
|
||||
private final class MockUploadSink: CameraAssetUploadSink {
|
||||
var uploadCount = 0
|
||||
var uploadedFileNames: [String] = []
|
||||
|
||||
func upload(
|
||||
localURL: URL,
|
||||
@ -187,6 +228,7 @@ private final class MockUploadSink: CameraAssetUploadSink {
|
||||
progress: @escaping @Sendable (Int) -> Void
|
||||
) async throws -> String {
|
||||
uploadCount += 1
|
||||
uploadedFileNames.append(fileName)
|
||||
progress(100)
|
||||
return "https://cdn/mock/\(fileName)"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user