feat: bgRFC/FM 支撑能力 + ADT 后缀剥离与 CLAS 激活修复(B1 配套)
新增能力: - remote-enable 子命令:设置函数模块处理类型为远程启用(bgRFC/RFC 执行体必需)。 实现要点均按实机验证:PUT fmodule:processingType="rfc"(枚举值仅小写 rfc 有效, remoteEnabled/remote/RFC 等均 400);lockHandle 走 query 参数(放 header 报 ParameterNotFound);PUT 后 GET 复核回显;DDIC 结构参数才可远程启用(类本地类型 报"针对 RFC 不允许使用类或接口的类型")。 - create --type functiongroup 透传 --package / --corr_nr(此前 package 被静默写成 $TMP, 导致函数组无法归目标包)。 修复: - activate 请求体补重复引用:ADT CLAS 激活端点对 objectReferences 只有 1 个引用时 返回 HTTP 200 + 空 body 且不执行激活;引用数 ≥2 才真正激活(同对象重复亦可)。 - scanner 剥离 ADT 文件后缀(xxx.clas.abap 解析错误)。 守卫测试: - tests/unit/test_bgrfc_support.py(17 例):函数组 package 透传、processingType 助手、 remote-enable 命令(含 lockHandle 走 query/小写 rfc/错误透传/复核失配判失败)、 函数 URI 组装不得用组名冒充模块名。 - test_activate.py 增加激活请求体引用数守卫;test_repo_guards.py 增加后缀剥离守卫。 测试:tests/unit 676 + tests/test_sapcli.py 69 = 745 全绿 (PYTHONPATH=assets python -m unittest discover -s tests/unit -t tests)
This commit is contained in:
@@ -104,6 +104,42 @@ class TestSkillDocStaysInSync(unittest.TestCase):
|
||||
)
|
||||
|
||||
|
||||
class TestScannerSupportsAdtFilenames(unittest.TestCase):
|
||||
"""扫描器必须支持 ADT/abapGit 风格文件名(`<name>.clas.abap`)。
|
||||
|
||||
背景:项目仓命名规范(如 ABAP_Integrated《命名规范》§4)要求 ADT 风格文件名,
|
||||
而扫描器曾只剥 `.abap`,把 `zcl_demo.clas.abap` 解析成对象名 `ZCL_DEMO.CLAS`——
|
||||
对象名带伪后缀,`sync/refresh/diff --all` 全部落空。目录规范只写在文档、
|
||||
工具却不支持的同类问题,用守卫挡住。
|
||||
"""
|
||||
|
||||
def test_every_type_with_adt_suffix_maps_to_known_type(self):
|
||||
from sapcli.scanner import ADT_TYPE_SUFFIX, TYPE_DIR_LOOKUP
|
||||
|
||||
known = set(TYPE_DIR_LOOKUP.values())
|
||||
unknown = [t for t in ADT_TYPE_SUFFIX if t not in known]
|
||||
self.assertFalse(unknown, f"ADT 后缀表引用了未注册的对象类型: {unknown}")
|
||||
|
||||
def test_adt_suffix_stripped_for_all_registered_types(self):
|
||||
from sapcli.scanner import ADT_TYPE_SUFFIX, _strip_adt_suffix
|
||||
|
||||
for obj_type, suffix in ADT_TYPE_SUFFIX.items():
|
||||
name = f"zobj_{obj_type.lower()}"
|
||||
self.assertEqual(
|
||||
_strip_adt_suffix(f"{name}.{suffix}", obj_type), name,
|
||||
f"{obj_type} 的 ADT 后缀 .{suffix} 未被剥离",
|
||||
)
|
||||
|
||||
def test_plain_filename_unaffected(self):
|
||||
from sapcli.scanner import ADT_TYPE_SUFFIX, _strip_adt_suffix
|
||||
|
||||
for obj_type, suffix in ADT_TYPE_SUFFIX.items():
|
||||
name = f"zobj_{obj_type.lower()}"
|
||||
self.assertEqual(_strip_adt_suffix(name, obj_type), name)
|
||||
# 其他类型的后缀不得被误剥
|
||||
self.assertEqual(_strip_adt_suffix(f"{name}.{suffix}", "unknown_type"), f"{name}.{suffix}")
|
||||
|
||||
|
||||
class TestReferencesAreComplete(unittest.TestCase):
|
||||
"""references/ 是规则的正本,必须齐备。"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user