@thermal-label/brother-ql-node 0.6.0 → 0.6.2

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/README.md CHANGED
@@ -75,7 +75,7 @@ await printer.close();
75
75
 
76
76
  <!-- HARDWARE_TABLE:START -->
77
77
 
78
- **24 devices** — 1 verified · 0 partial · 17 expected · 0 unsupported · 6 unverified
78
+ **24 devices** — 3 verified · 0 partial · 15 expected · 0 unsupported · 6 unverified
79
79
 
80
80
  | Model | Key | USB PID | Transports | Status |
81
81
  | ---------------------------------------------------------------------------- | ------------ | ------- | ---------------- | ------------- |
@@ -92,10 +92,10 @@ await printer.close();
92
92
  | [QL-580N](https://thermal-label.github.io/hardware/brother-ql/ql-580n) | `QL_580N` | 0x201b | USB, TCP | 🔄 expected |
93
93
  | [QL-600](https://thermal-label.github.io/hardware/brother-ql/ql-600) | `QL_600` | 0x2100 | USB | 🔄 expected |
94
94
  | [QL-650TD](https://thermal-label.github.io/hardware/brother-ql/ql-650td) | `QL_650TD` | 0x201c | USB | 🔄 expected |
95
- | [QL-700](https://thermal-label.github.io/hardware/brother-ql/ql-700) | `QL_700` | 0x2042 | USB | 🔄 expected |
95
+ | [QL-700](https://thermal-label.github.io/hardware/brother-ql/ql-700) | `QL_700` | 0x2042 | USB | verified |
96
96
  | [QL-710W](https://thermal-label.github.io/hardware/brother-ql/ql-710w) | `QL_710W` | 0x2044 | USB, TCP | 🔄 expected |
97
97
  | [QL-720NW](https://thermal-label.github.io/hardware/brother-ql/ql-720nw) | `QL_720NW` | 0x2045 | USB, TCP | 🔄 expected |
98
- | [QL-800](https://thermal-label.github.io/hardware/brother-ql/ql-800) | `QL_800` | 0x209b | USB | 🔄 expected |
98
+ | [QL-800](https://thermal-label.github.io/hardware/brother-ql/ql-800) | `QL_800` | 0x209b | USB | verified |
99
99
  | [QL-810W](https://thermal-label.github.io/hardware/brother-ql/ql-810w) | `QL_810W` | 0x209c | USB, TCP | 🔄 expected |
100
100
  | [QL-820NWBc](https://thermal-label.github.io/hardware/brother-ql/ql-820nwbc) | `QL_820NWBc` | 0x209d | USB, TCP, BT SPP | ✅ verified |
101
101
  | [QL-1050](https://thermal-label.github.io/hardware/brother-ql/ql-1050) | `QL_1050` | 0x2027 | USB | 🔄 expected |
@@ -1,19 +1,30 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- const { usbOpen, tcpConnect, serialOpen } = vi.hoisted(() => ({
2
+ import { DEVICES, MEDIA, getUsbIds } from '@thermal-label/brother-ql-core';
3
+ import { DeviceIdentificationRequiredError, DeviceNotFoundError, TransportTimeoutError, } from '@thermal-label/contracts';
4
+ const { usbOpen, tcpConnect, serialOpen, enumerate, enumerateNetwork, identify, snmpGet } = vi.hoisted(() => ({
3
5
  usbOpen: vi.fn(),
4
6
  tcpConnect: vi.fn(),
5
7
  serialOpen: vi.fn(),
8
+ enumerate: vi.fn(),
9
+ enumerateNetwork: vi.fn(),
10
+ identify: vi.fn(),
11
+ snmpGet: vi.fn(),
6
12
  }));
7
- vi.mock('@thermal-label/transport/node', () => ({
8
- UsbTransport: { open: usbOpen },
9
- TcpTransport: { connect: tcpConnect },
10
- SerialTransport: { open: serialOpen },
11
- }));
12
- vi.mock('usb', () => ({
13
- getDeviceList: vi.fn(() => []),
14
- }));
15
- import * as usb from 'usb';
16
- import { discovery } from '../discovery.js';
13
+ vi.mock('@thermal-label/transport/node', async (importOriginal) => {
14
+ const actual = await importOriginal();
15
+ return {
16
+ PRINTER_MIB: actual.PRINTER_MIB,
17
+ UsbTransport: { open: usbOpen },
18
+ TcpTransport: { connect: tcpConnect },
19
+ SerialTransport: { open: serialOpen },
20
+ enumerateUsbDevices: enumerate,
21
+ enumerateNetworkDevices: enumerateNetwork,
22
+ identifyNetworkDevice: identify,
23
+ snmpGet,
24
+ };
25
+ });
26
+ import { PRINTER_MIB } from '@thermal-label/transport/node';
27
+ import { BrotherQLDiscovery, discovery } from '../discovery.js';
17
28
  function fakeTransport() {
18
29
  return {
19
30
  connected: true,
@@ -22,129 +33,351 @@ function fakeTransport() {
22
33
  close: vi.fn(),
23
34
  };
24
35
  }
25
- function makeUsbDevice(idVendor, idProduct, serialNumber) {
36
+ /**
37
+ * Build an `EnumeratedUsbDevice` (the shape the transport helper returns)
38
+ * for the device whose USB ids are `vid`/`pid`. Returns `undefined` when the
39
+ * vid/pid is not in the registry — modelling the helper silently dropping
40
+ * unknown devices, including a same-VID Editor-Lite mass-storage PID.
41
+ */
42
+ function enumerated(vid, pid, serialNumber) {
43
+ const descriptor = Object.values(DEVICES).find(d => {
44
+ const ids = getUsbIds(d);
45
+ return ids?.vid === vid && ids.pid === pid;
46
+ });
47
+ if (!descriptor)
48
+ return undefined;
26
49
  return {
27
- deviceDescriptor: {
28
- idVendor,
29
- idProduct,
30
- iSerialNumber: serialNumber ? 3 : 0,
31
- },
32
- busNumber: 1,
33
- deviceAddress: 2,
34
- open: vi.fn(),
35
- close: vi.fn(),
36
- getStringDescriptor: vi.fn((_idx, cb) => {
37
- cb(null, serialNumber);
38
- }),
50
+ descriptor,
51
+ ...(serialNumber === undefined ? {} : { serialNumber }),
52
+ connectionId: '1:2',
53
+ };
54
+ }
55
+ /** The bench QL-820NWBc as `enumerateNetworkDevices` / `identifyNetworkDevice` report it. */
56
+ function networked(host = '192.168.1.67', serialNumber = 'M5G679125') {
57
+ return {
58
+ descriptor: DEVICES.QL_820NWBc,
59
+ host,
60
+ port: 9100,
61
+ ...(serialNumber === null ? {} : { serialNumber }),
62
+ modelName: 'Brother QL-820NWB',
63
+ connectionId: `${host}:9100`,
39
64
  };
40
65
  }
41
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {
42
- /* suppress */
43
- });
44
66
  beforeEach(() => {
45
67
  usbOpen.mockReset();
46
68
  tcpConnect.mockReset();
47
69
  serialOpen.mockReset();
48
- warnSpy.mockClear();
49
- vi.mocked(usb.getDeviceList).mockReset().mockReturnValue([]);
70
+ enumerate.mockReset().mockResolvedValue([]);
71
+ enumerateNetwork.mockReset().mockResolvedValue([]);
72
+ identify.mockReset();
73
+ snmpGet.mockReset().mockResolvedValue({});
50
74
  });
51
75
  describe('BrotherQLDiscovery', () => {
52
76
  it('exposes the brother-ql family', () => {
53
77
  expect(discovery.family).toBe('brother-ql');
54
78
  });
79
+ it('exposes the media catalog', () => {
80
+ const media = discovery.listMedia();
81
+ expect(media.length).toBe(Object.keys(MEDIA).length);
82
+ expect(media).toContain(MEDIA[259]);
83
+ });
55
84
  describe('listPrinters', () => {
56
85
  it('returns known Brother QL devices from USB enumeration', async () => {
57
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x209d)]);
86
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d)]);
58
87
  const printers = await discovery.listPrinters();
59
88
  expect(printers).toHaveLength(1);
60
89
  expect(printers[0].device.name).toBe('QL-820NWBc');
61
90
  expect(printers[0].transport).toBe('usb');
62
- expect(printers[0].connectionId).toBe('1.2');
63
- });
64
- it('excludes unknown (non-Brother) USB devices', async () => {
65
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x1234, 0x5678)]);
66
- expect(await discovery.listPrinters()).toHaveLength(0);
91
+ expect(printers[0].connectionId).toBe('1:2');
92
+ expect(printers[0].host).toBeUndefined();
67
93
  });
68
- it('excludes Brother-VID devices with unknown PIDs', async () => {
69
- // Brother VID but not in the DEVICES registry and not a mass-storage PID
70
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x9999)]);
94
+ it('returns nothing when neither half finds a device', async () => {
71
95
  expect(await discovery.listPrinters()).toHaveLength(0);
72
- expect(warnSpy).not.toHaveBeenCalled();
73
96
  });
74
- it('excludes mass-storage PIDs and warns', async () => {
75
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x20aa)]);
97
+ it('omits a same-VID mass-storage device it is never enumerated', async () => {
98
+ // The Editor-Lite mass-storage PID is outside the registry, so the
99
+ // shared helper drops it like any unknown device: no entry, no warning.
100
+ expect(enumerated(0x04f9, 0x20aa)).toBeUndefined();
101
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x20aa)].filter(Boolean));
76
102
  expect(await discovery.listPrinters()).toHaveLength(0);
77
- expect(warnSpy).toHaveBeenCalledOnce();
78
103
  });
79
- it('reads the serial number when iSerialNumber is set', async () => {
80
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([
81
- makeUsbDevice(0x04f9, 0x209d, 'SN123'),
82
- ]);
104
+ it('surfaces the serial number reported by the helper', async () => {
105
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d, 'SN123')]);
83
106
  const [printer] = await discovery.listPrinters();
84
107
  expect(printer?.serialNumber).toBe('SN123');
85
108
  });
86
- it('swallows serial-read errors and leaves serialNumber undefined', async () => {
87
- const device = makeUsbDevice(0x04f9, 0x209d, 'ignored');
88
- device.getStringDescriptor.mockImplementation((_idx, cb) => {
89
- cb(new Error('descriptor read failed'));
90
- });
91
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([device]);
109
+ it('leaves serialNumber undefined when the helper reports none', async () => {
110
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d)]);
92
111
  const [printer] = await discovery.listPrinters();
93
112
  expect(printer?.serialNumber).toBeUndefined();
94
113
  });
114
+ it('lists network printers after USB ones, with host/port and serial', async () => {
115
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d, 'SN-USB')]);
116
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
117
+ const printers = await discovery.listPrinters();
118
+ expect(printers.map(p => p.transport)).toEqual(['usb', 'tcp']);
119
+ expect(printers[1]).toMatchObject({
120
+ device: DEVICES.QL_820NWBc,
121
+ serialNumber: 'M5G679125',
122
+ host: '192.168.1.67',
123
+ port: 9100,
124
+ connectionId: '192.168.1.67:9100',
125
+ });
126
+ expect(enumerateNetwork).toHaveBeenCalledWith(Object.values(DEVICES), {});
127
+ });
128
+ it('omits serialNumber on a network printer whose agent has none', async () => {
129
+ enumerateNetwork.mockResolvedValueOnce([networked('10.0.0.9', null)]);
130
+ const [printer] = await discovery.listPrinters();
131
+ expect(printer).not.toHaveProperty('serialNumber');
132
+ });
133
+ it('still lists network printers when the usb addon is missing', async () => {
134
+ enumerate.mockRejectedValueOnce(new Error("Cannot find package 'usb'"));
135
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
136
+ const printers = await discovery.listPrinters();
137
+ expect(printers).toHaveLength(1);
138
+ expect(printers[0].transport).toBe('tcp');
139
+ });
140
+ it('still lists USB printers when the network scan fails', async () => {
141
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d)]);
142
+ enumerateNetwork.mockRejectedValueOnce(new Error('EACCES'));
143
+ const printers = await discovery.listPrinters();
144
+ expect(printers).toHaveLength(1);
145
+ expect(printers[0].transport).toBe('usb');
146
+ });
147
+ it('rejects with the USB error when both halves fail', async () => {
148
+ enumerate.mockRejectedValueOnce(new Error("Cannot find package 'usb'"));
149
+ enumerateNetwork.mockRejectedValueOnce(new Error('EACCES'));
150
+ await expect(discovery.listPrinters()).rejects.toThrow("Cannot find package 'usb'");
151
+ });
152
+ it('skips the network scan with { network: false }', async () => {
153
+ const usbOnly = new BrotherQLDiscovery({ network: false });
154
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d)]);
155
+ expect(await usbOnly.listPrinters()).toHaveLength(1);
156
+ expect(enumerateNetwork).not.toHaveBeenCalled();
157
+ });
158
+ it('forwards the constructor community to the scan', async () => {
159
+ await new BrotherQLDiscovery({ community: 'office' }).listPrinters();
160
+ expect(enumerateNetwork).toHaveBeenCalledWith(Object.values(DEVICES), {
161
+ community: 'office',
162
+ });
163
+ });
95
164
  });
