chore: auto release commit (2026-09-15 02:56:48)
Some checks failed
技能自动化发布 / release (push) Failing after 4s
Some checks failed
技能自动化发布 / release (push) Failing after 4s
This commit is contained in:
@@ -284,6 +284,53 @@ def test_collect_platform_defaults_to_browser() -> tuple[bool, str]:
|
||||
return True, "默认浏览器模式,--headless 和 --show-browser 行为正确"
|
||||
|
||||
|
||||
def test_sync_actions_tolerate_missing_args_v1_30() -> tuple[bool, str]:
|
||||
"""v1.1.30:4 个 sync action(generate-renewal-task / dispatch-task-notice /
|
||||
mark-contract-renewed / render-html)的必填参数全部不传时,
|
||||
argparse 不应 SystemExit,而是给空字符串默认值;handler 检测到空值后返回
|
||||
JSON {error: missing_arg, hint: ...} 友好提示,**不再 argparse 错误退出**。
|
||||
|
||||
解决问题:jiangchang 客户端 arguments 丢失时调用方收到 argparse 错误而误判失败。
|
||||
"""
|
||||
from cli.app import build_parser
|
||||
|
||||
parser = build_parser()
|
||||
|
||||
# 1. 无参调用不应 argparse SystemExit(注意:之前是 required=True 会抛错)
|
||||
try:
|
||||
for cmd in (
|
||||
"generate-renewal-task",
|
||||
"dispatch-task-notice",
|
||||
"mark-contract-renewed",
|
||||
"render-html",
|
||||
):
|
||||
parser.parse_args([cmd]) # 不传任何参数
|
||||
except SystemExit as e:
|
||||
return False, f"argparse 在无参调用时 SystemExit({e.code}),应给默认值"
|
||||
|
||||
# 2. handler 检测空值应返回 JSON 提示而非抛异常
|
||||
import argparse
|
||||
from cli.app import (
|
||||
cmd_dispatch, cmd_generate_task, cmd_mark_renewed, cmd_render_html,
|
||||
)
|
||||
|
||||
empty_args = argparse.Namespace(
|
||||
contract_id="", unit_id="", month="", material_id="", task_id="",
|
||||
)
|
||||
try:
|
||||
rc1 = cmd_generate_task(empty_args)
|
||||
rc2 = cmd_dispatch(empty_args)
|
||||
rc3 = cmd_mark_renewed(empty_args)
|
||||
rc4 = cmd_render_html(empty_args)
|
||||
except Exception as e:
|
||||
return False, f"handler 应返回 JSON 提示而非抛异常: {e}"
|
||||
|
||||
for name, rc in (("generate", rc1), ("dispatch", rc2), ("mark_renewed", rc3), ("render", rc4)):
|
||||
if rc != 1:
|
||||
return False, f"{name} 空参数应返回 exit=1,实际 {rc}"
|
||||
return True, "4 个 sync action 空参数容忍 OK(exit=1 + JSON 提示)"
|
||||
|
||||
|
||||
# ---------- db.repository:v1.1.2 新增的 sandbox card 解析 ----------
|
||||
|
||||
def test_parse_sandbox_card_row_format() -> tuple[bool, str]:
|
||||
@@ -1497,18 +1544,22 @@ class _FakeLocatorRouter:
|
||||
self._selectors = selectors
|
||||
self._page = page
|
||||
|
||||
def _resolve(self, sel: str) -> _FakeLocator:
|
||||
# v1.1.32:支持「,」分隔的多 selector 联合(任一命中即返回)
|
||||
# 例:'*:has-text("DEV MODE"), *:text-is("DEV MODE")'
|
||||
for part in sel.split(","):
|
||||
part = part.strip()
|
||||
if part in self._selectors:
|
||||
return self._selectors[part]
|
||||
return _FakeLocator(count=0)
|
||||
|
||||
def __call__(self, sel: str):
|
||||
"""page.locator(sel) 形式调用。"""
|
||||
if sel in self._selectors:
|
||||
return self._selectors[sel]
|
||||
return _FakeLocator(count=0)
|
||||
return self._resolve(sel)
|
||||
|
||||
def __getattr__(self, sel: str):
|
||||
# loc.page 已存在则按 selector 路由
|
||||
if sel in self._selectors:
|
||||
return self._selectors[sel]
|
||||
# fallback:未注册的 selector 都返回空 locator
|
||||
return _FakeLocator(count=0)
|
||||
return self._resolve(sel)
|
||||
|
||||
|
||||
class _FakePlaywrightPage:
|
||||
@@ -1666,59 +1717,303 @@ def test_wait_for_login_inputs_filled_auto_click_v1_26() -> tuple[bool, str]:
|
||||
pc.HUMAN_PROMPT_INTERVAL = orig_prompt
|
||||
|
||||
|
||||
def test_fill_demo_on_spa_login_basic_v1_27() -> tuple[bool, str]:
|
||||
"""v1.1.27:`_fill_demo_on_spa_login` ——SPA 二级登录页 input 默认不预填,
|
||||
必须主动 fill demo/123456 再点登录按钮。
|
||||
def test_fill_spa_login_from_env_basic_v1_31() -> tuple[bool, str]:
|
||||
"""v1.1.31:`_fill_spa_login_from_env` ——从 .env 读 SMARTCAMPUS_LOGIN_USER /
|
||||
SMARTCAMPUS_LOGIN_PASSWORD fill 再点登录按钮(密码不硬编码到代码)。
|
||||
"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_u, orig_p = os.environ.get("SMARTCAMPUS_LOGIN_USER"), os.environ.get("SMARTCAMPUS_LOGIN_PASSWORD")
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = "hr_demo"
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = "hr_secret_xxx"
|
||||
try:
|
||||
click_log: list[str] = []
|
||||
page = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors={
|
||||
"#jc-user": _FakeLocator(count=1, value=""),
|
||||
"#jc-pass": _FakeLocator(count=1, value=""),
|
||||
"button:has-text('Sign in')": _FakeLocator(count=1, click_log=click_log),
|
||||
},
|
||||
)
|
||||
|
||||
if not pc._fill_spa_login_from_env(page):
|
||||
return False, "SPA login fill(来自 .env)应成功"
|
||||
if not click_log:
|
||||
return False, f"应点 Sign in,但 click_log={click_log}"
|
||||
return True, f"SPA 二级登录页 .env 凭证自动 fill+点 OK(click_log={click_log})"
|
||||
finally:
|
||||
if orig_u is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_USER", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = orig_u
|
||||
if orig_p is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_PASSWORD", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = orig_p
|
||||
|
||||
|
||||
def test_fill_spa_login_from_env_chinese_button_v1_31() -> tuple[bool, str]:
|
||||
"""v1.1.31:中文「登录」按钮也能 fill .env 凭证并点。"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_u, orig_p = os.environ.get("SMARTCAMPUS_LOGIN_USER"), os.environ.get("SMARTCAMPUS_LOGIN_PASSWORD")
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = "hr_demo"
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = "hr_secret_xxx"
|
||||
try:
|
||||
click_log: list[str] = []
|
||||
page = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors={
|
||||
"input[type='tel']": _FakeLocator(count=1, value=""),
|
||||
"input[type='password']": _FakeLocator(count=1, value=""),
|
||||
"button:has-text('登录')": _FakeLocator(count=1, click_log=click_log),
|
||||
},
|
||||
)
|
||||
if not pc._fill_spa_login_from_env(page):
|
||||
return False, "SPA login 中文按钮 fill 应成功"
|
||||
if not click_log:
|
||||
return False, f"应点 登录,但 click_log={click_log}"
|
||||
return True, f"SPA 二级登录页中文「登录」按钮 OK(click_log={click_log})"
|
||||
finally:
|
||||
if orig_u is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_USER", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = orig_u
|
||||
if orig_p is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_PASSWORD", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = orig_p
|
||||
|
||||
|
||||
def test_fill_spa_login_from_env_no_credentials_returns_false_v1_31() -> tuple[bool, str]:
|
||||
"""v1.1.31:.env 未配置 SMARTCAMPUS_LOGIN_USER / PASSWORD → 返回 False,不自动 fill。
|
||||
按用户要求「密码不能直接放到代码」,无 .env 凭证时等用户手工输入。
|
||||
|
||||
v1.1.32 修复:清空进程 env 同时清空 _ENV_CACHE(_get_env 会从 .env 文件 fallback)。
|
||||
"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_u = os.environ.pop("SMARTCAMPUS_LOGIN_USER", None)
|
||||
orig_p = os.environ.pop("SMARTCAMPUS_LOGIN_PASSWORD", None)
|
||||
# v1.1.32:清空 .env 缓存 + 临时把 .env 路径指向不存在的文件
|
||||
orig_cache = pc._ENV_CACHE.copy()
|
||||
orig_cache_loaded = pc._ENV_CACHE_LOADED
|
||||
orig_get_env_path = pc.get_env_path if hasattr(pc, "get_env_path") else None
|
||||
from pathlib import Path
|
||||
pc._ENV_CACHE = {}
|
||||
pc._ENV_CACHE_LOADED = True
|
||||
pc.get_env_path = lambda: Path("Z:/nonexistent-venv-test/.env") # type: ignore[assignment]
|
||||
try:
|
||||
click_log: list[str] = []
|
||||
page = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors={
|
||||
"#jc-user": _FakeLocator(count=1, value=""),
|
||||
"#jc-pass": _FakeLocator(count=1, value=""),
|
||||
"button:has-text('Sign in')": _FakeLocator(count=1, click_log=click_log),
|
||||
},
|
||||
)
|
||||
if pc._fill_spa_login_from_env(page):
|
||||
return False, "无 .env 凭证时不应自动 fill"
|
||||
if click_log:
|
||||
return False, f"无 .env 凭证时不应点登录按钮,但 click_log={click_log}"
|
||||
return True, "无 .env 凭证返回 False 不点登录 OK"
|
||||
finally:
|
||||
if orig_u is not None:
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = orig_u
|
||||
if orig_p is not None:
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = orig_p
|
||||
pc._ENV_CACHE = orig_cache
|
||||
pc._ENV_CACHE_LOADED = orig_cache_loaded
|
||||
if orig_get_env_path is not None:
|
||||
pc.get_env_path = orig_get_env_path # type: ignore[assignment]
|
||||
|
||||
|
||||
def test_fill_spa_login_from_env_no_input_returns_false_v1_31() -> tuple[bool, str]:
|
||||
"""v1.1.31:找不到 user input(页面不是 login 页)→ 返回 False。"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_u, orig_p = os.environ.get("SMARTCAMPUS_LOGIN_USER"), os.environ.get("SMARTCAMPUS_LOGIN_PASSWORD")
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = "hr_demo"
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = "hr_secret_xxx"
|
||||
try:
|
||||
page = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/app/home",
|
||||
selectors={},
|
||||
)
|
||||
if pc._fill_spa_login_from_env(page):
|
||||
return False, "无 login input 应返回 False"
|
||||
return True, "无 login input 返回 False OK"
|
||||
finally:
|
||||
if orig_u is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_USER", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = orig_u
|
||||
if orig_p is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_PASSWORD", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = orig_p
|
||||
|
||||
|
||||
# ---------- v1.1.32: DEV MODE 面板对应行业 Sign in 点击 ----------
|
||||
|
||||
|
||||
class _CountingLocator(_FakeLocator):
|
||||
"""v1.1.32:扩展 _FakeLocator,支持 nth() 返回子 locator。"""
|
||||
|
||||
def __init__(self, *args, parent_count: int = 0, **kwargs) -> None:
|
||||
super().__init__(*args, **kwargs)
|
||||
self._parent_count = parent_count
|
||||
|
||||
def nth(self, n: int) -> "_FakeLocator":
|
||||
return _FakeLocator(
|
||||
count=1 if n < self._parent_count else 0,
|
||||
value=self._value,
|
||||
click_log=self._click_log,
|
||||
)
|
||||
|
||||
|
||||
def _make_dev_mode_page(
|
||||
sign_in_count: int = 4,
|
||||
with_dev_marker: bool = True,
|
||||
main_form_filled: bool = True,
|
||||
) -> _FakePlaywrightPage:
|
||||
"""v1.1.32:构造 DEV MODE 面板的 fake page。
|
||||
|
||||
Args:
|
||||
sign_in_count: Sign in 按钮总数(教师通用=1 + N 个行业 tile)
|
||||
with_dev_marker: 是否包含 DEV MODE 标志
|
||||
main_form_filled: 主表单是否已预填 demo(左侧教师登录表单)
|
||||
"""
|
||||
selectors: dict[str, _FakeLocator] = {}
|
||||
if with_dev_marker:
|
||||
# DEV MODE 面板标志:模拟一个含 'DEV MODE' 文本的元素
|
||||
selectors["*:has-text('DEV MODE')"] = _FakeLocator(count=1)
|
||||
# Sign in 按钮(DEV MODE 面板里每个 tile 一个 + 主表单的 Sign in = sign_in_count + 1)
|
||||
click_log: list[str] = []
|
||||
page = _FakePlaywrightPage(
|
||||
selectors["button:has-text('Sign in')"] = _CountingLocator(
|
||||
count=sign_in_count, parent_count=sign_in_count, click_log=click_log,
|
||||
)
|
||||
# 主表单
|
||||
user_val = "demo" if main_form_filled else ""
|
||||
selectors["#jc-user"] = _FakeLocator(count=1, value=user_val)
|
||||
selectors["#jc-pass"] = _FakeLocator(count=1, value="123456" if main_form_filled else "")
|
||||
return _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors=selectors,
|
||||
)
|
||||
|
||||
|
||||
def test_dev_mode_panel_open_detection_v1_32() -> tuple[bool, str]:
|
||||
"""v1.1.32:DEV MODE 面板展开(≥2 Sign in + DEV MODE 标志)→ _is_dev_mode_panel_open 返回 True。"""
|
||||
from service import platform_collector as pc
|
||||
|
||||
page = _make_dev_mode_page(sign_in_count=4, with_dev_marker=True)
|
||||
if not pc._is_dev_mode_panel_open(page):
|
||||
return False, "DEV MODE 面板展开但 _is_dev_mode_panel_open 返回 False"
|
||||
return True, "DEV MODE 面板检测 OK"
|
||||
|
||||
|
||||
def test_dev_mode_panel_closed_detection_v1_32() -> tuple[bool, str]:
|
||||
"""v1.1.32:DEV MODE 面板未展开(<2 Sign in 或无 DEV MODE 标志)→ 返回 False。"""
|
||||
from service import platform_collector as pc
|
||||
|
||||
# 场景 A:只有 1 个 Sign in 按钮(主表单),无 DEV MODE 标志
|
||||
page_a = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors={
|
||||
"#jc-user": _FakeLocator(count=1, value=""), # 空 → 要 fill
|
||||
"#jc-pass": _FakeLocator(count=1, value=""),
|
||||
"button:has-text('Sign in')": _FakeLocator(count=1, click_log=click_log),
|
||||
"button:has-text('Sign in')": _FakeLocator(count=1),
|
||||
"#jc-user": _FakeLocator(count=1, value="demo"),
|
||||
"#jc-pass": _FakeLocator(count=1, value="123456"),
|
||||
},
|
||||
)
|
||||
from service.platform_collector import _fill_demo_on_spa_login
|
||||
if pc._is_dev_mode_panel_open(page_a):
|
||||
return False, "1 个 Sign in 不应判定为 DEV MODE 展开"
|
||||
|
||||
if not _fill_demo_on_spa_login(page):
|
||||
return False, "SPA login fill demo 应成功"
|
||||
if not click_log:
|
||||
return False, f"应点 Sign in,但 click_log={click_log}"
|
||||
return True, f"SPA 二级登录页 demo/123456 自动 fill+点 OK(click_log={click_log})"
|
||||
|
||||
|
||||
def test_fill_demo_on_spa_login_chinese_button_v1_27() -> tuple[bool, str]:
|
||||
"""v1.1.27:中文「登录」按钮(用户截图版本)也能 fill demo/123456 并点。"""
|
||||
click_log: list[str] = []
|
||||
page = _FakePlaywrightPage(
|
||||
# 场景 B:≥2 Sign in 但无 DEV MODE 标志
|
||||
page_b = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/login",
|
||||
selectors={
|
||||
"input[type='tel']": _FakeLocator(count=1, value=""),
|
||||
"input[type='password']": _FakeLocator(count=1, value=""),
|
||||
"button:has-text('登录')": _FakeLocator(count=1, click_log=click_log),
|
||||
"button:has-text('Sign in')": _FakeLocator(count=3),
|
||||
},
|
||||
)
|
||||
from service.platform_collector import _fill_demo_on_spa_login
|
||||
if pc._is_dev_mode_panel_open(page_b):
|
||||
return False, "无 DEV MODE 标志不应判定为 DEV MODE 展开"
|
||||
|
||||
if not _fill_demo_on_spa_login(page):
|
||||
return False, "SPA login 中文按钮 fill demo 应成功"
|
||||
if not click_log:
|
||||
return False, f"应点 登录,但 click_log={click_log}"
|
||||
return True, f"SPA 二级登录页中文「登录」按钮 OK(click_log={click_log})"
|
||||
return True, "DEV MODE 面板关闭检测 OK"
|
||||
|
||||
|
||||
def test_fill_demo_on_spa_login_no_input_returns_false_v1_27() -> tuple[bool, str]:
|
||||
"""v1.1.27:找不到 user input(页面不是 login 页)→ 返回 False。"""
|
||||
page = _FakePlaywrightPage(
|
||||
url="https://sandbox.jc2009.com/industries/campus/smartcampus/app/home",
|
||||
selectors={},
|
||||
)
|
||||
from service.platform_collector import _fill_demo_on_spa_login
|
||||
def test_click_dev_mode_sign_in_for_industry_v1_32() -> tuple[bool, str]:
|
||||
"""v1.1.32:点击 DEV MODE 面板对应行业 tile 的 Sign in。
|
||||
|
||||
if _fill_demo_on_spa_login(page):
|
||||
return False, "无 login input 应返回 False"
|
||||
return True, "无 login input 返回 False OK"
|
||||
无 SMARTCAMPUS_LOGIN_INDUSTRY env 时默认 hr → 点第 2 个 Sign in(人事处 tile)。
|
||||
"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_industry = os.environ.pop("SMARTCAMPUS_LOGIN_INDUSTRY", None)
|
||||
try:
|
||||
page = _make_dev_mode_page(sign_in_count=4)
|
||||
# _click_dev_mode_sign_in_for_industry 不依赖 _is_dev_mode_panel_open
|
||||
# 这里直接测点击逻辑
|
||||
if not pc._click_dev_mode_sign_in_for_industry(page, "hr"):
|
||||
return False, "点 hr tile Sign in 应成功"
|
||||
# 验证 click 落在 Sign in 按钮上(点击会让 click_log 多 1 条)
|
||||
all_sign_in = page._selectors["button:has-text('Sign in')"]
|
||||
if len(all_sign_in._click_log) < 1:
|
||||
return False, f"应点击 Sign in,但 click_log={all_sign_in._click_log}"
|
||||
return True, f"DEV MODE hr tile Sign in 点击 OK(click_log={all_sign_in._click_log})"
|
||||
finally:
|
||||
if orig_industry is not None:
|
||||
os.environ["SMARTCAMPUS_LOGIN_INDUSTRY"] = orig_industry
|
||||
|
||||
|
||||
def test_fill_spa_login_from_env_clicks_dev_mode_sign_in_first_v1_32() -> tuple[bool, str]:
|
||||
"""v1.1.32:DEV MODE 面板展开时,_fill_spa_login_from_env 应先点对应行业 Sign in
|
||||
再走原 fill + 点主表单 Sign in 流程(让对应行业 demo 凭据填到主表单)。
|
||||
"""
|
||||
import os
|
||||
from service import platform_collector as pc
|
||||
|
||||
orig_u = os.environ.get("SMARTCAMPUS_LOGIN_USER")
|
||||
orig_p = os.environ.get("SMARTCAMPUS_LOGIN_PASSWORD")
|
||||
orig_industry = os.environ.get("SMARTCAMPUS_LOGIN_INDUSTRY")
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = "hr_demo"
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = "hr_secret_xxx"
|
||||
os.environ["SMARTCAMPUS_LOGIN_INDUSTRY"] = "finance"
|
||||
try:
|
||||
# 主表单 input 留空(DEV MODE 面板存在时,主表单可能没填)
|
||||
page = _make_dev_mode_page(sign_in_count=4, main_form_filled=False)
|
||||
if not pc._fill_spa_login_from_env(page):
|
||||
return False, "_fill_spa_login_from_env 应成功(DEV MODE + .env)"
|
||||
all_sign_in = page._selectors["button:has-text('Sign in')"]
|
||||
# 期望点击次数 ≥ 2:1 次 DEV MODE finance tile + 1 次主表单 Sign in
|
||||
if len(all_sign_in._click_log) < 2:
|
||||
return False, (
|
||||
f"应先点 DEV MODE 行业 Sign in 再点主表单 Sign in,"
|
||||
f"但 click_log={all_sign_in._click_log}(期望 ≥2 次)"
|
||||
)
|
||||
return True, (
|
||||
f"SPA 登录页 DEV MODE + .env fill 流程 OK(click_log={all_sign_in._click_log})"
|
||||
)
|
||||
finally:
|
||||
if orig_u is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_USER", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_USER"] = orig_u
|
||||
if orig_p is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_PASSWORD", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_PASSWORD"] = orig_p
|
||||
if orig_industry is None:
|
||||
os.environ.pop("SMARTCAMPUS_LOGIN_INDUSTRY", None)
|
||||
else:
|
||||
os.environ["SMARTCAMPUS_LOGIN_INDUSTRY"] = orig_industry
|
||||
|
||||
|
||||
# ---------- v1.1.18: show-config / logs-list ----------
|
||||
@@ -1951,6 +2246,7 @@ def main() -> int:
|
||||
_run("constants/skill_md_slug_alignment", test_skill_md_slug_alignment)
|
||||
_run("assets/data_management_actions", test_data_management_actions)
|
||||
_run("cli/collect_platform_browser_default", test_collect_platform_defaults_to_browser)
|
||||
_run("cli/sync_actions_tolerate_missing_args_v1_30", test_sync_actions_tolerate_missing_args_v1_30)
|
||||
_run("db/parse_sandbox_card_row", test_parse_sandbox_card_row_format)
|
||||
_run("db/parse_sandbox_card_narrative", test_parse_sandbox_card_narrative_format)
|
||||
_run("db/parse_sandbox_card_empty_invalid", test_parse_sandbox_card_empty_and_invalid)
|
||||
@@ -2000,9 +2296,14 @@ def main() -> int:
|
||||
_run("login_flow/auto_sign_in_no_input_returns_false", test_try_auto_sign_in_no_input_returns_false)
|
||||
_run("login_flow/auto_sign_in_selector_timeout_returns_false", test_try_auto_sign_in_selector_timeout_returns_false)
|
||||
_run("login_flow/wait_login_inputs_filled_auto_click_v1_26", test_wait_for_login_inputs_filled_auto_click_v1_26)
|
||||
_run("login_flow/fill_demo_on_spa_login_basic_v1_27", test_fill_demo_on_spa_login_basic_v1_27)
|
||||
_run("login_flow/fill_demo_on_spa_login_chinese_button_v1_27", test_fill_demo_on_spa_login_chinese_button_v1_27)
|
||||
_run("login_flow/fill_demo_on_spa_login_no_input_returns_false_v1_27", test_fill_demo_on_spa_login_no_input_returns_false_v1_27)
|
||||
_run("login_flow/fill_spa_login_from_env_basic_v1_31", test_fill_spa_login_from_env_basic_v1_31)
|
||||
_run("login_flow/fill_spa_login_from_env_chinese_button_v1_31", test_fill_spa_login_from_env_chinese_button_v1_31)
|
||||
_run("login_flow/fill_spa_login_from_env_no_credentials_returns_false_v1_31", test_fill_spa_login_from_env_no_credentials_returns_false_v1_31)
|
||||
_run("login_flow/fill_spa_login_from_env_no_input_returns_false_v1_31", test_fill_spa_login_from_env_no_input_returns_false_v1_31)
|
||||
_run("login_flow/dev_mode_panel_open_detection_v1_32", test_dev_mode_panel_open_detection_v1_32)
|
||||
_run("login_flow/dev_mode_panel_closed_detection_v1_32", test_dev_mode_panel_closed_detection_v1_32)
|
||||
_run("login_flow/click_dev_mode_sign_in_for_industry_v1_32", test_click_dev_mode_sign_in_for_industry_v1_32)
|
||||
_run("login_flow/fill_spa_login_from_env_clicks_dev_mode_sign_in_first_v1_32", test_fill_spa_login_from_env_clicks_dev_mode_sign_in_first_v1_32)
|
||||
_run("show_config/masks_tokens", test_show_config_masks_tokens)
|
||||
_run("show_config/skips_empty", test_show_config_skips_empty)
|
||||
_run("show_config/skips_comments", test_show_config_skips_comments)
|
||||
|
||||
Reference in New Issue
Block a user