|
|
@@ -95,9 +95,18 @@ def test_connector_prop_validators_execute_strict_database_and_rest_contracts():
|
|
|
r"const\s+CONNECTOR_ID_PATTERN\s*=\s*(/[^\n;]+/)", source
|
|
|
)
|
|
|
assert pattern_match, "connector ID regex declaration is missing"
|
|
|
+ assert pattern_match.group(1) == "/^[a-z][a-z0-9_-]{2,63}$/"
|
|
|
|
|
|
connector_validator = _validator_expression(connector_ids)
|
|
|
mode_validator = _validator_expression(mode)
|
|
|
+ mode_values_match = re.fullmatch(
|
|
|
+ r"value\s*=>\s*\[\s*(.*?)\s*\]\.includes\(value\)", mode_validator
|
|
|
+ )
|
|
|
+ assert mode_values_match, "mode validator must be an explicit allowlist"
|
|
|
+ assert re.findall(r"['\"]([^'\"]+)['\"]", mode_values_match.group(1)) == [
|
|
|
+ "database",
|
|
|
+ "rest-catalog",
|
|
|
+ ]
|
|
|
assert re.search(r"\btype\s*:\s*Array\b", connector_ids)
|
|
|
assert re.search(r"\brequired\s*:\s*true\b", connector_ids)
|
|
|
assert re.search(r"\btype\s*:\s*String\b", mode)
|
|
|
@@ -118,12 +127,16 @@ def test_connector_prop_validators_execute_strict_database_and_rest_contracts():
|
|
|
nonString: connectorIdsValidator(['oracle', 7]),
|
|
|
tooShort: connectorIdsValidator(['ab']),
|
|
|
uppercase: connectorIdsValidator(['Oracle']),
|
|
|
+ dot: connectorIdsValidator(['oracle.prod']),
|
|
|
+ unsafeCharacter: connectorIdsValidator(['oracle%prod']),
|
|
|
+ maxLength: connectorIdsValidator(['a' + 'b'.repeat(63)]),
|
|
|
tooLong: connectorIdsValidator(['a'.repeat(65)])
|
|
|
}},
|
|
|
modes: {{
|
|
|
database: modeValidator('database'),
|
|
|
restCatalog: modeValidator('rest-catalog'),
|
|
|
metadata: modeValidator('metadata'),
|
|
|
+ thirdMode: modeValidator('catalog-v2'),
|
|
|
empty: modeValidator(''),
|
|
|
typo: modeValidator('rest_catalog')
|
|
|
}}
|
|
|
@@ -136,12 +149,16 @@ def test_connector_prop_validators_execute_strict_database_and_rest_contracts():
|
|
|
"nonString": False,
|
|
|
"tooShort": False,
|
|
|
"uppercase": False,
|
|
|
+ "dot": False,
|
|
|
+ "unsafeCharacter": False,
|
|
|
+ "maxLength": True,
|
|
|
"tooLong": False,
|
|
|
}
|
|
|
assert results["modes"] == {
|
|
|
"database": True,
|
|
|
"restCatalog": True,
|
|
|
"metadata": False,
|
|
|
+ "thirdMode": False,
|
|
|
"empty": False,
|
|
|
"typo": False,
|
|
|
}
|
|
|
@@ -323,6 +340,7 @@ def test_operations_await_refresh_and_rest_configuration_is_mode_gated():
|
|
|
def test_database_wrapper_is_database_only_and_keeps_scope_warning():
|
|
|
source = DATABASE_PAGE.read_text(encoding="utf-8")
|
|
|
|
|
|
+ assert re.search(r"<h1\b[^>]*>\s*企业连接器\s*</h1>", source)
|
|
|
assert "rest-catalog" not in source
|
|
|
assert "当前开放范围仅限数据库访问。文件目录、对象存储、API 与消息系统等来源将在后续版本扩展开发。" in source
|
|
|
assert re.search(
|