@hyzyn/dsh-docker 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/scripts/smoke.mjs CHANGED
@@ -92,13 +92,49 @@ test('parsePsJson:字段映射 / compose 标签 / 端口', () => {
92
92
  assert.equal(web.health, 'healthy')
93
93
  assert.equal(web.composeProject, 'shop')
94
94
  assert.equal(web.composeService, 'web')
95
+ // 双栈(0.0.0.0 + [::])是同一次 -p 的两种展开,只留首条(D130)——此前这条断言
96
+ // 把「同一个端口出现两遍」当成期望值钉住了,所以线上一直没人发现(docker_ps 的
97
+ // 渲染又会丢掉 hostIp,看起来就是纯粹的重复)
95
98
  assert.deepEqual(web.ports, [
96
99
  { hostIp: '0.0.0.0', hostPort: 8080, containerPort: 80, protocol: 'tcp' },
97
- { hostIp: '[::]', hostPort: 8080, containerPort: 80, protocol: 'tcp' },
98
100
  ])
99
101
  assert.equal(cache.state, 'exited')
100
102
  assert.equal(cache.composeProject, null)
101
103
  assert.deepEqual(cache.ports, [{ containerPort: 6379, protocol: 'tcp' }])
104
+ // 网络:ps 的 .Networks 是逗号分隔串(D131)——host 网络容器靠它才能说清「端口为什么空」
105
+ assert.deepEqual(web.networks, ['shop_default'])
106
+ assert.deepEqual(cache.networks, [])
107
+ })
108
+
109
+ test('suggestContainerNames:inspect 未命中的候选(D132)', () => {
110
+ const names = ['607023340cbb_rmqnamesrv', 'rmqbroker', 'redis', 'rocketmq-dashboard']
111
+ // 前缀优先于包含;compose 前缀过的真名排在前面
112
+ assert.deepEqual(docker.suggestContainerNames('rmqnamesrv', names), ['607023340cbb_rmqnamesrv'])
113
+ assert.deepEqual(docker.suggestContainerNames('rmq', names), ['rmqbroker', '607023340cbb_rmqnamesrv'])
114
+ // 完全无关 / 空输入 → 不给提示
115
+ assert.deepEqual(docker.suggestContainerNames('nope', names), [])
116
+ assert.deepEqual(docker.suggestContainerNames(' ', names), [])
117
+ // 最多 3 个
118
+ assert.equal(docker.suggestContainerNames('a', ['a1', 'a2', 'a3', 'a4']).length, 3)
119
+ })
120
+
121
+ test('parsePsJson:host 网络容器无端口但有网络(D131)', () => {
122
+ const rows = docker.parsePsJson(JSON.stringify({
123
+ ID: 'host1234567890abcdef',
124
+ Image: 'rmq:1',
125
+ Names: 'rocketmq-dashboard',
126
+ Networks: 'host',
127
+ Ports: '',
128
+ State: 'running',
129
+ Status: 'Up 2 days',
130
+ }))
131
+ assert.deepEqual(rows[0].ports, [])
132
+ assert.deepEqual(rows[0].networks, ['host'])
133
+ })
134
+
135
+ test('parsePsJson:多网络(逗号分隔 + 空格)', () => {
136
+ const rows = docker.parsePsJson(JSON.stringify({ ID: 'x', Names: 'a', Networks: 'net-a, net-b', State: 'running', Status: 'Up 1 minute' }))
137
+ assert.deepEqual(rows[0].networks, ['net-a', 'net-b'])
102
138
  })
103
139
 
104
140
  test('parsePsJson:State 缺失时从 Status 推导(老版本 docker)', () => {
@@ -122,6 +158,28 @@ test('parsePorts:多段映射与去重', () => {
122
158
  ])
123
159
  })
124
160
 
161
+ test('parsePorts:双栈(IPv4/IPv6 通配)是同一次发布,只留一条(D130)', () => {
162
+ // 现场实测(redis / nacos / higress-ai):ps 的 .Ports 里 0.0.0.0 与 [::] 各一份,
163
+ // 渲染丢掉 hostIp 后看起来像「同一个端口发布了两遍」
164
+ assert.deepEqual(docker.parsePorts('0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp'), [
165
+ { hostIp: '0.0.0.0', hostPort: 6379, containerPort: 6379, protocol: 'tcp' },
166
+ ])
167
+ // 无括号的 IPv6 通配(docker 某些版本/驱动输出)同样归一
168
+ assert.deepEqual(docker.parsePorts(':::8848->8848/tcp, [::]:8848->8848/tcp'), [
169
+ { hostIp: '::', hostPort: 8848, containerPort: 8848, protocol: 'tcp' },
170
+ ])
171
+ // 真实的两种绑定(回环 + 通配)必须继续算两条:只归一化通配符那一族
172
+ assert.deepEqual(docker.parsePorts('127.0.0.1:8080->80/tcp, 0.0.0.0:8080->80/tcp'), [
173
+ { hostIp: '127.0.0.1', hostPort: 8080, containerPort: 80, protocol: 'tcp' },
174
+ { hostIp: '0.0.0.0', hostPort: 8080, containerPort: 80, protocol: 'tcp' },
175
+ ])
176
+ // 「仅暴露未发布」的容器端口不是重复,别被一起吃掉
177
+ assert.deepEqual(docker.parsePorts('80/tcp, 84->84/tcp, 84->84/tcp'), [
178
+ { containerPort: 80, protocol: 'tcp' },
179
+ { hostPort: 84, containerPort: 84, protocol: 'tcp' },
180
+ ])
181
+ })
182
+
125
183
  await test('凭据解析:官方凭据服务优先,缺失/未命中再退回环境变量', async () => {
126
184
  const { resolveSecretVia } = exec
127
185
  assert.equal(typeof resolveSecretVia, 'function', '缺少 resolveSecretVia(纯核心)')