之前把 wxworkSchema 当成 Info.plist 顶层键写入,但真实 readoor31.plist 里企业微信 Schema 位于 CFBundleURLTypes(CFBundleURLName == "wxwork", 占位值 "1"),顶层键无效、占位符从未被替换。 改为并入 _update_plist 已有的 CFBundleURLTypes 替换逻辑:填写则替换 CFBundleURLSchemes,未配置则整条移除,与 weixinlogin/wechatpay/tencent 一致。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZULZ8fkiaiJrxqf318xTn
114 lines
5.1 KiB
Python
114 lines
5.1 KiB
Python
"""服务端工程配置替换测试。"""
|
|
import plistlib
|
|
|
|
from backend.services.project_patcher import apply_project_config
|
|
|
|
|
|
def test_apply_project_config_without_branch_autopacking(tmp_path):
|
|
build_dir = tmp_path / "build"
|
|
project = build_dir / "readoor.xcodeproj"
|
|
swift = build_dir / "readoor" / "3.0" / "AppConfig"
|
|
resources = build_dir / "readoor" / "3.0" / "Resources"
|
|
assets = build_dir / "readoor" / "BookShelf" / "Resources" / "Images.xcassets"
|
|
logo = resources / "3.0.xcassets" / "AppLogo.imageset"
|
|
for path in [project, swift, resources, assets, logo]:
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
|
|
(project / "project.pbxproj").write_text(
|
|
"MARKETING_VERSION = 1.0;\nCURRENT_PROJECT_VERSION = 1;\n"
|
|
"PRODUCT_BUNDLE_IDENTIFIER = old.id;\nDEVELOPMENT_TEAM = OLD;\n"
|
|
'"DEVELOPMENT_TEAM[sdk=iphoneos*]" = OLD;\n'
|
|
"PROVISIONING_PROFILE_SPECIFIER = old;\n"
|
|
'"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = old;\n'
|
|
'CODE_SIGN_IDENTITY = "iPhone Developer";\n'
|
|
'"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";\n',
|
|
encoding="utf-8",
|
|
)
|
|
(swift / "RDAppConfiguration.swift").write_text(
|
|
'let RD_APP_GUID: String = "old"\nlet RD_API_DOMAIN: String = "old"\n'
|
|
'let RD_WECHAT_PAY_ID: String = "old"\nlet RD_SOURCE_VERSION: String = "old"\n',
|
|
encoding="utf-8",
|
|
)
|
|
(build_dir / "readoor" / "3.0" / "readoor31.entitlements").write_text(
|
|
"<string>applinks:old</string>\n", encoding="utf-8"
|
|
)
|
|
with (build_dir / "readoor" / "3.0" / "readoor31.plist").open("wb") as f:
|
|
plistlib.dump({"CFBundleURLTypes": [
|
|
{"CFBundleURLName": "wxwork", "CFBundleURLSchemes": ["1"]},
|
|
]}, f)
|
|
|
|
theme = tmp_path / "theme" / "AppIcon.appiconset"
|
|
theme.mkdir(parents=True)
|
|
(theme / "icon-1024.png").write_bytes(b"icon")
|
|
|
|
config = {
|
|
"VERSION": "2.0.0", "BUILD_VERSION": "2.0.0.1", "APPID": "guid",
|
|
"API": "https://api.example.com", "weixinpay": "wx-pay", "APPID_NAME": "Test",
|
|
"wxworkSchema": "wx1234567890abcdef",
|
|
"BUNDLE_ID": "com.example.test", "TEAM_ID": "TEAM", "PROVISIONING_NAME": "profile",
|
|
"ASSOCIATED_DOMAINS": "applinks:example.com", "THEME": str(theme.parent), "BUILD_TYPE": "Ad_Hoc",
|
|
"CERTIFICATE": "Apple Distribution",
|
|
}
|
|
|
|
messages = apply_project_config(build_dir, config)
|
|
|
|
assert "工程、签名、版本和分发配置已更新" in messages
|
|
assert 'let RD_APP_GUID: String = "guid"' in (swift / "RDAppConfiguration.swift").read_text()
|
|
project_content = (project / "project.pbxproj").read_text()
|
|
assert "PRODUCT_BUNDLE_IDENTIFIER = com.example.test;" in project_content
|
|
assert 'CODE_SIGN_IDENTITY = "iPhone Distribution";' in project_content
|
|
assert '"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";' in project_content
|
|
assert "iPhone Developer" not in project_content
|
|
assert (build_dir / "exportOptions.plist").exists()
|
|
assert (logo / "icon-1024.png").read_bytes() == b"icon"
|
|
with (build_dir / "readoor" / "3.0" / "readoor31.plist").open("rb") as f:
|
|
url_types = plistlib.load(f)["CFBundleURLTypes"]
|
|
wxwork = next(i for i in url_types if i["CFBundleURLName"] == "wxwork")
|
|
assert wxwork["CFBundleURLSchemes"] == ["wx1234567890abcdef"]
|
|
|
|
|
|
def _make_minimal_project(build_dir):
|
|
"""构造 apply_project_config 所需的最小工程骨架,返回关键文件路径。"""
|
|
project = build_dir / "readoor.xcodeproj"
|
|
swift = build_dir / "readoor" / "3.0" / "AppConfig"
|
|
entitlements_dir = build_dir / "readoor" / "3.0"
|
|
for path in [project, swift, entitlements_dir]:
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
(project / "project.pbxproj").write_text(
|
|
"MARKETING_VERSION = 1.0;\nCURRENT_PROJECT_VERSION = 1;\n"
|
|
'CODE_SIGN_IDENTITY = "iPhone Developer";\n'
|
|
'"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";\n',
|
|
encoding="utf-8",
|
|
)
|
|
(swift / "RDAppConfiguration.swift").write_text(
|
|
'let RD_APP_GUID: String = "old"\nlet RD_API_DOMAIN: String = "old"\n'
|
|
'let RD_WECHAT_PAY_ID: String = "old"\nlet RD_SOURCE_VERSION: String = "old"\n',
|
|
encoding="utf-8",
|
|
)
|
|
(entitlements_dir / "readoor31.entitlements").write_text(
|
|
"<string>applinks:old</string>\n", encoding="utf-8"
|
|
)
|
|
return entitlements_dir / "readoor31.plist"
|
|
|
|
|
|
def test_wxwork_schema_removed_when_not_configured(tmp_path):
|
|
build_dir = tmp_path / "build"
|
|
plist_path = _make_minimal_project(build_dir)
|
|
with plist_path.open("wb") as f:
|
|
plistlib.dump({"CFBundleURLTypes": [
|
|
{"CFBundleURLName": "wxwork", "CFBundleURLSchemes": ["1"]},
|
|
]}, f)
|
|
|
|
config = {
|
|
"VERSION": "2.0.0", "BUILD_VERSION": "2.0.0.1", "APPID": "guid",
|
|
"API": "https://api.example.com", "APPID_NAME": "Test",
|
|
"ASSOCIATED_DOMAINS": "applinks:example.com", "BUILD_TYPE": "Ad_Hoc",
|
|
"CERTIFICATE": "Apple Distribution",
|
|
}
|
|
|
|
apply_project_config(build_dir, config)
|
|
|
|
with plist_path.open("rb") as f:
|
|
url_types = plistlib.load(f)["CFBundleURLTypes"]
|
|
assert all(i.get("CFBundleURLName") != "wxwork" for i in url_types)
|