Skip to content

Commit e812422

Browse files
committed
cli test
1 parent 16e5a00 commit e812422

3 files changed

Lines changed: 139 additions & 1 deletion

File tree

src/jmcomic/cl.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,15 @@ def _truncate_list(items, limit=10):
175175
return ', '.join(items[:limit]) + f' ...等{len(items)}个'
176176

177177
def print_album_detail(self, album):
178+
from jmcomic import JmcomicText
179+
178180
sep = '─' * 50
179181

180182
print(f'\n{sep}')
181183
print(f' 📖 标题: {album.name}')
182184
print(f' 🆔 ID: JM{album.album_id}')
183-
print(f' 🔗 链接: https://18comic.vip/album/{album.album_id}/')
185+
print(f' 🔗 链接: {JmcomicText.format_album_url(album.album_id)}')
186+
print(f' 🎨 封面: {JmcomicText.get_album_cover_url(album.album_id)}')
184187
print(f' ✍️ 作者: {self._truncate_list(album.authors) if album.authors else "未知"}')
185188
print(sep)
186189

src/jmcomic/jm_toolkit.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ def compare_versions(cls, v1: str, v2: str) -> int:
431431
else:
432432
return 0 # 相等
433433

434+
434435
# 支持dsl: #{???} -> os.getenv(???)
435436
JmcomicText.dsl_replacer.add_dsl_and_replacer(r'\$\{(.*?)\}', JmcomicText.match_os_env)
436437

tests/test_jmcomic/test_jm_cli.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
from test_jmcomic import *
2+
from io import StringIO
3+
from unittest.mock import patch
4+
5+
from jmcomic.cl import JmcomicUI, JmViewUI
6+
7+
8+
class Test_Cli(JmTestConfigurable):
9+
"""测试 CLI 命令 (jmcomic + jmv)"""
10+
11+
album_id = '350234'
12+
13+
# ========== jmcomic 命令测试 ==========
14+
15+
def test_jmcomic_parse_album_id(self):
16+
"""jmcomic 解析 album id"""
17+
ui = JmcomicUI()
18+
ui.raw_id_list = [self.album_id]
19+
ui.parse_raw_id()
20+
self.assertEqual(ui.album_id_list, [self.album_id])
21+
22+
def test_jmcomic_parse_photo_id(self):
23+
"""jmcomic 解析 photo id (p前缀)"""
24+
ui = JmcomicUI()
25+
ui.raw_id_list = [f'p{self.album_id}']
26+
ui.parse_raw_id()
27+
self.assertEqual(ui.photo_id_list, [self.album_id])
28+
29+
def test_jmcomic_parse_mixed(self):
30+
"""jmcomic 同时解析 album 和 photo"""
31+
ui = JmcomicUI()
32+
ui.raw_id_list = [self.album_id, f'p{self.album_id}']
33+
ui.parse_raw_id()
34+
self.assertEqual(ui.album_id_list, [self.album_id])
35+
self.assertEqual(ui.photo_id_list, [self.album_id])
36+
37+
def test_jmcomic_download_album(self):
38+
"""jmcomic 真实下载 album 350234"""
39+
JustDownloadSpecificCountImage.count = 5
40+
album, dler = download_album(self.album_id, self.option, downloader=JustDownloadSpecificCountImage)
41+
self.assertEqual(album.album_id, self.album_id)
42+
self.assertTrue(len(album.name) > 0, '标题不应为空')
43+
44+
# ========== jmv 命令测试 ==========
45+
46+
# -- extract_album_id --
47+
48+
def test_jmv_extract_pure_digits(self):
49+
"""jmv 纯数字文本"""
50+
ui = JmViewUI()
51+
ui.raw_text = '350234'
52+
self.assertEqual(ui.extract_album_id(), '350234')
53+
54+
def test_jmv_extract_digits_scattered(self):
55+
"""jmv 数字散布在文本中,应拼接所有数字"""
56+
ui = JmViewUI()
57+
ui.raw_text = '350谁还没看过234'
58+
self.assertEqual(ui.extract_album_id(), '350234')
59+
60+
def test_jmv_extract_jm_prefix(self):
61+
"""jmv JM前缀的车号"""
62+
ui = JmViewUI()
63+
ui.raw_text = 'JM350234'
64+
self.assertEqual(ui.extract_album_id(), '350234')
65+
66+
def test_jmv_extract_no_digits_exits(self):
67+
"""jmv 没有数字时应 exit(1)"""
68+
ui = JmViewUI()
69+
ui.raw_text = 'abcdef'
70+
with self.assertRaises(SystemExit) as ctx:
71+
ui.extract_album_id()
72+
self.assertEqual(ctx.exception.code, 1)
73+
74+
# -- _truncate_list --
75+
76+
def test_jmv_truncate_list_under_limit(self):
77+
"""不超过限制时完整显示"""
78+
items = ['a', 'b', 'c']
79+
result = JmViewUI._truncate_list(items, limit=10)
80+
self.assertEqual(result, 'a, b, c')
81+
82+
def test_jmv_truncate_list_at_limit(self):
83+
"""刚好等于限制时完整显示"""
84+
items = [str(i) for i in range(10)]
85+
result = JmViewUI._truncate_list(items, limit=10)
86+
self.assertNotIn('...', result)
87+
88+
def test_jmv_truncate_list_over_limit(self):
89+
"""超过限制时截断并显示总数"""
90+
items = [str(i) for i in range(20)]
91+
result = JmViewUI._truncate_list(items, limit=10)
92+
self.assertIn('...等20个', result)
93+
94+
# -- 真实网络请求 --
95+
96+
def test_jmv_get_album_detail_real(self):
97+
"""jmv 真实请求 album 350234 的详情"""
98+
album = self.client.get_album_detail(self.album_id)
99+
100+
self.assertEqual(album.album_id, self.album_id)
101+
self.assertTrue(len(album.name) > 0, '标题不应为空')
102+
self.assertTrue(len(album.episode_list) > 0, '章节列表不应为空')
103+
104+
def test_jmv_print_album_detail_real(self):
105+
"""jmv 真实请求并打印 album 350234 的详情,校验输出内容"""
106+
album = self.client.get_album_detail(self.album_id)
107+
ui = JmViewUI()
108+
109+
with patch('sys.stdout', new_callable=StringIO) as mock_out:
110+
ui.print_album_detail(album)
111+
output = mock_out.getvalue()
112+
113+
# 校验基本信息
114+
self.assertIn(f'JM{self.album_id}', output)
115+
self.assertIn(album.name, output)
116+
self.assertIn(JmcomicText.format_album_url(album.album_id), output)
117+
118+
# 校验章节
119+
self.assertIn(f'章节 ({len(album.episode_list)})', output)
120+
121+
def test_jmv_print_truncates_real(self):
122+
"""jmv 真实请求 album 350234,验证超长列表被截断"""
123+
album = self.client.get_album_detail(self.album_id)
124+
ui = JmViewUI()
125+
126+
with patch('sys.stdout', new_callable=StringIO) as mock_out:
127+
ui.print_album_detail(album)
128+
output = mock_out.getvalue()
129+
130+
# 350234 的作者/标签数量非常多,应触发截断
131+
if len(album.authors) > 10:
132+
self.assertIn(f'...等{len(album.authors)}个', output)
133+
if len(album.tags) > 10:
134+
self.assertIn(f'...等{len(album.tags)}个', output)

0 commit comments

Comments
 (0)