<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs.git/tests/test-integration-recording-device-workflow.el, branch v0.7.2</title>
<subtitle>my Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/'/>
<updated>2026-02-03T14:51:47+00:00</updated>
<entry>
<title>fix(video-recording): use generic 'Built-in Audio' label</title>
<updated>2026-02-03T14:51:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-03T14:51:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=35e5c10b64d7e842ee84d81c7b496cc3202091e8'/>
<id>urn:sha1:35e5c10b64d7e842ee84d81c7b496cc3202091e8</id>
<content type='text'>
Renamed 'Built-in Laptop Audio' to 'Built-in Audio' since PCI audio
devices are used on both laptops and desktops.
</content>
</entry>
<entry>
<title>Revert "checking in modified/removed tests and other misc changes"</title>
<updated>2025-11-14T08:35:00+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-14T08:35:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=0febc3bb65462fd95a75387c2ec97ffa374efc00'/>
<id>urn:sha1:0febc3bb65462fd95a75387c2ec97ffa374efc00</id>
<content type='text'>
This reverts commit 9d55ed149e100b4fb3ef6f5a79d263dcb26ce835.
</content>
</entry>
<entry>
<title>checking in modified/removed tests and other misc changes</title>
<updated>2025-11-14T08:31:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-14T08:31:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=9d55ed149e100b4fb3ef6f5a79d263dcb26ce835'/>
<id>urn:sha1:9d55ed149e100b4fb3ef6f5a79d263dcb26ce835</id>
<content type='text'>
</content>
</entry>
<entry>
<title>test: Add comprehensive test suite for video-audio-recording module</title>
<updated>2025-11-03T21:26:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-03T21:26:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=0a69c5854378afcafc567d965f206cf6a0a984be'/>
<id>urn:sha1:0a69c5854378afcafc567d965f206cf6a0a984be</id>
<content type='text'>
Added 83 test cases across 9 test files with 100% pass rate, covering
device detection, parsing, grouping, and complete workflow integration.

## What Was Done

### Refactoring for Testability
- Extracted `cj/recording--parse-pactl-output` from `cj/recording-parse-sources`
- Separated parsing logic from shell command execution
- Enables testing with fixture data instead of live system calls

### Test Fixtures Created
- `pactl-output-normal.txt` - All device types (built-in, USB, Bluetooth)
- `pactl-output-empty.txt` - Empty output
- `pactl-output-single.txt` - Single device
- `pactl-output-monitors-only.txt` - Only monitor devices
- `pactl-output-inputs-only.txt` - Only input devices
- `pactl-output-malformed.txt` - Invalid/malformed output

### Unit Tests (8 files, 78 test cases)
1. **test-video-audio-recording-friendly-state.el** (10 tests)
   - State name conversion: SUSPENDED→Ready, RUNNING→Active

2. **test-video-audio-recording-parse-pactl-output.el** (14 tests)
   - Parse raw pactl output into structured data
   - Handle empty, malformed, and mixed valid/invalid input

3. **test-video-audio-recording-parse-sources.el** (6 tests)
   - Shell command wrapper testing with mocked output

4. **test-video-audio-recording-detect-mic-device.el** (13 tests)
   - Documents bugs: Returns ID numbers instead of device names
   - Doesn't filter monitors (legacy function, not actively used)

5. **test-video-audio-recording-detect-system-device.el** (13 tests)
   - Works correctly: Returns full device names
   - Tests monitor detection with various device types

6. **test-video-audio-recording-group-devices-by-hardware.el** (12 tests)
   - CRITICAL: Bluetooth MAC address normalization (colons vs underscores)
   - Device pairing logic (mic + monitor from same hardware)
   - Friendly name assignment
   - Filters incomplete devices

7. **test-video-audio-recording-check-ffmpeg.el** (3 tests)
   - ffmpeg availability detection

8. **test-video-audio-recording-get-devices.el** (7 tests)
   - Auto-detection fallback logic
   - Error handling for incomplete detection

### Integration Tests (1 file, 5 test cases)
9. **test-integration-recording-device-workflow.el** (5 tests)
   - Complete workflow: parse → group → friendly names
   - Bluetooth MAC normalization end-to-end
   - Incomplete device filtering across components
   - Malformed data graceful handling

## Key Testing Insights

### Bugs Documented
- `cj/recording-detect-mic-device` has bugs (returns IDs, doesn't filter monitors)
- These functions appear to be legacy code not used by main workflow
- Tests document current behavior to catch regressions if fixed

### Critical Features Validated
- **Bluetooth MAC normalization**: Input uses colons (00:1B:66:C0:91:6D),
  output uses underscores (00_1B_66_C0_91_6D), grouping normalizes correctly
- **Device pairing**: Only devices with BOTH mic and monitor are included
- **Friendly names**: USB/PCI/Bluetooth patterns correctly identified

### Test Coverage
- Normal cases: Valid inputs, typical workflows
- Boundary cases: Empty, single device, incomplete pairs
- Error cases: Malformed input, missing devices, partial detection

## Test Execution
All tests pass: 9/9 files, 83/83 test cases (100% pass rate)

```bash
make test-file FILE=test-video-audio-recording-*.el
# All pass individually

# Integration test also passes
make test-file FILE=test-integration-recording-device-workflow.el
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
