feat: refine AI retouch workflow
This commit is contained in:
@@ -25,7 +25,7 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
XCTAssertTrue(viewModel.shouldShowInitialTips)
|
||||
XCTAssertEqual(
|
||||
viewModel.initialTipsText,
|
||||
"Tips:氛围感修图为选填,可横向选择一种样式;选中后每张照片会额外生成1个独立结果,第一张照片仍另生成封面。"
|
||||
"Tips:氛围感修图为选填;封面风格为必选,将使用第一张照片另生成封面。"
|
||||
)
|
||||
XCTAssertEqual(viewModel.visibleCategories, [.refined, .atmosphere, .cover])
|
||||
XCTAssertEqual(viewModel.selectedRefinedTemplateId, 11)
|
||||
@@ -44,6 +44,14 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
)
|
||||
await viewModel.loadTemplates(api: api)
|
||||
|
||||
XCTAssertEqual(
|
||||
viewModel.initialTipsText,
|
||||
"Tips:氛围感修图为选填,选中后每张照片会额外生成1个独立结果。"
|
||||
)
|
||||
|
||||
viewModel.toggleTemplate(id: 11, category: .refined)
|
||||
XCTAssertEqual(viewModel.selectedRefinedTemplateId, 11)
|
||||
|
||||
viewModel.toggleTemplate(id: 21, category: .atmosphere)
|
||||
XCTAssertEqual(viewModel.selectedAtmosphereTemplateId, 21)
|
||||
|
||||
@@ -126,7 +134,10 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
await all.loadTemplates(api: api)
|
||||
XCTAssertEqual(all.visibleCategories, [.refined, .atmosphere])
|
||||
XCTAssertEqual(all.selectedRefinedTemplateId, 11)
|
||||
XCTAssertEqual(all.selectedAtmosphereTemplateId, 21)
|
||||
XCTAssertNil(all.selectedAtmosphereTemplateId)
|
||||
XCTAssertTrue(all.isOptional(.atmosphere))
|
||||
XCTAssertEqual(all.requiredQuota, 1)
|
||||
XCTAssertTrue(all.canSubmit)
|
||||
await all.submit(api: api)
|
||||
|
||||
XCTAssertEqual(api.aiReretouchRequests, [
|
||||
@@ -149,7 +160,7 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
aiRetouchBatchId: 90,
|
||||
type: .all,
|
||||
refinedTemplateId: 11,
|
||||
atmosphereTemplateId: 21
|
||||
atmosphereTemplateId: nil
|
||||
),
|
||||
])
|
||||
}
|
||||
@@ -172,12 +183,13 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
XCTAssertTrue(api.aiReretouchRequests.isEmpty)
|
||||
}
|
||||
|
||||
func testMissingRequiredTemplateDisablesMatchingWorkflow() async {
|
||||
func testMissingOptionalAtmosphereDoesNotDisableAllReretouchWorkflow() async {
|
||||
let api = makeAPI()
|
||||
api.aiRetouchTemplatesResponse = TravelAlbumAIRetouchTemplatesResponse(
|
||||
refinedTemplates: [template(11, "清透")],
|
||||
atmosphereTemplates: [],
|
||||
coverTemplates: []
|
||||
coverTemplates: [],
|
||||
remainingQuota: 100
|
||||
)
|
||||
let viewModel = TravelAlbumAIRetouchTemplateViewModel(
|
||||
scenicId: 18,
|
||||
@@ -186,8 +198,42 @@ final class TravelAlbumAIRetouchTemplateViewModelTests: XCTestCase {
|
||||
|
||||
await viewModel.loadTemplates(api: api)
|
||||
|
||||
XCTAssertFalse(viewModel.canSubmit)
|
||||
XCTAssertEqual(viewModel.validationMessage, "暂无可用的氛围感修图模板")
|
||||
XCTAssertTrue(viewModel.canSubmit)
|
||||
XCTAssertNil(viewModel.validationMessage)
|
||||
XCTAssertEqual(viewModel.requiredQuota, 1)
|
||||
}
|
||||
|
||||
func testMissingRequiredRefinedAndCoverTemplatesDisableMatchingWorkflows() async {
|
||||
let refinedAPI = makeAPI()
|
||||
refinedAPI.aiRetouchTemplatesResponse = TravelAlbumAIRetouchTemplatesResponse(
|
||||
refinedTemplates: [],
|
||||
atmosphereTemplates: [template(21, "暖阳")],
|
||||
coverTemplates: [template(31, "杂志")],
|
||||
remainingQuota: 100
|
||||
)
|
||||
let reretouch = TravelAlbumAIRetouchTemplateViewModel(
|
||||
scenicId: 18,
|
||||
workflow: .reretouch(materialId: 7, batchId: 70, type: .all)
|
||||
)
|
||||
await reretouch.loadTemplates(api: refinedAPI)
|
||||
XCTAssertFalse(reretouch.canSubmit)
|
||||
XCTAssertEqual(reretouch.validationMessage, "暂无可用的原图精修模板")
|
||||
|
||||
let coverAPI = makeAPI()
|
||||
coverAPI.aiRetouchTemplatesResponse = TravelAlbumAIRetouchTemplatesResponse(
|
||||
refinedTemplates: [template(11, "清透")],
|
||||
atmosphereTemplates: [template(21, "暖阳")],
|
||||
coverTemplates: [],
|
||||
remainingQuota: 100
|
||||
)
|
||||
let batch = TravelAlbumAIRetouchTemplateViewModel(
|
||||
albumId: 8,
|
||||
scenicId: 18,
|
||||
materialIds: [1, 2, 3, 4]
|
||||
)
|
||||
await batch.loadTemplates(api: coverAPI)
|
||||
XCTAssertFalse(batch.canSubmit)
|
||||
XCTAssertEqual(batch.validationMessage, "暂无可用的封面风格模板")
|
||||
}
|
||||
|
||||
func testLoadFailureExposesRetryMessageAndKeepsSubmissionDisabled() async {
|
||||
|
||||
Reference in New Issue
Block a user