open-design/apps/web/tests/components/NewProjectPanel.media.test.tsx
이용진 aeb6cde923
prevent duplicate saves and add template deletion (#1294)
* prevent duplicate template entries on repeated save

* add delete button to saved template list

Templates can now be removed from the template picker via a hover x button, calling the existing DELETE /api/templates/:id endpoint.

* add missing onDeleteTemplate prop in test fixtures

* add template deletion flow test for NewProjectPanel

* reject template names longer than 100 characters

* preserve original createdAt on template update
2026-05-12 15:48:04 +08:00

53 lines
1.6 KiB
TypeScript

// @vitest-environment jsdom
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { NewProjectPanel } from '../../src/components/NewProjectPanel';
describe('NewProjectPanel media provider badges', () => {
beforeEach(() => {
vi.stubGlobal('ResizeObserver', class {
observe() {}
disconnect() {}
unobserve() {}
});
Element.prototype.scrollIntoView = vi.fn();
});
afterEach(() => {
cleanup();
vi.unstubAllGlobals();
});
it('treats daemon-restored apiKeyConfigured providers as configured', () => {
render(
<NewProjectPanel
skills={[]}
designSystems={[]}
defaultDesignSystemId={null}
templates={[]}
onDeleteTemplate={vi.fn()}
promptTemplates={[]}
onCreate={vi.fn()}
mediaProviders={{
openai: {
apiKey: '',
apiKeyConfigured: true,
apiKeyTail: '1234',
baseUrl: '',
},
}}
/>,
);
fireEvent.click(screen.getByRole('tab', { name: 'Media' }));
fireEvent.click(screen.getByRole('tab', { name: 'Image' }));
// Model picker is now a combobox — open the popover so the
// provider group + status badge become visible in the DOM.
fireEvent.click(screen.getByTestId('model-picker-trigger'));
const openaiGroup = screen.getByText('OpenAI').closest('.ds-picker-group');
expect(openaiGroup?.textContent).toContain('Configured');
expect(openaiGroup?.textContent).not.toContain('Integrated');
});
});