Files
suixinkan_uikit/suixinkanTests/TravelAlbumOTGCoreTests.swift
汉秋 005349f8e6 模块化 AppStore 并完善素材管理与个人空间设置。
将会话、权限、位置、收款与排队存储拆分为独立模块,同步更新各 ViewModel 与单元测试,并补充素材管理 UI 与个人空间设置交互。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-13 11:01:08 +08:00

110 lines
4.0 KiB
Swift

//
// TravelAlbumOTGCoreTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
/// OTG Core
final class TravelAlbumOTGCoreTests: XCTestCase {
func testPlatformDetectorPrefersVendorID() {
let sony = CameraDeviceInfo(
name: "Unknown",
manufacturer: nil,
model: nil,
serialNumber: nil,
usbVendorID: 0x054C,
usbProductID: nil
)
let canon = CameraDeviceInfo(
name: "EOS R6",
manufacturer: nil,
model: nil,
serialNumber: nil,
usbVendorID: nil,
usbProductID: nil
)
XCTAssertEqual(PlatformDetector.detect(from: sony), .sony)
XCTAssertEqual(PlatformDetector.detect(from: canon), .canon)
}
func testPTPCommandBuildAndParse() throws {
let data = PTPHelper.buildCommand(code: 0x1001, transactionID: 7, parameters: [1, 2])
let parsed = try PTPHelper.parseContainer(data)
XCTAssertEqual(parsed.length, 20)
XCTAssertEqual(parsed.type, PTPContainerType.command.rawValue)
XCTAssertEqual(parsed.code, 0x1001)
XCTAssertEqual(parsed.transactionID, 7)
XCTAssertEqual(parsed.params, [1, 2])
}
func testPhotoFormatMatcherResolvesJpegRawPeers() {
let jpeg = CameraObject(id: "J", filename: "IMG_0001.JPG", fileSize: 1, capturedAt: Date())
let raw = CameraObject(id: "R", filename: "IMG_0001.ARW", fileSize: 2, capturedAt: Date())
let other = CameraObject(id: "O", filename: "IMG_0002.MOV", fileSize: 3, capturedAt: Date())
XCTAssertEqual(TravelAlbumOTGPhotoFormatMatcher.classify(name: jpeg.filename), .jpeg)
XCTAssertEqual(TravelAlbumOTGPhotoFormatMatcher.classify(name: raw.filename), .raw)
XCTAssertEqual(TravelAlbumOTGPhotoFormatMatcher.classify(name: other.filename, isVideo: true), .other)
let jpgTargets = TravelAlbumOTGPhotoFormatMatcher.resolveUploadTargets(
requested: [raw],
allObjects: [jpeg, raw, other],
option: .jpg
)
let pairTargets = TravelAlbumOTGPhotoFormatMatcher.resolveUploadTargets(
requested: [jpeg],
allObjects: [jpeg, raw, other],
option: .jpegRaw
)
XCTAssertEqual(jpgTargets.map(\.id), ["J"])
XCTAssertEqual(pairTargets.map(\.id), ["J", "R"])
}
func testOSSAlbumObjectKeyUsesAlbumModule() {
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(secondsFromGMT: 0)!
let date = calendar.date(from: DateComponents(year: 2026, month: 7, day: 7))!
let uuid = UUID(uuidString: "11111111-2222-3333-4444-555555555555")!
let key = OSSUploadPolicy.objectKey(
fileName: "A/B.JPG",
scenicId: 9,
moduleType: "album",
date: date,
uuid: uuid,
timeZone: TimeZone(secondsFromGMT: 0)!
)
XCTAssertTrue(key.hasPrefix("album/20260707/9/11111111222233334444555555555555_"))
XCTAssertTrue(key.hasSuffix("A_B.JPG"))
}
func testOSSPunchPointObjectKeyUsesAndroidUserPath() {
let previousUserId = AppStore.shared.session.userId
AppStore.shared.session.userId = "u900"
defer { AppStore.shared.session.userId = previousUserId }
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(secondsFromGMT: 0)!
let date = calendar.date(from: DateComponents(year: 2026, month: 7, day: 9))!
let uuid = UUID(uuidString: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")!
let key = OSSUploadPolicy.objectKey(
fileName: "guide/photo.jpg",
scenicId: 9,
moduleType: "punch_point",
date: date,
uuid: uuid,
timeZone: TimeZone(secondsFromGMT: 0)!
)
XCTAssertEqual(key, "punch_point/20260709/u900/aaaaaaaabbbbccccddddeeeeeeeeeeee_guide_photo.jpg")
}
}