import React, { act } from 'react';
import { createRoot } from 'react-dom/client';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges';
function render(element: React.ReactElement): HTMLDivElement {
const host = document.createElement('div');
document.body.appendChild(host);
const root = createRoot(host);
act(() => {
root.render(element);
});
return host;
}
describe('ProviderModelBadges', () => {
beforeEach(() => {
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true);
});
afterEach(() => {
document.body.innerHTML = '';
});
it('does not render stale availability chips for OpenCode models', () => {
const host = render(
);
expect(host.textContent).toContain('gpt-oss');
expect(host.textContent).not.toContain('Check failed');
});
it('keeps availability chips for providers that still support explicit badge checks', () => {
const host = render(
);
expect(host.textContent).toContain('Check failed');
});
it('collapses long model lists and expands them into a bounded scroll area', () => {
const models = Array.from(
{ length: 18 },
(_, index) => `model-${String(index + 1).padStart(2, '0')}`
);
const host = render(
);
expect(host.textContent).toContain('model-15');
expect(host.textContent).not.toContain('model-16');
expect(host.textContent).toContain('+3 more');
const moreButton = Array.from(host.querySelectorAll('button')).find((button) =>
button.textContent?.includes('+3 more')
);
expect(moreButton).toBeTruthy();
act(() => {
moreButton?.click();
});
expect(host.textContent).toContain('model-18');
expect(host.textContent).toContain('Hide');
const list = host.firstElementChild?.firstElementChild as HTMLElement | null;
expect(list?.style.maxHeight).toBe('200px');
expect(list?.style.overflowY).toBe('auto');
const hideButton = Array.from(host.querySelectorAll('button')).find((button) =>
button.textContent?.includes('Hide')
);
expect(hideButton).toBeTruthy();
act(() => {
hideButton?.click();
});
expect(host.textContent).not.toContain('model-16');
expect(host.textContent).toContain('+3 more');
});
});