96
- describe('openPrinter', () => {
165
+ describe('openPrinter (USB)', () => {
97
166
  it('opens a USB printer via UsbTransport', async () => {
98
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x209d)]);
167
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d)]);
99
168
  usbOpen.mockResolvedValue(fakeTransport());
100
169
  const printer = await discovery.openPrinter();
101
170
  expect(printer.device.transports.usb?.pid).toBe('0x209d');
102
171
  expect(usbOpen).toHaveBeenCalledWith(0x04f9, 0x209d);
103
172
  });
104
173
  it('filters by VID/PID when multiple devices are attached', async () => {
105
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([
106
- makeUsbDevice(0x04f9, 0x209d),
107
- makeUsbDevice(0x04f9, 0x209b),
108
- ]);
174
+ enumerate.mockResolvedValueOnce([enumerated(0x04f9, 0x209d), enumerated(0x04f9, 0x209b)]);
109
175
  usbOpen.mockResolvedValue(fakeTransport());
110
176
  const printer = await discovery.openPrinter({ vid: 0x04f9, pid: 0x209b });
111
177
  expect(printer.device.transports.usb?.pid).toBe('0x209b');
112
178
  expect(usbOpen).toHaveBeenCalledWith(0x04f9, 0x209b);
113
179
  });
114
180
  it('filters by serialNumber when multiple devices share a PID', async () => {
115
- vi.mocked(usb.getDeviceList).mockReturnValueOnce([
116
- makeUsbDevice(0x04f9, 0x209d, 'SN-A'),
117
- makeUsbDevice(0x04f9, 0x209d, 'SN-TARGET'),
181
+ enumerate.mockResolvedValueOnce([
182
+ enumerated(0x04f9, 0x209d, 'SN-A'),
183
+ enumerated(0x04f9, 0x209d, 'SN-TARGET'),
118
184
  ]);
119
185
  usbOpen.mockResolvedValue(fakeTransport());
120
186
  const printer = await discovery.openPrinter({ serialNumber: 'SN-TARGET' });
121
187
  expect(printer.device.transports.usb?.pid).toBe('0x209d');
188
+ expect(enumerateNetwork).not.toHaveBeenCalled();
122
189
  });
123
- it('throws when no matching device is attached', async () => {
124
- await expect(discovery.openPrinter()).rejects.toThrow('No compatible Brother QL printer found.');
190
+ it('throws DeviceNotFoundError when no matching device is attached', async () => {
191
+ await expect(discovery.openPrinter()).rejects.toBeInstanceOf(DeviceNotFoundError);
192
+ expect(enumerateNetwork).not.toHaveBeenCalled();
125
193
  });
126
- it('opens a TCP printer when host is provided', async () => {
194
+ it('falls back to the network scan for a serial number USB does not have', async () => {
195
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
127
196
  tcpConnect.mockResolvedValue(fakeTransport());
128
- const printer = await discovery.openPrinter({ host: '192.168.1.100' });
197
+ const printer = await discovery.openPrinter({ serialNumber: 'M5G679125' });
129
198
  expect(printer.transportType).toBe('tcp');
130
- expect(tcpConnect).toHaveBeenCalledWith('192.168.1.100', undefined);
199
+ expect(printer.device).toBe(DEVICES.QL_820NWBc);
200
+ expect(tcpConnect).toHaveBeenCalledWith('192.168.1.67', 9100);
201
+ // The scan already identified the model: no second SNMP round trip.
202
+ expect(identify).not.toHaveBeenCalled();
203
+ });
204
+ it('throws DeviceNotFoundError when the serial is on neither transport', async () => {
205
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
206
+ await expect(discovery.openPrinter({ serialNumber: 'nope' })).rejects.toBeInstanceOf(DeviceNotFoundError);
207
+ });
208
+ it('does not scan the network for a serial with { network: false }', async () => {
209
+ const usbOnly = new BrotherQLDiscovery({ network: false });
210
+ await expect(usbOnly.openPrinter({ serialNumber: 'M5G679125' })).rejects.toBeInstanceOf(DeviceNotFoundError);
211
+ expect(enumerateNetwork).not.toHaveBeenCalled();
212
+ });
213
+ it('surfaces the usb addon error when USB is the only option', async () => {
214
+ enumerate.mockRejectedValueOnce(new Error("Cannot find package 'usb'"));
215
+ await expect(discovery.openPrinter()).rejects.toThrow("Cannot find package 'usb'");
131
216
  });
132
- it('passes port override to TcpTransport', async () => {
217
+ it('reaches a network printer by serial even when the usb addon is missing', async () => {
218
+ enumerate.mockRejectedValueOnce(new Error("Cannot find package 'usb'"));
219
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
133
220
  tcpConnect.mockResolvedValue(fakeTransport());
134
- await discovery.openPrinter({ host: '10.0.0.5', port: 9101 });
221
+ const printer = await discovery.openPrinter({ serialNumber: 'M5G679125' });
222
+ expect(printer.transportType).toBe('tcp');
223
+ });
224
+ });
225
+ describe('openPrinter (TCP)', () => {
226
+ it('identifies the model over SNMP, then connects', async () => {
227
+ identify.mockResolvedValueOnce(networked());
228
+ tcpConnect.mockResolvedValue(fakeTransport());
229
+ const printer = await discovery.openPrinter({ host: '192.168.1.67' });
230
+ expect(printer.transportType).toBe('tcp');
231
+ expect(printer.device).toBe(DEVICES.QL_820NWBc);
232
+ expect(identify).toHaveBeenCalledWith('192.168.1.67', Object.values(DEVICES), {});
233
+ expect(identify.mock.invocationCallOrder[0]).toBeLessThan(tcpConnect.mock.invocationCallOrder[0]);
234
+ expect(tcpConnect).toHaveBeenCalledWith('192.168.1.67', undefined);
235
+ });
236
+ it('passes port and community through', async () => {
237
+ identify.mockResolvedValueOnce(networked('10.0.0.5'));
238
+ tcpConnect.mockResolvedValue(fakeTransport());
239
+ await discovery.openPrinter({ host: '10.0.0.5', port: 9101, snmpCommunity: 'office' });
240
+ expect(identify).toHaveBeenCalledWith('10.0.0.5', Object.values(DEVICES), {
241
+ community: 'office',
242
+ });
135
243
  expect(tcpConnect).toHaveBeenCalledWith('10.0.0.5', 9101);
136
244
  });
137
- it('opens a serial printer when path is provided', async () => {
245
+ it('uses the discovery community for identify and the status side channel', async () => {
246
+ identify.mockResolvedValueOnce(networked());
247
+ tcpConnect.mockResolvedValue(fakeTransport());
248
+ const office = new BrotherQLDiscovery({ community: 'office' });
249
+ const printer = await office.openPrinter({ host: '192.168.1.67' });
250
+ expect(identify).toHaveBeenCalledWith('192.168.1.67', Object.values(DEVICES), {
251
+ community: 'office',
252
+ });
253
+ await expect(printer.getStatus()).resolves.toBeDefined();
254
+ expect(snmpGet).toHaveBeenCalledWith('192.168.1.67', expect.any(Array), {
255
+ community: 'office',
256
+ });
257
+ });
258
+ it('per-call snmpCommunity wins over the discovery community', async () => {
259
+ identify.mockResolvedValueOnce(networked());
260
+ tcpConnect.mockResolvedValue(fakeTransport());
261
+ const office = new BrotherQLDiscovery({ community: 'office' });
262
+ const printer = await office.openPrinter({ host: '192.168.1.67', snmpCommunity: 'lab' });
263
+ expect(identify).toHaveBeenCalledWith('192.168.1.67', Object.values(DEVICES), {
264
+ community: 'lab',
265
+ });
266
+ await expect(printer.getStatus()).resolves.toBeDefined();
267
+ expect(snmpGet).toHaveBeenCalledWith('192.168.1.67', expect.any(Array), {
268
+ community: 'lab',
269
+ });
270
+ });
271
+ it('carries the discovery community into a serial-number network re-open', async () => {
272
+ enumerateNetwork.mockResolvedValueOnce([networked()]);
273
+ tcpConnect.mockResolvedValue(fakeTransport());
274
+ const office = new BrotherQLDiscovery({ community: 'office' });
275
+ const printer = await office.openPrinter({ serialNumber: 'M5G679125' });
276
+ expect(enumerateNetwork).toHaveBeenCalledWith(Object.values(DEVICES), {
277
+ community: 'office',
278
+ });
279
+ await expect(printer.getStatus()).resolves.toBeDefined();
280
+ expect(snmpGet).toHaveBeenCalledWith('192.168.1.67', expect.any(Array), {
281
+ community: 'office',
282
+ });
283
+ });
284
+ it('deviceKey wins: no SNMP, that descriptor', async () => {
285
+ tcpConnect.mockResolvedValue(fakeTransport());
286
+ const printer = await discovery.openPrinter({ host: '192.168.1.67', deviceKey: 'PT_E550W' });
287
+ expect(printer.device).toBe(DEVICES.PT_E550W);
288
+ expect(identify).not.toHaveBeenCalled();
289
+ expect(tcpConnect).toHaveBeenCalledWith('192.168.1.67', undefined);
290
+ });
291
+ it('rejects an unknown deviceKey before connecting', async () => {
292
+ await expect(discovery.openPrinter({ host: '192.168.1.67', deviceKey: 'QL_9999' })).rejects.toThrow(/Unknown deviceKey "QL_9999".*TCP-capable Brother QL keys: .*QL_820NWBc/);
293
+ expect(tcpConnect).not.toHaveBeenCalled();
294
+ });
295
+ it('rejects a deviceKey without a TCP transport before connecting', async () => {
296
+ await expect(discovery.openPrinter({ host: '192.168.1.67', deviceKey: 'QL_700' })).rejects.toThrow(/QL_700 has no tcp transport/);
297
+ expect(tcpConnect).not.toHaveBeenCalled();
298
+ });
299
+ it('throws DeviceIdentificationRequiredError naming the model when SNMP answers with a stranger', async () => {
300
+ snmpGet.mockResolvedValueOnce({
301
+ [PRINTER_MIB.hrDeviceDescr]: {
302
+ type: 'string',
303
+ value: 'DYMO LabelWriter 550',
304
+ raw: new Uint8Array(),
305
+ },
306
+ });
307
+ const err = await discovery.openPrinter({ host: '192.168.1.80' }).catch((e) => e);
308
+ expect(err).toBeInstanceOf(DeviceIdentificationRequiredError);
309
+ const typed = err;
310
+ expect(typed.message).toMatch(/192\.168\.1\.80 reports "DYMO LabelWriter 550", which is not in the brother-ql registry/);
311
+ expect(typed.message).toMatch(/Pass deviceKey, one of: .*PT_E550W.*QL_820NWBc/);
312
+ // The CLI decides whether to suggest --media by sniffing the
313
+ // message; a stranger on SNMP still has readable status.
314
+ expect(typed.message).not.toMatch(/no SNMP answer|status is unavailable/i);
315
+ expect(typed.candidates.every(c => c.transports.tcp !== undefined)).toBe(true);
316
+ expect(typed.candidates.map(c => c.key)).toContain('QL_820NWBc');
317
+ expect(tcpConnect).not.toHaveBeenCalled();
318
+ });
319
+ it('names "a model" when the follow-up model read fails too', async () => {
320
+ snmpGet.mockRejectedValueOnce(new Error('gone'));
321
+ await expect(discovery.openPrinter({ host: '192.168.1.80' })).rejects.toThrow(/192\.168\.1\.80 reports a model, which is not/);
322
+ });
323
+ it('throws DeviceIdentificationRequiredError saying SNMP did not answer', async () => {
324
+ identify.mockRejectedValueOnce(new TransportTimeoutError('tcp', 2000));
325
+ const err = await discovery.openPrinter({ host: '192.168.1.80' }).catch((e) => e);
326
+ expect(err).toBeInstanceOf(DeviceIdentificationRequiredError);
327
+ expect(err.message).toMatch(/No SNMP answer from 192\.168\.1\.80 \(Read timed out after 2000ms\).*status is unavailable, so pass media too/);
328
+ // Pinned: thermal-label-cli matches /no SNMP answer|status is unavailable/i
329
+ // on this message to add `--media <id>` to its hint.
330
+ expect(err.message).toMatch(/no SNMP answer/i);
331
+ expect(err.message).toMatch(/status is unavailable/);
332
+ expect(snmpGet).not.toHaveBeenCalled();
333
+ expect(tcpConnect).not.toHaveBeenCalled();
334
+ });
335
+ it('continueWith(deviceKey) opens with that key and returns an adapter map', async () => {
336
+ identify.mockRejectedValueOnce(new Error('no answer'));
337
+ tcpConnect.mockResolvedValue(fakeTransport());
338
+ const err = (await discovery
339
+ .openPrinter({ host: '192.168.1.80', port: 9101 })
340
+ .catch((e) => e));
341
+ const printers = await err.continueWith('QL_820NWBc');
342
+ expect(Object.keys(printers)).toEqual(['primary']);
343
+ expect(printers.primary.device.key).toBe('QL_820NWBc');
344
+ expect(identify).toHaveBeenCalledTimes(1);
345
+ expect(tcpConnect).toHaveBeenCalledWith('192.168.1.80', 9101);
346
+ });
347
+ });
348
+ describe('openPrinter (serial)', () => {
349
+ it('opens a serial printer with serialPath + deviceKey', async () => {
138
350
  serialOpen.mockResolvedValue(fakeTransport());
139
- const printer = await discovery.openPrinter({ path: '/dev/rfcomm0' });
351
+ const printer = await discovery.openPrinter({
352
+ serialPath: '/dev/rfcomm0',
353
+ deviceKey: 'QL_820NWBc',
354
+ });
140
355
  expect(printer.transportType).toBe('serial');
356
+ expect(printer.device).toBe(DEVICES.QL_820NWBc);
141
357
  expect(serialOpen).toHaveBeenCalledWith('/dev/rfcomm0', undefined);
142
358
  });
143
- it('forwards baudRate to SerialTransport', async () => {
359
+ it('still accepts the deprecated path alias and forwards baudRate', async () => {
144
360
  serialOpen.mockResolvedValue(fakeTransport());
145
- await discovery.openPrinter({ path: 'COM3', baudRate: 115200 });
361
+ await discovery.openPrinter({ path: 'COM3', baudRate: 115200, deviceKey: 'PT_P910BT' });
146
362
  expect(serialOpen).toHaveBeenCalledWith('COM3', 115200);
147
363
  });
364
+ it('throws DeviceIdentificationRequiredError without deviceKey, before opening the port', async () => {
365
+ const err = await discovery
366
+ .openPrinter({ serialPath: '/dev/rfcomm0' })
367
+ .catch((e) => e);
368
+ expect(err).toBeInstanceOf(DeviceIdentificationRequiredError);
369
+ const typed = err;
370
+ expect(typed.message).toMatch(/Serial port \/dev\/rfcomm0 carries no model signal/);
371
+ expect(typed.candidates.map(c => c.key).sort()).toEqual(['PT_P910BT', 'QL_820NWBc']);
372
+ expect(serialOpen).not.toHaveBeenCalled();
373
+ serialOpen.mockResolvedValue(fakeTransport());
374
+ const printers = await typed.continueWith('QL_820NWBc');
375
+ expect(printers.primary.transportType).toBe('serial');
376
+ });
377
+ it('rejects a deviceKey without a serial transport', async () => {
378
+ await expect(discovery.openPrinter({ serialPath: '/dev/rfcomm0', deviceKey: 'QL_700' })).rejects.toThrow(/QL_700 has no serial transport.*Serial-capable keys: PT_P910BT, QL_820NWBc/);
379
+ expect(serialOpen).not.toHaveBeenCalled();
380
+ });
148
381
  });
149
382
  });
150
383
  //# sourceMappingURL=discovery.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=printer-network.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printer-network.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/printer-network.test.ts"],"names":[],"mappings":""}