feat: update app workflows and permissions

This commit is contained in:
2026-07-09 17:34:00 +08:00
parent 43e6133c21
commit 8e356973bd
44 changed files with 2944 additions and 307 deletions

View File

@ -4,6 +4,7 @@
//
import UIKit
import WechatOpenSDK
import XCTest
@testable import suixinkan
@ -24,6 +25,24 @@ final class WeChatShareServiceTests: XCTestCase {
XCTAssertEqual(WeChatShareScene.favorite.wxSceneValue, 2)
}
/// SDK
func testMiniProgramTypeMapsToWXValues() {
XCTAssertEqual(WeChatMiniProgramType.release.rawValue, 0)
XCTAssertEqual(WeChatMiniProgramType.test.rawValue, 1)
XCTAssertEqual(WeChatMiniProgramType.preview.rawValue, 2)
}
/// Debug 使Release
func testMiniProgramTypeResolvesForCurrentBuild() {
#if DEBUG
XCTAssertEqual(WeChatMiniProgramType.release.resolvedForCurrentBuild, .preview)
XCTAssertEqual(WeChatMiniProgramType.test.resolvedForCurrentBuild, .preview)
#else
XCTAssertEqual(WeChatMiniProgramType.release.resolvedForCurrentBuild, .release)
XCTAssertEqual(WeChatMiniProgramType.test.resolvedForCurrentBuild, .test)
#endif
}
///
func testShareResultFromWXErrorCode() {
XCTAssertEqual(WeChatShareResult.fromWXErrorCode(0), .success)
@ -45,6 +64,23 @@ final class WeChatShareServiceTests: XCTestCase {
XCTAssertLessThanOrEqual(thumbData.count, WeChatThumbImageProcessor.maxThumbBytes)
}
///
func testMiniProgramHDImageProcessorKeepsDataUnderLimit() throws {
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 1200, height: 800))
let image = renderer.image { context in
UIColor.systemGreen.setFill()
context.fill(CGRect(x: 0, y: 0, width: 1200, height: 800))
UIColor.white.setFill()
context.fill(CGRect(x: 160, y: 120, width: 880, height: 560))
UIColor.systemBlue.setFill()
context.fill(CGRect(x: 260, y: 220, width: 680, height: 360))
}
let imageData = try XCTUnwrap(WeChatThumbImageProcessor.makeMiniProgramHDImageData(from: image))
XCTAssertLessThanOrEqual(imageData.count, WeChatThumbImageProcessor.maxMiniProgramHDImageBytes)
XCTAssertNil(WeChatThumbImageProcessor.makeMiniProgramHDImageData(from: image, maxBytes: 0))
}
///
func testShareWebPageRejectsInvalidPayloadBeforeSending() {
var results: [WeChatShareResult] = []
@ -66,4 +102,90 @@ final class WeChatShareServiceTests: XCTestCase {
.invalidPayload("分享链接不能为空"),
])
}
///
func testMakeMiniProgramRequestFillsWXObject() throws {
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 600, height: 400))
let image = renderer.image { context in
UIColor.systemOrange.setFill()
context.fill(CGRect(x: 0, y: 0, width: 600, height: 400))
}
let payload = WeChatMiniProgramSharePayload(
title: " 举报详情 ",
description: "查看处理进度",
webpageURL: " https://www.zhifly.cn/report/40 ",
userName: " gh_xxxxxxxx ",
path: " /pages/report/detail?id=40 ",
miniProgramType: .preview,
withShareTicket: true,
disableForward: true
)
let request = try XCTUnwrap(try WeChatShareService.makeMiniProgramRequest(payload, scene: .session, previewImage: image).get())
let message = try XCTUnwrap(request.message)
let miniProgramObject = try XCTUnwrap(message.mediaObject as? WXMiniProgramObject)
XCTAssertFalse(request.bText)
XCTAssertEqual(request.scene, WeChatShareScene.session.wxSceneValue)
XCTAssertEqual(message.title, "举报详情")
XCTAssertEqual(message.description, "查看处理进度")
XCTAssertEqual(miniProgramObject.webpageUrl, "https://www.zhifly.cn/report/40")
XCTAssertEqual(miniProgramObject.userName, "gh_xxxxxxxx")
XCTAssertEqual(miniProgramObject.path, "/pages/report/detail?id=40")
XCTAssertEqual(miniProgramObject.miniProgramType.rawValue, UInt(WeChatMiniProgramType.preview.resolvedForCurrentBuild.rawValue))
XCTAssertEqual(miniProgramObject.withShareTicket, true)
XCTAssertEqual(miniProgramObject.disableForward, true)
XCTAssertLessThanOrEqual(miniProgramObject.hdImageData?.count ?? 0, WeChatThumbImageProcessor.maxMiniProgramHDImageBytes)
}
///
func testMakeMiniProgramRequestRejectsInvalidPayload() {
let valid = WeChatMiniProgramSharePayload(
title: "举报详情",
description: "查看处理进度",
webpageURL: "https://www.zhifly.cn/report/40",
userName: "gh_xxxxxxxx"
)
let longURL = "https://www.zhifly.cn/" + String(repeating: "a", count: 1025)
XCTAssertEqual(
WeChatShareService.makeMiniProgramRequest(valid, scene: .timeline).failure,
.invalidPayload("小程序仅支持分享到微信好友")
)
XCTAssertEqual(
WeChatShareService.makeMiniProgramRequest(
WeChatMiniProgramSharePayload(title: " ", description: "", webpageURL: valid.webpageURL, userName: valid.userName),
scene: .session
).failure,
.invalidPayload("分享标题不能为空")
)
XCTAssertEqual(
WeChatShareService.makeMiniProgramRequest(
WeChatMiniProgramSharePayload(title: valid.title, description: "", webpageURL: " ", userName: valid.userName),
scene: .session
).failure,
.invalidPayload("小程序兼容网页链接不能为空")
)
XCTAssertEqual(
WeChatShareService.makeMiniProgramRequest(
WeChatMiniProgramSharePayload(title: valid.title, description: "", webpageURL: longURL, userName: valid.userName),
scene: .session
).failure,
.invalidPayload("小程序兼容网页链接不能超过1024字节")
)
XCTAssertEqual(
WeChatShareService.makeMiniProgramRequest(
WeChatMiniProgramSharePayload(title: valid.title, description: "", webpageURL: valid.webpageURL, userName: " "),
scene: .session
).failure,
.invalidPayload("小程序原始 ID 不能为空")
)
}
}
private extension Result where Success == SendMessageToWXReq, Failure == WeChatShareResult {
var failure: WeChatShareResult? {
guard case .failure(let result) = self else { return nil }
return result
}
}