fix: Clear stale media unavailable errors when a camera recovers (#2627)

- Closes: #2576
This commit is contained in:
Dermot Duffy
2026-07-28 21:21:50 -07:00
committed by GitHub
parent 231e3087b7
commit 15b08db3e8
49 changed files with 1128 additions and 229 deletions
@@ -265,6 +265,45 @@ describe('IssueManager', () => {
});
});
describe('resolve', () => {
it('should resolve the issue and update the card once it clears', () => {
const api = createCardAPI();
const manager = new IssueManager(api);
const issue = createIssue('media_unavailable', {
hasIssue: vi.fn().mockReturnValue(true),
getIssue: vi.fn().mockReturnValue(createIssueDescription()),
resolve: vi.fn(),
});
manager.addIssue(issue);
// Establish the issue as present, then let resolving remove it.
manager.evaluate();
vi.mocked(api.getCardElementManager().update).mockClear();
vi.mocked(issue.getIssue).mockReturnValue(null);
manager.resolve('media_unavailable', { targetID: 'camera-1' });
expect(issue.resolve).toHaveBeenCalledWith({ targetID: 'camera-1' });
expect(api.getCardElementManager().update).toHaveBeenCalled();
});
it('should stop retrying once resolve removes the last retryable problem', () => {
const { manager, issue } = createRetriableSetup();
assert(issue.resolve);
assert(issue.needsRetry);
// Arm the retry timer while the problem is unresolved.
manager.evaluate();
vi.mocked(issue.needsRetry).mockReturnValue(false);
manager.resolve('media_unavailable', { targetID: 'camera-1' });
vi.advanceTimersByTime(DEFAULT_RETRY_SECONDS * 1000 * 10);
expect(issue.retry).not.toHaveBeenCalled();
});
});
describe('retry', () => {
it('should call retry on the manager and reset the timer', () => {
const { manager, issue } = createRetriableSetup();